✅ Notizie, temi, plugin WEB e WordPress. Qui condividiamo suggerimenti e le migliori soluzioni per siti web.

Crea un file virtuale in WordPress con il supporto per WordPress Multisite

20

Recentemente stavo lavorando su un’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 file virtuali all’interno di WordPress.

Questo articolo mostra come creare un file virtuale e quindi come garantire che quel file virtuale non sia accessibile attraverso tutti i siti nell’istanza multisito di WordPress.

Impostazione delle regole di riscrittura

Per creare un file virtuale, la prima cosa che dobbiamo fare è creare alcune regole di riscrittura, in modo che WordPress sappia cosa fare con l’URL virtuale in cui vogliamo che appaia il nostro file.

L’esempio seguente crea due URL della mappa del sito sitemap.xml e 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 );

Nota come aggiungiamo una variabile di query di ‘mappa’ e quindi mappiamo il nome della nostra mappa del sito a questa query.

Impedisci reindirizzamenti canonici

A volte, se hai i reindirizzamenti canonici abilitati (ad esempio tramite un plug-in come Yoast SEO), WordPress tenterà di aggiungere una barra alla fine del tuo URL. Possiamo prevenirlo usando questa funzione.

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

Creazione del contenuto del file virtuale

Ora, finalmente, dobbiamo configurare i file virtuali stessi. Per fare questo possiamo agganciarci al template_includegancio. Ecco una versione molto semplificata di come potrebbero apparire le nostre mappe del sito.

Nota come utilizziamo la variabile map per determinare quale file virtuale desideriamo visualizzare.

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: includi file statici nel tuo URL virtuale

L’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 ‘mappe’ e includendole dinamicamente in base alla variabile della mappa.

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

Regole di riscrittura del lavaggio

L’ultima cosa che devi fare, prima di vedere i tuoi file virtuali, è svuotare le regole di riscrittura. Se hai incollato la direzione di cui sopra nella functions.phpmigliore linea d’azione è andare Settings > Permalinksnella dashboard di WordPress e salvare nuovamente i tuoi permalink. Ma se stai creando un plug-in, puoi collegarti all’hook di attivazione in modo che si attivino automaticamente quando attivi il tuo plug-in:

register_activation_hook( __FILE__, 'flush_rewrite_rules' );

Puoi leggere di più sulle regole di svuotamento nel Codice di WordPress per altri metodi che potrebbero essere rilevanti per il tuo scenario.

La nostra mappa del sito francese

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: mattwatson.codes/fr/sitemap.xml) potrei vedere la versione inglese della mappa del sito. Non è l’ideale.

File virtuali unici nel multisito di WordPress

La soluzione per prevenire i file virtuali nelle altre istanze multisito di WordPress è davvero molto semplice. Tutto quello che devi fare quando imposti le tue riscritture, è controllare che il sito che stai attualmente visualizzando sia quello in cui vuoi che appaia il file virtuale.

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

Se hai WordPress Multisite disattivato, la funzione di cui sopra si interromperà, quindi potresti voler verificare che la get_current_blog_idfunzione esista prima di provare a usarla.

Fonte di registrazione: 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