✅ WEB- och WordPress -nyheter, teman, plugins. Här delar vi tips och bästa webbplatslösningar.

Skapa en virtuell fil i WordPress med stöd för WordPress Multisite

16

Nyligen arbetade jag på en WordPress Multisite-instans, och jag behövde varje webbplats (flerspråkig i det här fallet) ha sin egen unika dynamiskt genererade webbplatskarta. Jag skapade dessa webbplatskartor genom att skapa virtuella filer i WordPress.

Den här artikeln visar hur du skapar en virtuell fil och sedan hur du säkerställer att den virtuella filen inte är tillgänglig via varje webbplats i din WordPress Multisite-instans.

Ställa in regler för omskrivning

För att skapa en virtuell fil är det första vi behöver göra att skapa några omskrivningsregler, så att WordPress vet vad de ska göra med den virtuella URL där vi vill att vår fil ska visas.

Följande exempel skapar två webbadresser för webbplatskartor sitemap.xml och 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 );

Notera hur vi lägger till en frågevariabel av "karta" och sedan mappar vi namnet på vår webbplatskarta till den här frågan.

Förhindra kanoniska omdirigeringar

Ibland om du har kanoniska omdirigeringar aktiverade (säg genom ett plugin som Yoast SEO) kommer WordPress att försöka lägga till ett snedstreck i slutet av din URL. Vi kan förhindra detta genom att använda denna funktion.

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

Skapar det virtuella filinnehållet

Nu äntligen måste vi ställa in de virtuella filerna själva. För att göra detta kan vi haka i template_includekroken. Här är en mycket förenklad version av hur våra webbplatskartor skulle kunna se ut.

Notera hur vi använder kartvariabeln för att bestämma vilken virtuell fil vi vill visa.

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: Inkludera statiska filer i din virtuella URL

Exemplet ovan var väldigt enkelt, men du kan mappa statiska filer till dessa virtuella webbadresser genom att dra in innehållet i dem i filen. Här använder vi till exempel webbplatskartor i rotkatalogen ’kartor’ och inkluderar dem dynamiskt baserat på kartvariabeln.

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

Spola omskrivningsregler

Det sista du behöver göra innan du ser dina virtuella filer är att spola omskrivningsreglerna. Om du har klistrat in ovanstående anvisningar i functions.phpdet bästa tillvägagångssättet är att gå till Settings > Permalinksi din WordPress-instrumentpanel och spara dina permalänkar igen. Men om du bygger ett plugin kan du koppla in aktiveringskroken så att de automatiskt slår in när du aktiverar din plugin:

register_activation_hook( __FILE__, 'flush_rewrite_rules' );

Du kan läsa mer om spolningsregler i WordPress Codex för andra metoder som kan vara relevanta för ditt scenario.

Vår franska webbplatskarta

Det här fungerar utmärkt! De virtuella filerna skapas inga problem, men om jag sedan besökte den franska versionen av webbplatsen och letade efter webbplatskartan (t.ex.: mattwatson.codes/fr/sitemap.xml) skulle jag kunna se den engelska versionen av webbplatskartan. Inte idealiskt.

Unika virtuella filer i WordPress Multisite

Lösningen för att förhindra virtuella filer i dina andra WordPress Multisite-instanser är ganska enkelt egentligen. Allt du behöver göra när du ställer in dina omskrivningar är att kontrollera att webbplatsen du för närvarande tittar på är den du vill att den virtuella filen ska visas på.

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

Om du har WordPress Multisite avstängd kommer ovanstående funktion att gå sönder, så du kanske vill kontrollera att get_current_blog_idfunktionen finns innan du försöker använda den.

Inspelningskälla: wholesomecode.ltd

Denna webbplats använder cookies för att förbättra din upplevelse. Vi antar att du är ok med detta, men du kan välja bort det om du vill. Jag accepterar Fler detaljer