{"id":228969,"date":"2022-10-15T10:53:00","date_gmt":"2022-10-15T07:53:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228969"},"modified":"2022-11-09T05:00:05","modified_gmt":"2022-11-09T02:00:05","slug":"crea-un-file-virtuale-in-wordpress-con-il-supporto-per-wordpress-multisite","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/crea-un-file-virtuale-in-wordpress-con-il-supporto-per-wordpress-multisite\/","title":{"rendered":"Crea un file virtuale in WordPress con il supporto per WordPress Multisite"},"content":{"rendered":"\n<p>Recentemente stavo lavorando su un&#8217;istanza multisito di WordPress e avevo bisogno che ogni sito (in questo caso multilingue) avesse la propria mappa del sito generata dinamicamente. Ho generato queste mappe del sito creando <strong>file virtuali<\/strong> all&#8217;interno di WordPress.<\/p>\n<p>Questo articolo mostra come creare un file virtuale e quindi come garantire che quel file virtuale non sia accessibile attraverso tutti i siti nell&#8217;istanza multisito di WordPress.<\/p>\n<h2>Impostazione delle regole di riscrittura<\/h2>\n<p>Per creare un file virtuale, la prima cosa che dobbiamo fare \u00e8 creare alcune regole di riscrittura, in modo che WordPress sappia cosa fare con l&#8217;URL virtuale in cui vogliamo che appaia il nostro file.<\/p>\n<p>L&#8217;esempio seguente crea due URL della mappa del sito sitemap.xml e 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>Nota come aggiungiamo una variabile di query di &#8216;mappa&#8217; e quindi mappiamo il nome della nostra mappa del sito a questa query.<\/p>\n<h2>Impedisci reindirizzamenti canonici<\/h2>\n<p>A volte, se hai i reindirizzamenti canonici abilitati (ad esempio tramite un plug-in come Yoast SEO), WordPress tenter\u00e0 di aggiungere una barra alla fine del tuo URL. Possiamo prevenirlo usando questa funzione.<\/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>Creazione del contenuto del file virtuale<\/h2>\n<p>Ora, finalmente, dobbiamo configurare i file virtuali stessi. Per fare questo possiamo agganciarci al <code>template_include<\/code>gancio. Ecco una versione molto semplificata di come potrebbero apparire le nostre mappe del sito.<\/p>\n<p>Nota come utilizziamo la variabile map per determinare quale file virtuale desideriamo visualizzare.<\/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: includi file statici nel tuo URL virtuale<\/h3>\n<p>L&#8217;esempio sopra era molto semplice, ma puoi mappare i file statici in questi URL virtuali estraendo il loro contenuto nel file. Ad esempio, qui stiamo usando le mappe del sito nella directory principale &#8216;mappe&#8217; e includendole dinamicamente in base alla variabile della mappa.<\/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>Regole di riscrittura del lavaggio<\/h2>\n<p>L&#8217;ultima cosa che devi fare, prima di vedere i tuoi file virtuali, \u00e8 svuotare le regole di riscrittura. Se hai incollato la direzione di cui sopra nella <code>functions.php<\/code>migliore linea d&#8217;azione \u00e8 andare <code>Settings &gt; Permalinks<\/code>nella dashboard di WordPress e salvare nuovamente i tuoi permalink. Ma se stai creando un plug-in, puoi collegarti all&#8217;hook di attivazione in modo che si attivino automaticamente quando attivi il tuo plug-in:<\/p>\n<pre><code>register_activation_hook( __FILE__, 'flush_rewrite_rules' );\n<\/code><\/pre>\n<p>Puoi <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/flush_rewrite_rules\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">leggere di pi\u00f9 sulle regole di svuotamento nel Codice di WordPress<\/a> per altri metodi che potrebbero essere rilevanti per il tuo scenario.<\/p>\n<p>La nostra mappa del sito francese<\/p>\n<p>Questo funziona alla grande! I file virtuali vengono creati senza problemi, ma se poi visitassi la versione francese del sito e cercassi la mappa del sito (es: <a href=\"https:\/\/mattwatson.codes\/fr\/sitemap.xml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">mattwatson.codes\/fr\/sitemap.xml<\/a>) potrei vedere la versione inglese della mappa del sito. Non \u00e8 l&#8217;ideale.<\/p>\n<h2>File virtuali unici nel multisito di WordPress<\/h2>\n<p>La soluzione per prevenire i file virtuali nelle altre istanze multisito di WordPress \u00e8 davvero molto semplice. Tutto quello che devi fare quando imposti le tue riscritture, \u00e8 controllare che il sito che stai attualmente visualizzando sia quello in cui vuoi che appaia il file virtuale.<\/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>Se hai WordPress Multisite disattivato, la funzione di cui sopra si interromper\u00e0, quindi potresti voler verificare che la <code>get_current_blog_id<\/code>funzione esista prima di provare a usarla.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/wholesomecode.ltd\" class=\"external external_icon\">wholesomecode.ltd<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Recentemente stavo lavorando su un&#8217;istanza multisito di WordPress e avevo bisogno che ogni sito (in questo caso multilingue) avesse la propria mappa del sito generata dinamicamente. ho generato&#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":[804,720,844],"tags":[1168],"class_list":["post-228969","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php-6","category-sviluppatore","category-tutorial","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/228969","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=228969"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/228969\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/223984"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=228969"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=228969"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=228969"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}