✅ Noticias, temas, complementos de WEB y WordPress. Aquí compartimos consejos y las mejores soluciones para sitios web.

Cree un archivo virtual en WordPress con soporte para WordPress multisitio

21

Recientemente, estaba trabajando en una instancia multisitio de WordPress, y necesitaba que cada sitio (multilingüe en este caso) tuviera su propio mapa de sitio único generado dinámicamente. Generé estos mapas de sitio creando archivos virtuales dentro de WordPress.

Este artículo le muestra cómo crear un archivo virtual y luego cómo asegurarse de que ese archivo virtual no sea accesible a través de todos los sitios en su instancia de WordPress Multisite.

Configuración de reglas de reescritura

Para crear un archivo virtual, lo primero que debemos hacer es crear unas reglas de reescritura, para que WordPress sepa qué hacer con la URL virtual donde queremos que aparezca nuestro archivo.

El siguiente ejemplo crea dos URL de mapa de sitio sitemap.xml y sitemap-fr.xml.

function wholesomecode_sitemap_rewrites() {
    global $wp;
    $wp->add_query_var( 'map' );

    add_rewrite_rule( 'sitemap.xml$', 'index.php?map=sitemap', 'top' );
    add_rewrite_rule( '^sitemap-fr.xml$', 'index.php?map=sitemap-fr', 'top' );
}
add_action( 'init', 'wholesomecode_sitemap_rewrites', 99 );

Observe cómo agregamos una variable de consulta de ‘mapa’ y luego asignamos el nombre de nuestro mapa del sitio a esta consulta.

Evitar redireccionamientos canónicos

A veces, si tiene habilitados los redireccionamientos canónicos (por ejemplo, a través de un complemento como Yoast SEO), WordPress intentará agregar una barra al final de su URL. Podemos evitar esto usando esta función.

function wholesomecode_prevent_slash_on_map_variable( $redirect) {
    if (get_query_var( 'map')) {
        return false;
    }
    return $redirect;
}
add_filter( 'redirect_canonical', 'wholesomecode_prevent_slash_on_map_variable' );

Creación del contenido del archivo virtual

Ahora, finalmente, necesitamos configurar los archivos virtuales. Para ello podemos engancharnos en el template_includeanzuelo. Aquí hay una versión muy simplificada de cómo se verían nuestros mapas de sitio.

Observe cómo usamos la variable de mapa para determinar qué archivo virtual deseamos mostrar.

function wholesomecode_sitemap_contents( $template) {
    $map = get_query_var( 'map' );
    if (! empty( $map)) {
        header( 'Content-type: text/xml' );
        if ('sitemap' === $map) {
            ?>
            <?xml version="1.0" encoding="UTF-8"?>
            <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
                <sitemap>
                    <loc>https:
                </sitemap>
            </sitemapindex>
            <?php
        } elseif ('sitemap-fr' === $map) {
            ?>
            <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
                <sitemap>
                    <loc>https:
                </sitemap>
            </sitemapindex>
            <?php
        }
        die();
    }
    return $template;
}
add_action( 'template_include', 'wholesomecode_sitemap_contents' );

Bonificación: incluya archivos estáticos en su URL virtual

El ejemplo anterior era muy simple, pero podría mapear archivos estáticos en estas URL virtuales al extraer su contenido en el archivo. Por ejemplo, aquí estamos usando mapas de sitio en el directorio raíz ‘mapas’ y los incluimos dinámicamente en función de la variable del mapa.

function wholesomecode_sitemap_from_file( $template) {
    $map = get_query_var( 'map' );
    if (! empty( $map)) {
        if (! function_exists( 'get_home_path')) {
            include_once ABSPATH. '/wp-admin/includes/file.php';
        }
        header( 'Content-type: text/xml' );
        include get_home_path(). 'maps/'. $map. '.xml';
        die;
    }
    return $template;
}
add_action( 'template_include', 'wholesomecode_sitemap_from_file' );

Reglas de reescritura de vaciado

Lo último que deberá hacer, antes de ver sus archivos virtuales, es vaciar las reglas de reescritura. Si ha pegado la dirección anterior en functions.phpel mejor curso de acción es ir a Settings > Permalinkssu panel de control de WordPress y volver a guardar sus enlaces permanentes. Pero si está creando un complemento, puede conectarse al enlace de activación para que se activen automáticamente cuando active su complemento:

register_activation_hook( __FILE__, 'flush_rewrite_rules' );

Puede leer más sobre las reglas de descarga en el Codex de WordPress para conocer otros métodos que pueden ser relevantes para su situación.

Nuestro mapa del sitio en francés

¡Esto funciona muy bien! Los archivos virtuales se crean sin problemas, pero si luego visito la versión en francés del sitio y busco el mapa del sitio (por ejemplo: mattwatson.codes/fr/sitemap.xml) podría ver la versión en inglés del mapa del sitio. No es ideal.

Archivos virtuales únicos en WordPress multisitio

La solución para evitar archivos virtuales en sus otras instancias de WordPress Multisite es bastante simple. Todo lo que necesita hacer cuando está configurando sus reescrituras es verificar que el sitio que está viendo actualmente es el que desea que aparezca ese archivo virtual.

function wholesomecode_sitemap_rewrites() {
    global $wp;
    $wp->add_query_var( 'map' );

    if (get_current_blog_id() == '1') {
        add_rewrite_rule( 'sitemap.xml$', 'index.php?map=sitemap', 'top' );
    }

    if (get_current_blog_id() === get_id_from_blogname( 'fr')) {
        add_rewrite_rule( '^sitemap-fr.xml$', 'index.php?map=sitemap-fr', 'top' );
    }
}
add_action( 'init', 'wholesomecode_sitemap_rewrites', 99 );

Si tiene desactivado WordPress Multisite, la función anterior se romperá, por lo que es posible que desee verificar que la get_current_blog_idfunción existe antes de intentar usarla.

Fuente de grabación: wholesomecode.ltd

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More