Есть ли какие-то зацепки, которые изменяют логику 404?


27

Если в вашей теме определена страница 404, Wordpress отобразит страницу 404, если в теге $ wp_query-> query_vars определен «тег», и нет записей, соответствующих этому тегу.

Я пишу плагин, который отображает некоторую информацию на каждой странице, в дополнение к сообщениям. Я хотел бы изменить логику 404, чтобы страница 404 отображалась, если нет записей, соответствующих тегу, и плагин не может получить какие-либо данные, соответствующие этому тегу. Если плагин может найти данные, я хотел бы показать нормальную страницу, независимо от того, есть ли сообщения на этой странице или нет ...

Я гуглил, читал код, читал кодекс и копался здесь, и не смог выяснить, где Wordpress запускает этот 404, и как я могу его переопределить. (У меня есть ощущение, что это может быть связано с status_header () в functions.php, но не ясно, как и когда мне нужно подключиться к нему).

Любая помощь / идеи / просвещение приветствуется.

Спасибо,

Патч

Ответы:


29

Немного поторопившись с кодом и поиском в Google, я нашел ответ. Он содержится в этой теме (см. Пост Otto42), но для записи добавление следующего к вашему плагину заменит обработку 404 для указанных вами условий:

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;
    }
}

Обратите внимание, что вам нужно установить «is_404» в false до того, как PHP выведет заголовки, поэтому перехватывать его в логике template_redirect - хорошая идея.

Патч


5

Мне нужно было сделать то же самое для пользовательского проекта, где всегда было 200 страниц, и обнаружил, что вы также можете просто добавить это в начало вашего файла шаблона (над get_header ();)

global $wp_query;
status_header( 200 );
$wp_query->is_404=false;

1
Большой! Это сработало для меня. Я делал свой скрипт, и он генерировал 404. Я пробовал запускать скрипты из wp-> main, но это было не совсем чистое решение. Это сработало для меня:// 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

Создайте 404.phpфайл шаблона в своей теме и настройте его по мере необходимости (добавив вывод плагина или что-то еще) Вы упомянули в своей теме , что именно не так с этим подходом для вас?

Кодекс, создающий страницу ошибки 404


То, что я ищу, - это способ изменить обстоятельства, при которых эта страница 404 срабатывает. Прямо сейчас, если Wordpress не может найти посты, соответствующие тегу в запросе, появляется страница 404. Я хотел бы добавить дополнительный код, который обеспечивает отображение страницы 404 только в том случае, если Wordpress не может найти ни одной записи, а мой плагин не может найти дополнительную информацию для отображения.
Патч

Цель 404 состоит в том, чтобы посетитель знал, что ссылка неверна, и чтобы вы регистрировали ее и исправляли (при необходимости). Вы не хотите ни сообщать посетителю, что он использует неработающую ссылку, либо знать об этом самостоятельно. Отображение информации на 404 работает просто отлично, угонять ее не обязательно, так зачем беспокоиться? Просто пытаюсь понять вашу логику и / или технические детали.
Первый

1
То, что я искал, было способом изменить определение того, какие страницы являются «неправильными». Сайт, который я создаю, имеет компонент блога, но это еще не все. Я использую теги Wordpress как для отображения сообщений Wordpress, так и для загрузки дополнительного контента через плагин. Я хочу вернуть код состояния 200, если либо a) есть сообщения, либо b) мой плагин может найти материал для отображения, соответствующий тегу. Таким образом, необходимо изменить логику. Несмотря ни на что, спасибо, что нашли время написать ответ - извините, что моя проблема была достаточно странной, чтобы нуждаться в более сложном ответе :-)
Патч
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.