Ostatnio pracowałem nad instancją WordPress Multisite i potrzebowałem, aby każda witryna (w tym przypadku wielojęzyczna) miała własną unikalną, dynamicznie generowaną mapę witryny. Wygenerowałem te mapy witryn, tworząc wirtualne pliki w WordPressie.
W tym artykule pokazano, jak utworzyć plik wirtualny, a następnie jak upewnić się, że ten plik wirtualny nie jest dostępny przez każdą witrynę w instancji WordPress Multisite.
Konfigurowanie reguł przepisywania
Aby utworzyć wirtualny plik, pierwszą rzeczą, którą musimy zrobić, to stworzyć kilka reguł przepisywania, aby WordPress wiedział, co zrobić z wirtualnym adresem URL, w którym chcemy, aby pojawił się nasz plik.
Poniższy przykład tworzy dwa adresy URL mapy witryny sitemap.xml i 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 );
Zwróć uwagę, jak dodajemy zmienną zapytania „map", a następnie mapujemy nazwę naszej mapy witryny na to zapytanie.
Zapobiegaj przekierowaniom kanonicznym
Czasami, jeśli masz włączone przekierowania kanoniczne (np. przez wtyczkę, taką jak Yoast SEO), WordPress spróbuje dodać ukośnik na końcu adresu URL. Możemy temu zapobiec, korzystając z tej funkcji.
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' );
Tworzenie wirtualnej zawartości pliku
Teraz w końcu musimy skonfigurować same pliki wirtualne. W tym celu możemy zaczepić się o template_includehaczyk. Oto bardzo uproszczona wersja tego, jak mogą wyglądać nasze mapy witryn.
Zwróć uwagę, jak używamy zmiennej map do określenia, który plik wirtualny chcemy wyświetlić.
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: Dołącz pliki statyczne do swojego wirtualnego adresu URL
Powyższy przykład był bardzo prosty, ale można było mapować pliki statyczne na te wirtualne adresy URL, przeciągając ich zawartość do pliku. Na przykład tutaj używamy map witryn w katalogu głównym „maps” i dynamicznie dołączamy je na podstawie zmiennej mapy.
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' );
Flushing Rewrite Rules
Ostatnią rzeczą, którą musisz zrobić, zanim zobaczysz swoje wirtualne pliki, jest opróżnienie reguł przepisywania. Jeśli wkleiłeś powyższe wskazówki functions.php, najlepszym sposobem działania jest przejście do Settings > Permalinkspulpitu WordPress i ponowne zapisanie permalinków. Ale jeśli budujesz wtyczkę, możesz podłączyć się do haka aktywacji, aby automatycznie uruchomił się, gdy aktywujesz wtyczkę:
register_activation_hook( __FILE__, 'flush_rewrite_rules' );
Możesz przeczytać więcej o regułach opróżniania w Kodeksie WordPress, aby poznać inne metody, które mogą być odpowiednie dla twojego scenariusza.
Nasza francuska mapa witryny
To działa świetnie! Tworzenie wirtualnych plików nie stanowi problemu, ale gdybym następnie odwiedził francuską wersję witryny i poszukał mapy witryny (np. mattwatson.codes/fr/sitemap.xml ), byłbym w stanie zobaczyć angielską wersję mapy witryny. Nieidealny.
Unikalne pliki wirtualne w WordPress Multisite
Rozwiązanie zapobiegające wirtualnym plikom w innych instancjach WordPress Multisite jest po prostu naprawdę. Wszystko, co musisz zrobić podczas konfigurowania przepisywania, to sprawdzić, czy witryna, którą aktualnie przeglądasz, jest tą, w której chcesz, aby pojawił się ten wirtualny plik.
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 );
Jeśli masz wyłączony WordPress Multisite, powyższa funkcja zepsuje się, więc możesz chcieć sprawdzić, czy get_current_blog_idfunkcja istnieje, zanim spróbujesz jej użyć.