{"id":228596,"date":"2022-10-15T10:40:00","date_gmt":"2022-10-15T07:40:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228596"},"modified":"2022-11-09T03:10:58","modified_gmt":"2022-11-09T00:10:58","slug":"crie-um-arquivo-virtual-no-wordpress-com-suporte-para-wordpress-multisite","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/crie-um-arquivo-virtual-no-wordpress-com-suporte-para-wordpress-multisite\/","title":{"rendered":"Crie um arquivo virtual no WordPress com suporte para WordPress Multisite"},"content":{"rendered":"\n<p>Recentemente, eu estava trabalhando em uma inst\u00e2ncia do WordPress Multisite e precisava que cada site (multil\u00edngue nesta inst\u00e2ncia) tivesse seu pr\u00f3prio mapa de site gerado dinamicamente. Eu gerei esses sitemaps criando <strong>arquivos virtuais<\/strong> dentro do WordPress.<\/p>\n<p>Este artigo mostra como criar um arquivo virtual e como garantir que esse arquivo virtual n\u00e3o seja acess\u00edvel em todos os sites em sua inst\u00e2ncia do WordPress Multisite.<\/p>\n<h2>Configurando Regras de Reescrita<\/h2>\n<p>Para criar um arquivo virtual, a primeira coisa que precisamos fazer \u00e9 criar algumas regras de reescrita, para que o WordPress saiba o que fazer com a URL virtual onde queremos que nosso arquivo apare\u00e7a.<\/p>\n<p>O exemplo a seguir cria dois URLs de mapa de site 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>Observe como adicionamos uma vari\u00e1vel de consulta de &#8216;map&#8217; e, em seguida, mapeamos o nome do nosso sitemap para essa consulta.<\/p>\n<h2>Impedir redirecionamentos can\u00f4nicos<\/h2>\n<p>\u00c0s vezes, se voc\u00ea tiver redirecionamentos can\u00f4nicos ativados (digamos, por meio de um plug-in como o Yoast SEO), o WordPress tentar\u00e1 adicionar uma barra ao final do seu URL. Podemos evitar isso usando esta fun\u00e7\u00e3o.<\/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>Criando o conte\u00fado do arquivo virtual<\/h2>\n<p>Agora, finalmente, precisamos configurar os pr\u00f3prios arquivos virtuais. Para fazer isso, podemos enganchar no <code>template_include<\/code>gancho. Aqui est\u00e1 uma vers\u00e3o muito simplificada de como nossos sitemaps podem ser.<\/p>\n<p>Observe como usamos a vari\u00e1vel map para determinar qual arquivo virtual desejamos exibir.<\/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>B\u00f4nus: inclua arquivos est\u00e1ticos em seu URL virtual<\/h3>\n<p>O exemplo acima foi muito simples, mas voc\u00ea pode mapear arquivos est\u00e1ticos para esses URLs virtuais puxando o conte\u00fado deles para o arquivo. Por exemplo, aqui estamos usando sitemaps no diret\u00f3rio raiz &#8216;maps&#8217; e incluindo-os dinamicamente com base na vari\u00e1vel map.<\/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>Liberando Regras de Reescrita<\/h2>\n<p>A \u00faltima coisa que voc\u00ea precisar\u00e1 fazer, antes de ver seus arquivos virtuais, \u00e9 liberar as regras de reescrita. Se voc\u00ea colou o direcionamento acima no <code>functions.php<\/code>melhor curso de a\u00e7\u00e3o \u00e9 acessar <code>Settings &gt; Permalinks<\/code>seu painel do WordPress e salvar novamente seus permalinks. Mas se voc\u00ea estiver construindo um plugin, voc\u00ea pode se conectar ao gancho de ativa\u00e7\u00e3o para que ele seja ativado automaticamente quando voc\u00ea ativar seu plugin:<\/p>\n<pre><code>register_activation_hook( __FILE__, 'flush_rewrite_rules' );\n<\/code><\/pre>\n<p>Voc\u00ea pode <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/flush_rewrite_rules\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ler mais sobre regras de libera\u00e7\u00e3o no WordPress Codex<\/a> para outros m\u00e9todos que podem ser relevantes para o seu cen\u00e1rio.<\/p>\n<p>Nosso mapa do site franc\u00eas<\/p>\n<p>Isso funciona muito bem! Os arquivos virtuais s\u00e3o criados sem problemas, mas se eu visitar a vers\u00e3o francesa do site e procurar o mapa do site (por exemplo: <a href=\"https:\/\/mattwatson.codes\/fr\/sitemap.xml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">mattwatson.codes\/fr\/sitemap.xml<\/a>) eu conseguiria ver a vers\u00e3o em ingl\u00eas do sitemap. N\u00e3o \u00e9 ideal.<\/p>\n<h2>Arquivos virtuais exclusivos no WordPress Multisite<\/h2>\n<p>A solu\u00e7\u00e3o para evitar arquivos virtuais em suas outras inst\u00e2ncias do WordPress Multisite \u00e9 muito simples. Tudo o que voc\u00ea precisa fazer ao configurar suas reescritas \u00e9 verificar se o site que voc\u00ea est\u00e1 visualizando no momento \u00e9 aquele em que deseja que o arquivo virtual apare\u00e7a.<\/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 voc\u00ea tiver o WordPress Multisite desativado, a fun\u00e7\u00e3o acima ser\u00e1 interrompida, portanto, verifique se a <code>get_current_blog_id<\/code>fun\u00e7\u00e3o existe antes de tentar us\u00e1-la.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <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, eu estava trabalhando em uma inst\u00e2ncia do WordPress Multisite e precisava que cada site (multil\u00edngue nesta inst\u00e2ncia) tivesse seu pr\u00f3prio mapa de site gerado dinamicamente. eu gerei&#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":[722,806,846],"tags":[1170],"class_list":["post-228596","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desenvolvedor","category-php-8","category-tutoriais","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/228596","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=228596"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/228596\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/223984"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=228596"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=228596"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=228596"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}