{"id":228092,"date":"2022-10-15T10:39:00","date_gmt":"2022-10-15T07:39:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228092"},"modified":"2022-11-09T00:40:40","modified_gmt":"2022-11-08T21:40:40","slug":"skapa-en-virtuell-fil-i-wordpress-med-stoed-foer-wordpress-multisite","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/skapa-en-virtuell-fil-i-wordpress-med-stoed-foer-wordpress-multisite\/","title":{"rendered":"Skapa en virtuell fil i WordPress med st\u00f6d f\u00f6r WordPress Multisite"},"content":{"rendered":"\n<p>Nyligen arbetade jag p\u00e5 en WordPress Multisite-instans, och jag beh\u00f6vde varje webbplats (flerspr\u00e5kig i det h\u00e4r fallet) ha sin egen unika dynamiskt genererade webbplatskarta. Jag skapade dessa webbplatskartor genom att skapa <strong>virtuella filer<\/strong> i WordPress.<\/p>\n<p>Den h\u00e4r artikeln visar hur du skapar en virtuell fil och sedan hur du s\u00e4kerst\u00e4ller att den virtuella filen inte \u00e4r tillg\u00e4nglig via varje webbplats i din WordPress Multisite-instans.<\/p>\n<h2>St\u00e4lla in regler f\u00f6r omskrivning<\/h2>\n<p>F\u00f6r att skapa en virtuell fil \u00e4r det f\u00f6rsta vi beh\u00f6ver g\u00f6ra att skapa n\u00e5gra omskrivningsregler, s\u00e5 att WordPress vet vad de ska g\u00f6ra med den virtuella URL d\u00e4r vi vill att v\u00e5r fil ska visas.<\/p>\n<p>F\u00f6ljande exempel skapar tv\u00e5 webbadresser f\u00f6r webbplatskartor sitemap.xml och sitemap-fr.xml.<\/p>\n<pre><code>function wholesomecode_sitemap_rewrites() {\n    global $wp;\n    $wp-&gt;add_query_var( 'map' );\n\n    add_rewrite_rule( 'sitemap.xml$', 'index.php?map=sitemap', 'top' );\n    add_rewrite_rule( '^sitemap-fr.xml$', 'index.php?map=sitemap-fr', 'top' );\n}\nadd_action( 'init', 'wholesomecode_sitemap_rewrites', 99 );\n<\/code><\/pre>\n<p>Notera hur vi l\u00e4gger till en fr\u00e5gevariabel av &quot;karta&quot; och sedan mappar vi namnet p\u00e5 v\u00e5r webbplatskarta till den h\u00e4r fr\u00e5gan.<\/p>\n<h2>F\u00f6rhindra kanoniska omdirigeringar<\/h2>\n<p>Ibland om du har kanoniska omdirigeringar aktiverade (s\u00e4g genom ett plugin som Yoast SEO) kommer WordPress att f\u00f6rs\u00f6ka l\u00e4gga till ett snedstreck i slutet av din URL. Vi kan f\u00f6rhindra detta genom att anv\u00e4nda denna funktion.<\/p>\n<pre><code>function wholesomecode_prevent_slash_on_map_variable( $redirect) {\n    if (get_query_var( 'map')) {\n        return false;\n    }\n    return $redirect;\n}\nadd_filter( 'redirect_canonical', 'wholesomecode_prevent_slash_on_map_variable' );\n<\/code><\/pre>\n<h2>Skapar det virtuella filinneh\u00e5llet<\/h2>\n<p>Nu \u00e4ntligen m\u00e5ste vi st\u00e4lla in de virtuella filerna sj\u00e4lva. F\u00f6r att g\u00f6ra detta kan vi haka i <code>template_include<\/code>kroken. H\u00e4r \u00e4r en mycket f\u00f6renklad version av hur v\u00e5ra webbplatskartor skulle kunna se ut.<\/p>\n<p>Notera hur vi anv\u00e4nder kartvariabeln f\u00f6r att best\u00e4mma vilken virtuell fil vi vill visa.<\/p>\n<pre><code>function wholesomecode_sitemap_contents( $template) {\n    $map = get_query_var( 'map' );\n    if (! empty( $map)) {\n        header( 'Content-type: text\/xml' );\n        if ('sitemap' === $map) {\n            ?&gt;\n            &lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n            &lt;sitemapindex xmlns=\"http:\/\/www.sitemaps.org\/schemas\/sitemap\/0.9\"&gt;\n                &lt;sitemap&gt;\n                    &lt;loc&gt;https:\n                &lt;\/sitemap&gt;\n            &lt;\/sitemapindex&gt;\n            &lt;?php\n        } elseif ('sitemap-fr' === $map) {\n            ?&gt;\n            &lt;sitemapindex xmlns=\"http:\/\/www.sitemaps.org\/schemas\/sitemap\/0.9\"&gt;\n                &lt;sitemap&gt;\n                    &lt;loc&gt;https:\n                &lt;\/sitemap&gt;\n            &lt;\/sitemapindex&gt;\n            &lt;?php\n        }\n        die();\n    }\n    return $template;\n}\nadd_action( 'template_include', 'wholesomecode_sitemap_contents' );\n<\/code><\/pre>\n<h3>Bonus: Inkludera statiska filer i din virtuella URL<\/h3>\n<p>Exemplet ovan var v\u00e4ldigt enkelt, men du kan mappa statiska filer till dessa virtuella webbadresser genom att dra in inneh\u00e5llet i dem i filen. H\u00e4r anv\u00e4nder vi till exempel webbplatskartor i rotkatalogen &#8217;kartor&#8217; och inkluderar dem dynamiskt baserat p\u00e5 kartvariabeln.<\/p>\n<pre><code>function wholesomecode_sitemap_from_file( $template) {\n    $map = get_query_var( 'map' );\n    if (! empty( $map)) {\n        if (! function_exists( 'get_home_path')) {\n            include_once ABSPATH. '\/wp-admin\/includes\/file.php';\n        }\n        header( 'Content-type: text\/xml' );\n        include get_home_path(). 'maps\/'. $map. '.xml';\n        die;\n    }\n    return $template;\n}\nadd_action( 'template_include', 'wholesomecode_sitemap_from_file' );\n<\/code><\/pre>\n<h2>Spola omskrivningsregler<\/h2>\n<p>Det sista du beh\u00f6ver g\u00f6ra innan du ser dina virtuella filer \u00e4r att spola omskrivningsreglerna. Om du har klistrat in ovanst\u00e5ende anvisningar i <code>functions.php<\/code>det b\u00e4sta tillv\u00e4gag\u00e5ngss\u00e4ttet \u00e4r att g\u00e5 till <code>Settings &gt; Permalinks<\/code>i din WordPress-instrumentpanel och spara dina permal\u00e4nkar igen. Men om du bygger ett plugin kan du koppla in aktiveringskroken s\u00e5 att de automatiskt sl\u00e5r in n\u00e4r du aktiverar din plugin:<\/p>\n<pre><code>register_activation_hook( __FILE__, 'flush_rewrite_rules' );\n<\/code><\/pre>\n<p>Du kan <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/flush_rewrite_rules\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l\u00e4sa mer om spolningsregler i WordPress Codex<\/a> f\u00f6r andra metoder som kan vara relevanta f\u00f6r ditt scenario.<\/p>\n<p>V\u00e5r franska webbplatskarta<\/p>\n<p>Det h\u00e4r fungerar utm\u00e4rkt! De virtuella filerna skapas inga problem, men om jag sedan bes\u00f6kte den franska versionen av webbplatsen och letade efter webbplatskartan (t.ex.: <a href=\"https:\/\/mattwatson.codes\/fr\/sitemap.xml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">mattwatson.codes\/fr\/sitemap.xml<\/a>) skulle jag kunna se den engelska versionen av webbplatskartan. Inte idealiskt.<\/p>\n<h2>Unika virtuella filer i WordPress Multisite<\/h2>\n<p>L\u00f6sningen f\u00f6r att f\u00f6rhindra virtuella filer i dina andra WordPress Multisite-instanser \u00e4r ganska enkelt egentligen. Allt du beh\u00f6ver g\u00f6ra n\u00e4r du st\u00e4ller in dina omskrivningar \u00e4r att kontrollera att webbplatsen du f\u00f6r n\u00e4rvarande tittar p\u00e5 \u00e4r den du vill att den virtuella filen ska visas p\u00e5.<\/p>\n<pre><code>function wholesomecode_sitemap_rewrites() {\n    global $wp;\n    $wp-&gt;add_query_var( 'map' );\n\n    if (get_current_blog_id() == '1') {\n        add_rewrite_rule( 'sitemap.xml$', 'index.php?map=sitemap', 'top' );\n    }\n\n    if (get_current_blog_id() === get_id_from_blogname( 'fr')) {\n        add_rewrite_rule( '^sitemap-fr.xml$', 'index.php?map=sitemap-fr', 'top' );\n    }\n}\nadd_action( 'init', 'wholesomecode_sitemap_rewrites', 99 );\n<\/code><\/pre>\n<p>Om du har WordPress Multisite avst\u00e4ngd kommer ovanst\u00e5ende funktion att g\u00e5 s\u00f6nder, s\u00e5 du kanske vill kontrollera att <code>get_current_blog_id<\/code>funktionen finns innan du f\u00f6rs\u00f6ker anv\u00e4nda den.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/wholesomecode.ltd\" class=\"external external_icon\">wholesomecode.ltd<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nyligen arbetade jag p\u00e5 en WordPress Multisite-instans, och jag beh\u00f6vde varje webbplats (flerspr\u00e5kig i det h\u00e4r fallet) ha sin egen unika dynamiskt genererade webbplatskarta. Jag skapade&#8230;<\/p>\n","protected":false},"author":1,"featured_media":223984,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[848,807,724],"tags":[1173],"class_list":["post-228092","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-handledningar","category-php-9","category-utvecklaren","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228092","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=228092"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228092\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/223984"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=228092"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=228092"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=228092"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}