Uwaga: jest to niepełna odpowiedź, która będzie stopniowo rozszerzana
Jedynym niezawodnym sposobem na opróżnienie reguł przepisywania w wielu witrynach, bez potencjalnego zniszczenia struktury bezpośredniego łącza w głównym i / lub innym kontekście blogu (w zależności od tego, jak i co przełączasz się na i z) jest opróżnienie reguł przepisywania w danym kontekście, takim jak ten :
global $wp_rewrite;
$wp_rewrite->init(); //important...
$wp_rewrite->flush_rules();
Powyższe zapewnia, że poprawna struktura bezpośredniego łącza dla danego kontekstu jest pobierana i ustawiana przed zbudowaniem reguł przepisywania i zatwierdzeniem zmian w bazie danych.
Nie dotyczy to pojedynczej witryny, w której kontekst nie ma znaczenia, ponieważ istnieje tylko jeden kontekst.
flush_rewrite_rules()
moim zdaniem błędne jest założenie, że zakłada właściwy kontekst, ale nie bierze pod uwagę naszego użycia, switch_to_blog
dla którego całkowicie zmienia kontekst i pozostawia nas na niebezpiecznym terytorium, jeśli spróbujemy potencjalnie opróżnić reguły.
Tak wyglądają elementy wewnętrzne flush_rewrite_rules()
:
function flush_rewrite_rules( $hard = true ) {
global $wp_rewrite;
$wp_rewrite->flush_rules( $hard );
}
Nie mogę wymyślić powodu, dla którego nie powinien wyglądać tak:
function flush_rewrite_rules( $hard = true ) {
global $wp_rewrite;
$wp_rewrite->init(); //hello....
$wp_rewrite->flush_rules( $hard );
}
... zwłaszcza gdy weźmiesz pod uwagę, że konstruktor WP_Rewrite
robi co? Robi to ...
public function __construct() {
$this->init();
}
Dotykając pierwszego punktu zainteresowania, aby kontynuować tę linię,
Więc w jaki sposób plugin go o wiarygodnie spłukiwania przepisywania zasad w wielu serwerach :
- Kiedy tworzona jest nowa witryna, dla witryny?
Spójrzmy na to, co rdzeń WordPress wywoła podczas tego procesu:
- pierwszy
wpmu_create_blog()
- który następnie wzywa,
install_blog()
który z kolei wzywapopulate_options()
- następnie
populate_options()
ustawia domyślną strukturę bezpośredniego łącza w tabeli opcji
- po
install_blog()
biegnie, wp_install_defaults()
a następnie zostaje wywołany
- następnie
wp_install_defaults()
opróżnia reguły przepisywania nowo utworzonej witryny, zanim ostatecznie przełączy się z powrotem na bieżący blog za pośrednictwem restore_current_blog()
.
Należy zauważyć, że wp_install_defaults()
zasady flush są dokładnie takie, jak zasugerowałem powyżej:
$wp_rewrite->init();
$wp_rewrite->flush_rules();
... ponieważ jest to jedyny sposób, aby upewnić się, że permalink_structure
reguły i reguły są budowane dla bieżącego kontekstu.
Również w problemie potwierdzonym w ramach problemu Github powód, dla którego użytkownik doświadczył następującego zachowania:
Kiedy tworzona jest nowa witryna, łamie ona linki bezpośrednie na poziomie postu tylko w witrynie najwyższego poziomu - w większości konfiguracji permalink, ale nie we wszystkich:
Te 2 formaty działają poprawnie.
Domyślnie - działa zgodnie z oczekiwaniami
Dzień i nazwisko - działa zgodnie z oczekiwaniami
... ponieważ główny blog ma strukturę permalink Day & Name /%year%/%monthnum%/%day%/%postname%/
, gdy tworzona jest nowa witryna, również /%year%/%monthnum%/%day%/%postname%/
domyślnie ma strukturę permalink Day & Name, dlatego żaden znaczący problem nie pojawia się, gdy wtyczka Yoast SEO przepisze od nowa rządzi na shutdown
haku.
$wp_rewrite
, aby można było przeglądać i resetować każdą witrynę sieciową? Mam dużą witrynę sieciową, która cierpi na pewne problemy z permalink na niestandardowych wtyczkach. Tworzenie wtyczki, która dodaje crona, wydaje się przesadne, ponieważ zawsze je resetuje. Pętla z niestandardowym adresem URL byłaby idealna, ale nie wiem, jak to zrobić dla wszystkich witryn.