Actualités WEB et WordPress, thèmes, plugins. Ici, nous partageons des conseils et les meilleures solutions de sites Web.

Créer un fichier virtuel dans WordPress avec prise en charge de WordPress multisite

18

Récemment, je travaillais sur une instance WordPress multisite, et j’avais besoin que chaque site (multilingue dans cette instance) ait son propre sitemap unique généré dynamiquement. J’ai généré ces sitemaps en créant des fichiers virtuels dans WordPress.

Cet article vous montre comment créer un fichier virtuel, puis comment vous assurer que ce fichier virtuel n’est pas accessible via tous les sites de votre instance WordPress multisite.

Configuration des règles de réécriture

Pour créer un fichier virtuel, la première chose que nous devons faire est de créer des règles de réécriture, afin que WordPress sache quoi faire avec l’URL virtuelle où nous voulons que notre fichier apparaisse.

L’exemple suivant crée deux URL de plan de site sitemap.xml et 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 );

Notez comment nous ajoutons une variable de requête de ‘carte’, puis nous mappons le nom de notre sitemap à cette requête.

Empêcher les redirections canoniques

Parfois, si vous avez activé les redirections canoniques (par exemple via un plugin tel que Yoast SEO), WordPress tentera d’ajouter une barre oblique à la fin de votre URL. Nous pouvons empêcher cela en utilisant cette fonction.

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' );

Création du contenu du fichier virtuel

Enfin, nous devons configurer les fichiers virtuels eux-mêmes. Pour ce faire, nous pouvons nous accrocher au template_includecrochet. Voici une version très simplifiée de ce à quoi pourraient ressembler nos sitemaps.

Notez comment nous utilisons la variable map pour déterminer quel fichier virtuel nous souhaitons afficher.

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' );

Bonus : incluez des fichiers statiques dans votre URL virtuelle

L’exemple ci-dessus était très simple, mais vous pouvez mapper des fichiers statiques dans ces URL virtuelles en extrayant leur contenu dans le fichier. Par exemple, nous utilisons ici des sitemaps dans le répertoire racine "maps" et les incluons dynamiquement en fonction de la variable map.

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' );

Rinçage des règles de réécriture

La dernière chose que vous devrez faire, avant de voir vos fichiers virtuels, est de vider les règles de réécriture. Si vous avez collé les instructions ci-dessus dans functions.phpla meilleure chose à faire, allez Settings > Permalinksdans votre tableau de bord WordPress et enregistrez à nouveau vos permaliens. Mais si vous construisez un plugin, vous pouvez vous connecter au hook d’activation pour qu’il se déclenche automatiquement lorsque vous activez votre plugin :

register_activation_hook( __FILE__, 'flush_rewrite_rules' );

Vous pouvez en savoir plus sur les règles de rinçage dans le WordPress Codex pour d’autres méthodes qui peuvent être pertinentes pour votre scénario.

Notre plan du site français

Cela fonctionne très bien! Les fichiers virtuels sont créés sans problème, mais si je visitais ensuite la version française du site et cherchais le sitemap (ex: mattwatson.codes/fr/sitemap.xml) je pourrais voir la version anglaise du sitemap. Pas idéal.

Fichiers virtuels uniques dans WordPress Multisite

La solution pour empêcher les fichiers virtuels dans vos autres instances WordPress Multisite est vraiment très simple. Tout ce que vous devez faire lorsque vous configurez vos réécritures est de vérifier que le site que vous consultez actuellement est celui sur lequel vous souhaitez que ce fichier virtuel apparaisse.

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 vous avez désactivé WordPress Multisite, la fonction ci-dessus s’arrêtera, vous voudrez peut-être vérifier que la get_current_blog_idfonction existe avant d’essayer de l’utiliser.

Source d’enregistrement: 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