{"id":228258,"date":"2022-10-15T11:03:00","date_gmt":"2022-10-15T08:03:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228258"},"modified":"2022-11-09T01:32:42","modified_gmt":"2022-11-08T22:32:42","slug":"cree-un-archivo-virtual-en-wordpress-con-soporte-para-wordpress-multisitio","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/cree-un-archivo-virtual-en-wordpress-con-soporte-para-wordpress-multisitio\/","title":{"rendered":"Cree un archivo virtual en WordPress con soporte para WordPress multisitio"},"content":{"rendered":"\n<p>Recientemente, estaba trabajando en una instancia multisitio de WordPress, y necesitaba que cada sitio (multiling\u00fce en este caso) tuviera su propio mapa de sitio \u00fanico generado din\u00e1micamente. Gener\u00e9 estos mapas de sitio creando <strong>archivos virtuales<\/strong> dentro de WordPress.<\/p>\n<p>Este art\u00edculo le muestra c\u00f3mo crear un archivo virtual y luego c\u00f3mo asegurarse de que ese archivo virtual no sea accesible a trav\u00e9s de todos los sitios en su instancia de WordPress Multisite.<\/p>\n<h2>Configuraci\u00f3n de reglas de reescritura<\/h2>\n<p>Para crear un archivo virtual, lo primero que debemos hacer es crear unas reglas de reescritura, para que WordPress sepa qu\u00e9 hacer con la URL virtual donde queremos que aparezca nuestro archivo.<\/p>\n<p>El siguiente ejemplo crea dos URL de mapa de sitio sitemap.xml y 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 c\u00f3mo agregamos una variable de consulta de &#8216;mapa&#8217; y luego asignamos el nombre de nuestro mapa del sitio a esta consulta.<\/p>\n<h2>Evitar redireccionamientos can\u00f3nicos<\/h2>\n<p>A veces, si tiene habilitados los redireccionamientos can\u00f3nicos (por ejemplo, a trav\u00e9s de un complemento como Yoast SEO), WordPress intentar\u00e1 agregar una barra al final de su URL. Podemos evitar esto usando esta funci\u00f3n.<\/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>Creaci\u00f3n del contenido del archivo virtual<\/h2>\n<p>Ahora, finalmente, necesitamos configurar los archivos virtuales. Para ello podemos engancharnos en el <code>template_include<\/code>anzuelo. Aqu\u00ed hay una versi\u00f3n muy simplificada de c\u00f3mo se ver\u00edan nuestros mapas de sitio.<\/p>\n<p>Observe c\u00f3mo usamos la variable de mapa para determinar qu\u00e9 archivo virtual deseamos mostrar.<\/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>Bonificaci\u00f3n: incluya archivos est\u00e1ticos en su URL virtual<\/h3>\n<p>El ejemplo anterior era muy simple, pero podr\u00eda mapear archivos est\u00e1ticos en estas URL virtuales al extraer su contenido en el archivo. Por ejemplo, aqu\u00ed estamos usando mapas de sitio en el directorio ra\u00edz &#8216;mapas&#8217; y los incluimos din\u00e1micamente en funci\u00f3n de la variable del mapa.<\/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>Reglas de reescritura de vaciado<\/h2>\n<p>Lo \u00faltimo que deber\u00e1 hacer, antes de ver sus archivos virtuales, es vaciar las reglas de reescritura. Si ha pegado la direcci\u00f3n anterior en <code>functions.php<\/code>el mejor curso de acci\u00f3n es ir a <code>Settings &gt; Permalinks<\/code>su panel de control de WordPress y volver a guardar sus enlaces permanentes. Pero si est\u00e1 creando un complemento, puede conectarse al enlace de activaci\u00f3n para que se activen autom\u00e1ticamente cuando active su complemento:<\/p>\n<pre><code>register_activation_hook( __FILE__, 'flush_rewrite_rules' );\n<\/code><\/pre>\n<p>Puede <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/flush_rewrite_rules\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">leer m\u00e1s sobre las reglas de descarga en el Codex de WordPress<\/a> para conocer otros m\u00e9todos que pueden ser relevantes para su situaci\u00f3n.<\/p>\n<p>Nuestro mapa del sitio en franc\u00e9s<\/p>\n<p>\u00a1Esto funciona muy bien! Los archivos virtuales se crean sin problemas, pero si luego visito la versi\u00f3n en franc\u00e9s del sitio y busco el mapa del sitio (por ejemplo: <a href=\"https:\/\/mattwatson.codes\/fr\/sitemap.xml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">mattwatson.codes\/fr\/sitemap.xml<\/a>) podr\u00eda ver la versi\u00f3n en ingl\u00e9s del mapa del sitio. No es ideal.<\/p>\n<h2>Archivos virtuales \u00fanicos en WordPress multisitio<\/h2>\n<p>La soluci\u00f3n para evitar archivos virtuales en sus otras instancias de WordPress Multisite es bastante simple. Todo lo que necesita hacer cuando est\u00e1 configurando sus reescrituras es verificar que el sitio que est\u00e1 viendo actualmente es el que desea que aparezca ese archivo virtual.<\/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>Si tiene desactivado WordPress Multisite, la funci\u00f3n anterior se romper\u00e1, por lo que es posible que desee verificar que la <code>get_current_blog_id<\/code>funci\u00f3n existe antes de intentar usarla.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/wholesomecode.ltd\" class=\"external external_icon\">wholesomecode.ltd<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Recientemente, estaba trabajando en una instancia multisitio de WordPress, y necesitaba que cada sitio (multiling\u00fce en este caso) tuviera su propio mapa de sitio \u00fanico generado din\u00e1micamente. gener\u00e9&#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":[716,800,840],"tags":[1172],"class_list":["post-228258","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desarrollador","category-php-2","category-tutoriales","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/228258","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=228258"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/228258\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/223984"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=228258"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=228258"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=228258"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}