Mam trochę dziwny problem z nieprawidłowym opróżnianiem reguł przepisywania.
Próbowałem użyć flush_rewrite_rules();
i flush_rewrite_rules(true);
.
Próbowałem także globalizacji $wp_rewrite
za pomocą $wp_rewrite->flush_rules();
i$wp_rewrite->flush_rules(true);
Żaden z nich nie wydaje się poprawnie przepłukiwać reguł przepisywania. Te połączenia rzeczywiście opróżniają reguły przepisywania po wywołaniu. Skąd to wiem? Korzystanie z rozwiązania do debugowania przepłukiwania reguł przepisywania .
Obecnie mam przepisane przepisy dotyczące aktywacji i dezaktywacji wtyczek. Brak problemów.
Mam stronę ustawień administracji wtyczki, aby użytkownicy mogli skonfigurować wtyczkę. Niektóre ustawienia dostosowują strukturę permalink, więc reguły przepisywania muszą być opróżnione na stronie ustawień administracyjnych wtyczki „Zapisz ustawienia”. (Wykorzystuje standard update_option();
) do zapisywania ustawień.
Chciałbym zauważyć, że w zależności od określonych ustawień tworzone są niestandardowe typy postów, aby pasowały do ustawień określonych przez użytkownika. Dlatego reguły przepisywania muszą zostać usunięte natychmiast po zapisaniu ustawień. To tutaj rzeczy nie działają poprawnie.
Powyższe rozwiązanie link do debugowania reguł przepisywania dostarczone przez @toscho
pokazuje, że to spłukuje mnóstwo reguł przepisywania. Jednak podczas odwiedzania pojedynczego elementu niestandardowego typu posta, a nawet archiwum niestandardowego typu postu, każdy zwraca 404 błędów.
Niestandardowy typ postu jest zarejestrowany poprawnie i odpowiednio. Wiem na pewno, że nie o to chodzi.
Natychmiast następuje zapisanie ustawień strony administracyjnej wtyczki. Tworzone są niestandardowe typy postów, dostosowywana jest struktura permalink, a wszystkie reguły przepisywania są usuwane.
Niestandardowe typy postów są następnie ładowane zawsze i ładowane init
normalnie.
Z jakiegoś powodu reguły przepisywania nie są poprawnie opróżniane, ponieważ, jak powiedziałem wcześniej, odwiedzanie pojedynczych lub archiwalnych sekcji niestandardowego typu posta zwraca błędy 404.
Teraz dziwne jest to, że jeśli wszystko, co robię, to po prostu odwiedzam stronę ustawień permalinków administracyjnych, a następnie wracam do interfejsu, aby wyświetlić sekcje pojedyncze lub archiwalne niestandardowego typu postów, działają one magicznie zgodnie z oczekiwaniami.
Co robi ta strona ustawień administracyjnych Permalinks, czego nie robię, co pozwala na prawidłowe przepisywanie reguł przepisywania, a moje nie?
Mam na myśli, że jako rozwiązanie tymczasowe przekierowuję użytkownika na stronę ustawień bezpośrednich linków administracyjnych po zapisaniu strony ustawień administracyjnych wtyczek, ale nie jest to idealne rozwiązanie. Wolałbym, żeby reguły przepisywania były poprawnie umieszczone w kodzie mojej wtyczki.
Czy jest jakiś punkt w WordPress, w którym opróżnianie reguł przepisywania po prostu już nie opróżnia WSZYSTKICH reguł?
admin_menu
- Strona ustawień wtyczek została dodana do administracji WordPress.
add_options_page()
- Strona ustawień wtyczek została dodana w menu Ustawienia.
Strona ustawień jest renderowana w wywołaniu zwrotnym dla add_options_page()
. Tutaj $_POST
przetwarzane są także ustawienia aktualizacji wtyczek i reguły przepisywania przy przepłukiwaniu.
Ponieważ jest to już długie pytanie, chętnie przedstawię bloki kodu (jeśli to pomoże) w linku zewnętrznym, które pomogą w uzyskaniu prawidłowej odpowiedzi.
źródło
flush_rewrite_rules
, co po prostu usuwarewrite_rules
opcję i regeneruje ją, możesz otworzyć plikwp-admin/options-permalinks.php
i zobaczyć, gdzie to się dzieje. ponieważ ta operacja po prostu usuwa całą opcję, nie można częściowo opróżnić reguł.init
która rejestruje typy postów. Pomyślałem, że ustawienia strony są zapisywane, a strona przeładuje się ... a następnieinit
ponownie uruchomi hak, aby zarejestrować niezbędne typy postów. Doszedłem więc do wniosku, że typy postów będą już załadowane i wystarczyło zaktualizować opcję, a następnie opróżnić reguły przepisywania ze strony ustawień wtyczek. Wyślę odpowiedź, jak wymyśliłem rozwiązanie.Odpowiedzi:
Najlepszym miejscem do opróżnienia reguł przepisywania jest aktywacja / dezaktywacja wtyczki.
Zobacz artykuł o kodeksie
Z góry przepraszam, nie przebrnąłem przez całe twoje pytanie, więc jest to trochę odpowiedź na fałszywe ciasteczka.
źródło
Trudno powiedzieć, co jest nie tak, nie widząc kodu. Ale po zapisaniu niektórych ustawień warto podłączyć się
admin_init
tak, jak pokazano poniżej, aby opróżnić reguły przepisywania.Kod:
Musisz ustawić opcję gdzieś na stronie ustawień lub dokładnie gdzieś w trakcie zapisywania ustawień. Robienie tego bez opcji jest złe, ponieważ nie chcesz za każdym razem opróżniać reguł.
Uwaga: niesprawdzone
źródło
*_option()
względu na stronę ustawień. @helgathevikingMiałem plik klasy typów postów, który był odpowiedzialny za czytanie ustawień opcji wtyczki i tworzenie niezbędnych niestandardowych typów postów na podstawie ustawień określonych przez użytkownika.
Ten plik klasy typów postów został załadowany na haku
init
.Uznałem, że wszystko, co muszę zrobić, to zaktualizować ustawienia wtyczki, a następnie opróżnić reguły przepisywania. Ponieważ klasa typów postów została już załadowana na podstawie ustawień wtyczki. Ale strony administracyjne są ładowane PO
init
haku.Typy postów nigdy nie zostały zarejestrowane, ponieważ ustawienia nie zostały jeszcze ustawione. Klasa rejestracji typów postów zakończyła się przedwcześnie bez zarejestrowanych typów postów.
Rozwiązaniem było:
(Wcześniej ... brakowało kroku 2 - jak wspomniano powyżej ...)
Od tej pory typy postów będą ładowane na
init
haku i będą miały określone ustawienia, pozwalając na tworzenie i łączenie typów postów z odpowiednimi regułami przepisywania.Z jakiegokolwiek powodu musiałem dodać wywołanie JavaScript, aby przekierować na bieżącą stronę, po wykonaniu powyższych trzech kroków.
Musiałem także dodać wywołanie
flush_rewrite_rules();
na stronie ustawień administracyjnych wtyczki.Więc w celu zapewnienia, że wszystko jest opróżnione ...
Krok 1) Przejdź do strony ustawień administracyjnych wtyczki. - Wstępne spłukiwanie.
Krok 2) Zaktualizuj ustawienia wtyczek. - Drugie spłukanie.
Krok 3) Strona przekierowuje na stronę ustawień wtyczki. Powodowanie ... Trzeciego i ostatniego spłukiwania (tak samo jak wstępne spłukiwanie - Wykonane automatycznie, gdy strona ustawień wtyczki zostanie odwiedzona)
Nie twierdzę, że to praktyczne rozwiązanie, ale zadziałało dla mnie. Bardzo dziwny problem i najprawdopodobniej dotyczy mojej infrastruktury kodowania.
źródło
@ tazo-todua to również działało dla mnie podczas korzystania z wielu witryn.
źródło
MOJE znalezione ROZWIĄZANIE BYŁO:
źródło
Miałem dokładnie ten sam problem. W mojej wtyczce mam typy postów tworzone dynamicznie. Dlatego nie można ich zarejestrować za
register_post_type()
pomocą metody statycznej podczasactivation_hook
i dlatego nie są jeszcze aktywne, gdyflush_rewrite_rules()
są uruchamiane podczas tego przechwytywania (co jest zwykle zalecanym sposobem przepłukiwania reguł przepisywania).Najczystszym rozwiązaniem, jakie udało mi się w końcu wymyślić, było opróżnienie reguł przepisywania po rejestracji typów postów, ale oczywiście tylko wtedy, gdy takie opróżnianie było faktycznie konieczne (ponieważ operacja jest powolna). W moim przypadku mam kilka niestandardowych typów postów, które dziedziczą po jednej klasie bazowej, dlatego pożądane było zaimplementowanie tam kodu, który tam opróżnia.
O tym, czy konieczne jest płukanie, można zdecydować, patrząc na wynik
get_option( 'rewrite_rules' )
:Wady:
register_post_type()
.Zalety:
Używaj tego tylko, jeśli nie możesz zarejestrować swojego typu posta w funkcji statycznej, która może być wywoływana zarówno podczas, jak
init
iactivation_hook
!Zależność od tego, jak reguły przepisywania generowane podczas
register_post_type()
wyglądania można złagodzić, zastępując testif(strpos($key, $args['rewrite']['slug'] ) === 0)
bardziej rozbudowanym, np. Wyrażeniem regularnym.źródło