Pominięcie błędu 404 dla własnego skryptu.
-
Chce w wordpresie odpalić swój skrypt który mi będzie generował URLe na podstawie których IFami będę wyświetlał dane.
Zastosowałem się do zaleceń żeby odpowiednio dać uprawnienia dla strony w wordpresie. Problem pojawia się kiedy skrypt generuje URLe /strona1 /strona2 wtedy już wordpress nie ma takiej kategorii i wywala błąd 404.
Błąd nie jest wywalany kiedy wykonuje kategoria/(liczba)
Czy istnieje możliwość zmuszenia WordPressa żeby dla danej kategorii nie wywalał błędu 404?
-
Istnieje. Nawet kilka.
Najpoprawniej byłoby to zrobić za pomocą WP_Rewrite. Użyj funkcji
add_rewrite_rule
i za jej pomocą obsługuj takie linki.Jeśli to nie pomoże, albo będzie za trudne, to zawsze możesz próbować „brutalnie” przestawiać zmienną
is_404
– uważaj tylko, żeby zrobić to w odpowiednim momencie (po sparsowaniu przez WP requestu, ale przed wybraniem template’u). (Hookinit
chyba powinien być w tym przypadku OK, ale piszę z głowy, więc w tej kwestii mogę się mylić).Właśnie głowiłem się sporo z tym wp_rewrite ale nadal mi wywala błędy chyba nie poprawnie rozumiem o co tu w tej funkcji chodzi.
Chciałem żeby po nazwa-strony.pl/pliki (załadował się mój skrypt)
Znalazłem już wcześniej właśnie WP_Rewrite i postanowiłem w functions
dodać wyjątek w następujący sposób.
add_filter(’rewrite_rules_array’, 'add_rewrite_rules’);add_filter('generate_rewrite_rules', 'pliki'); function customposttype_rewrites($wp_rewrite) { $newrules = array(); $newrules['pliki/?$'] = 'index.php?post_type=pliki'; $wp_rewrite->rules = $newrules + $wp_rewrite->rules; }
Dla pliki stworzyłem nawet kategorie ale jak już w adresie wpisuje
nazwa-strony.pl/pliki/daneTo dostaję błąd 404
Ta funkcja w ogóle nie dodaje mi URL do wyjątku dlatego tez zwracam się o pomoc jak poprawnie sformułować ten warunek.
Czy poprawnie sformułowałem to w functions?
Czy powinienem jeszcze coś w pliku szablonu dodać?Nie, no to nie zadziała tak, jak byś chciał, z co najmniej kilku powodów 😉
1. Masz Custom Post Type o nazwie „pliki”? Bo właśnie na niego przekierowujesz.
2. Twoja reguła (Twój regexp) dopasowuje się do 'pliki/’ umieszczonego na końcu adresu url ($ oznacza koniec stringa). To, co chciałbyś zrobić, bardziej powinno wyglądać jakoś tak:pliki/?([^/]+)/?$
(pisane tutaj, więc może mieć bugi, ale ideę powinno zarysowywać).Pamiętaj też o tym, że jeśli dodajesz swoje reguły, to musisz sflushować rewrite rulesy – one są cache’owane w bazie, więc samo dodanie czegoś na tym hooku zbyt wiele nie da, bo ten hook nie jest wołany podczas każdych odwiedzin strony. Najłatwiej będzie w tym celu wejść w ustawienia Bezpośrednich odnośników i zapisać te ustawienia.
Jakoś udało mi się znaleźć odpowiedni artykuł na ten temat.
Dla potrzebujących wklejam linka.
http://stackoverflow.com/questions/13140182/wordpress-wp-rewrite-rulesRozwiązałem problem wykonując
function add_rewrite_rules( $wp_rewrite ) { $new_rules = array ( '(pliki)/(.+?)/page/?([0-9]{1,})/?$' => 'index.php?pagename='. $wp_rewrite->preg_index(1).'&varname='. $wp_rewrite->preg_index(2).'&page='. $wp_rewrite->preg_index(3), '(pliki)/(.*?)/?$' => 'index.php?pagename='. $wp_rewrite->preg_index(1).'&varname='. $wp_rewrite->preg_index(2) ); // Always add your rules to the top, to make sure your rules have priority $wp_rewrite->rules = $new_rules + $wp_rewrite->rules; } function query_vars($public_query_vars) { $public_query_vars[] = "varname"; return $public_query_vars; } function ebi_flush_rewrite_rules() { global $wp_rewrite; $wp_rewrite->flush_rules(); } add_action( 'init', 'flush_rewrite_rules'); add_action('generate_rewrite_rules', 'add_rewrite_rules'); add_filter('query_vars', 'query_vars');
Jak w URL wpiszę pliki/cokolwiek już WP nie generuje błędu 404
W każdym razie dzięki Krzysiek za pomoc bo nakierowałeś mnie czego dokładnie mam szukać:)
Powiedz mi jedno jeszcze. Wspomniałeś że WP zapisuje te URLE do bazy i masz racje bo jak wywalę z FUNCTIONS ten wyjątek to WP dalej pamięta go i nie generuje błędu 404. Czy idzie to gdzieś wyczyścić?OK, to tylko jedna, ale za to bardzo ważna uwaga…
NIE CHCESZ flushować rewrite rulesów w
init
. Dlaczego? Między innymi dlatego, że to jest dość złożona i kosztowna operacja, a jeśli będziesz ją wykonywał winit
, to będzie się wykonywać podczas każdej odsłony strony. (zupełnie niepotrzebnie, bo wystarczy wykonać ją jeden raz po zmianie reguł).Ponawiam temat z małym pytaniem.
Zaszła potrzeba dodania kolejnej reguły prócz /pliki
potrzebuje kolejną np. /test-adres
Kiedy robię kopiuj wklej i zamieniam pliki na test-adres otrzymuje komunikat o re deklaracji funkcji no i jest to logiczne. Wnioskuję, iż muszę zmienić coś wewnątrz funkcjifunction add_rewrite_rules( $wp_rewrite ) { $new_rules = array ( '(pliki)/(.+?)/page/?([0-9]{1,})/?$' => 'index.php?pagename='. $wp_rewrite->preg_index(1).'&varname='. $wp_rewrite->preg_index(2).'&page='. $wp_rewrite->preg_index(3), '(pliki)/(.*?)/?$' => 'index.php?pagename='. $wp_rewrite->preg_index(1).'&varname='. $wp_rewrite->preg_index(2) ); // Always add your rules to the top, to make sure your rules have priority $wp_rewrite->rules = $new_rules + $wp_rewrite->rules; }
Nie jestem zbyt biegły w tym więc pytanie moje brzmi. Jak dodać tutaj kolejny warunek, regułe?
Z oczywistych względów nie możesz przekopiować całości, bo wtedy będziesz miał 2 funkcje o tej samej nazwie, a tak być nie może.
Możesz przekopiować całość, a potem w skopiowanym kodzie zmienić nazwę funkcji, albo przekopiować tylko linijki pomiędzy nawiasami z linii 4 i 13.
- Temat ‘Pominięcie błędu 404 dla własnego skryptu.’ jest zamknięty na nowe odpowiedzi.