Czy są jakieś haki, które zmieniają logikę 404?

27

Pod warunkiem, że masz zdefiniowaną stronę 404 w temacie, Wordpress wyświetli stronę 404, jeśli „tag” jest zdefiniowany w $ wp_query-> query_vars i nie ma żadnych postów pasujących do tego tagu.

Piszę wtyczkę, która oprócz postów wyświetla pewne informacje na każdej stronie. Chciałbym zmienić logikę 404, aby strona 404 była wyświetlana, jeśli nie ma wpisów pasujących do tagu, a wtyczka nie może pobrać żadnych danych pasujących do tego tagu. Jeśli wtyczka może znaleźć dane, chciałbym wyświetlić normalną stronę, niezależnie od tego, czy są na niej posty, czy nie ...

Byłem w Google, czytam kod, czytam kodeks i grzebię tutaj, i nie byłem w stanie dowiedzieć się, gdzie Wordpress wyzwala to 404 i jak mogę to zmienić. (Mam wrażenie, że może to mieć coś wspólnego ze status_header () w functions.php, ale nie jest jasne, jak i kiedy muszę się do tego przyłączyć).

Doceniamy wszelką pomoc / pomysły / oświecenie.

Dziękuję Ci,

~ Łatka

Łata
źródło

Odpowiedzi:

29

Po nieco więcej przeszukiwaniu kodu i Googlingu znalazłem odpowiedź. Jest zawarty w tym wątku (patrz post Otto42), ale dla przypomnienia, dodanie następującego dodatku do wtyczki zastąpi obsługę 404 dla określonych warunków:

add_filter('template_redirect', 'my_404_override' );
function my_404_override() {
    global $wp_query;

    if (<some condition is met>) {
        status_header( 200 );
        $wp_query->is_404=false;
    }
}

Zauważ, że musisz ustawić „is_404” na false, zanim PHP wypisze nagłówki, dlatego dobrym pomysłem jest podpięcie go do logiki template_redirect.

~ Łatka

Łata
źródło
5

Musiałem zrobić to samo dla niestandardowego projektu, w którym zawsze była 200 stron, i odkryłem, że możesz też po prostu dodać to na górze pliku szablonu (powyżej get_header ();)

global $wp_query;
status_header( 200 );
$wp_query->is_404=false;
brak wejścia
źródło
1
Świetny! To zadziałało dla mnie. Tworzyłem swój skrypt, który wygenerował 404. Próbowałem wykonywać skrypty runnig z wp-> main, ale nie było to całkiem czyste rozwiązanie. To zadziałało dla mnie:// configuration require('./wp-load.php'); // init WP (inits objects, language and stuff). wp(); // fix title (this is not 404) $wp_query->is_404 = false; // doesn't fix the actual 404 status status_header( 200 ); // but this does :-)
Nux
1

Utwórz 404.phpplik szablonu w motywie i dostosuj w razie potrzeby (dodając wyjście wtyczki lub cokolwiek innego). Wspominasz zdefiniowane w swoim motywie , co dokładnie jest złe w tym podejściu?

Kodeks Tworzenie strony błędu 404

Rarst
źródło
To, czego szukam, to sposób na zmianę okoliczności, w których strona 404 zostaje uruchomiona. W tej chwili, jeśli Wordpress nie może znaleźć żadnych wpisów pasujących do tagu w zmiennych zapytań, pojawi się strona 404. Chciałbym dodać dodatkowy kod, który zapewnia, że ​​strona 404 pojawia się tylko wtedy, gdy Wordpress nie może znaleźć żadnych postów, a moja wtyczka nie może znaleźć żadnych dodatkowych informacji do wyświetlenia.
Łatka
Celem 404 jest, aby użytkownik wiedział, że link jest nieprawidłowy oraz abyś go zalogował i naprawił (w razie potrzeby). Nie chcesz ani mówić odwiedzającemu, że korzysta z niedziałającego linku, ani sam o tym wiedzieć. Wyświetlanie informacji na 404 działa dobrze, przejmowanie ich nie jest wymogiem, więc po co się tym przejmować? Próbuję po prostu zrozumieć swoją logikę i / lub szczegóły techniczne.
Rarst
1
To, czego szukałem, to sposób na zmianę definicji „niewłaściwych” stron. Witryna, którą tworzę, zawiera komponent blogowy, ale to nie wszystko. Używam tagów Wordpress zarówno do wyświetlania postów Wordpress, jak i pobierania dodatkowej zawartości za pośrednictwem wtyczki. Chcę zwrócić kod stanu 200, jeśli albo a) są posty lub b) moja wtyczka może znaleźć rzeczy do wyświetlenia pasujące do tagu. Zatem potrzeba ponownego połączenia logiki. Niezależnie od tego, dziękuję za poświęcenie czasu na napisanie odpowiedzi - przepraszam, że mój problem był na tyle dziwny, że potrzebowałem bardziej zaangażowanej odpowiedzi :-)
Poprawka