✅ WEB- und WordPress-Nachrichten, Themen, Plugins. Hier teilen wir Tipps und beste Website-Lösungen.

Erstellen Sie eine virtuelle Datei in WordPress mit Unterstützung für WordPress Multisite

14

Kürzlich habe ich an einer WordPress-Multisite-Instanz gearbeitet, und ich brauchte jede Site (in diesem Fall mehrsprachig) mit einer eigenen, einzigartigen, dynamisch generierten Sitemap. Ich habe diese Sitemaps generiert, indem ich virtuelle Dateien in WordPress erstellt habe.

Dieser Artikel zeigt dir, wie du eine virtuelle Datei erstellst und dann sicherstellst, dass diese virtuelle Datei nicht über jede Seite in deiner WordPress-Multisite-Instanz zugänglich ist.

Umschreibungsregeln einrichten

Um eine virtuelle Datei zu erstellen, müssen wir zunächst einige Umschreibungsregeln erstellen, damit WordPress weiß, was mit der virtuellen URL zu tun ist, unter der unsere Datei erscheinen soll.

Das folgende Beispiel erstellt zwei Sitemap-URLs sitemap.xml und 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 );

Beachten Sie, wie wir eine Abfragevariable „map“ hinzufügen und dann den Namen unserer Sitemap dieser Abfrage zuordnen.

Kanonische Weiterleitungen verhindern

Manchmal, wenn Sie kanonische Weiterleitungen aktiviert haben (z. B. über ein Plugin wie Yoast SEO), versucht WordPress, einen Schrägstrich am Ende Ihrer URL hinzuzufügen. Mit dieser Funktion können wir dies verhindern.

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

Erstellen des Inhalts der virtuellen Datei

Jetzt müssen wir endlich die virtuellen Dateien selbst einrichten. Dazu können wir uns in den template_includeHaken einhaken. Hier ist eine sehr vereinfachte Version dessen, wie unsere Sitemaps aussehen könnten.

Beachten Sie, wie wir die Kartenvariable verwenden, um zu bestimmen, welche virtuelle Datei wir anzeigen möchten.

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: Fügen Sie statische Dateien in Ihre virtuelle URL ein

Das obige Beispiel war sehr einfach, aber Sie könnten statische Dateien diesen virtuellen URLs zuordnen, indem Sie deren Inhalt in die Datei ziehen. Hier verwenden wir beispielsweise Sitemaps im Root-Verzeichnis „maps“ und binden sie dynamisch basierend auf der map-Variablen ein.

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

Flush-Rewrite-Regeln

Das Letzte, was Sie tun müssen, bevor Sie Ihre virtuellen Dateien sehen, ist, die Umschreibregeln zu leeren. Wenn Sie die obige Anleitung eingefügt haben functions.php, gehen Sie am besten zu Settings > Permalinksin Ihrem WordPress-Dashboard und speichern Sie Ihre Permalinks erneut. Wenn Sie jedoch ein Plugin erstellen, können Sie sich in den Aktivierungs-Hook einklinken, damit sie automatisch aktiviert werden, wenn Sie Ihr Plugin aktivieren:

register_activation_hook( __FILE__, 'flush_rewrite_rules' );

Sie können mehr über Flush-Regeln im WordPress-Codex für andere Methoden lesen, die für Ihr Szenario relevant sein könnten.

Unsere französische Sitemap

Das funktioniert super! Die virtuellen Dateien werden ohne Probleme erstellt, aber wenn ich dann die französische Version der Site besuchte und nach der Sitemap suchte (z. B.: mattwatson.codes/fr/sitemap.xml ), würde ich die englische Version der Sitemap sehen können. Nicht ideal.

Einzigartige virtuelle Dateien in WordPress Multisite

Die Lösung, um virtuelle Dateien in Ihren anderen WordPress Multisite-Instanzen zu verhindern, ist wirklich ziemlich einfach. Alles, was Sie tun müssen, wenn Sie Ihre Umschreibungen einrichten, ist zu überprüfen, ob die Site, die Sie gerade anzeigen, diejenige ist, auf der diese virtuelle Datei erscheinen soll.

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

Wenn Sie WordPress Multisite deaktiviert haben, wird die obige Funktion unterbrochen, daher sollten Sie überprüfen, ob die get_current_blog_idFunktion vorhanden ist, bevor Sie versuchen, sie zu verwenden.

Aufnahmequelle: wholesomecode.ltd

Diese Website verwendet Cookies, um Ihre Erfahrung zu verbessern. Wir gehen davon aus, dass Sie damit einverstanden sind, Sie können sich jedoch abmelden, wenn Sie möchten. Annehmen Weiterlesen