Skip to main content

Установка $wp_query->set_404()

После выполнения:

$wp_query->set_404();

WordPress:

  • устанавливает $wp_query->is_404 = true

  • сбрасывает другие флаги (is_single, is_page, is_archive и т.д.)

  • меняет внутреннее состояние запроса


✅ Как проверить, что запрос стал 404

🔹 1. Через условную функцию (рекомендуется)

if ( is_404() ) {
    // это 404
}

Это самый правильный способ.


🔹 2. Через объект $wp_query

global $wp_query;

if ( $wp_query->is_404 ) {
    // это 404
}

или

if ( $wp_query->is_404() ) {
    // тоже работает
}

📌 Важно

После set_404():

$wp_query->is_single     → false
$wp_query->is_page       → false
$wp_query->is_archive    → false
$wp_query->is_category   → false
$wp_query->is_tag        → false
$wp_query->is_404        → true

То есть WP "переквалифицирует" запрос полностью.


⚠ Частая ошибка

Если вы проверяете это внутри pre_get_posts, то is_404() работать не будет корректно, потому что:

  • pre_get_posts выполняется ДО финального определения типа запроса

  • 404 логика применяется позже

Проверять 404 корректно в:

template_redirect
wp
template_include

🧠 Пример

add_action('template_redirect', function() {
    if ( is_404() ) {
        error_log('Это 404 страница');
    }
});

🎯 Если нужно понять: вы сами установили 404 или WordPress

Можно добавить свой флаг:

global $wp_query;

$wp_query->set_404();
$wp_query->custom_en_404 = true;

И потом:

if ( !empty($wp_query->custom_en_404) ) {
    // это именно ваша логика
}