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

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

```php
$wp_query->set_404();
```

WordPress:

- устанавливает `$wp_query->is_404 = true`
- сбрасывает другие флаги (is\_single, is\_page, is\_archive и т.д.)
- меняет внутреннее состояние запроса

---

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

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

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

```

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

---

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

```php
global $wp_query;

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

```

или

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

```

---

#### 📌 Важно

После `set_404()`:

```php
$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

```

---

#### 🧠 Пример

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

```

---

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

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

```php
global $wp_query;

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

```

И потом:

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

```