Skip to main content

Как работают is_category() и is_tag()

Это conditional tags, которые проверяют состояние главного запроса (WP_Query) после того, как WordPress распарсил URL.

Они становятся true, если текущий запрос определён как:

  • архив категории → is_category() === true

  • архив метки → is_tag() === true


🔎 Что происходит при запросе архива

Например URL:

/portfolio/category/contract/ /portfolio/topics/asp/

После rewrite WordPress превращает это во внутренний запрос:

index.php?category_name=contract 

или

index.php?post_tag=asp 

Далее WP_Query анализирует параметры и выставляет флаги:

$query->is_category = true; $query->is_archive = true;

или

$query->is_tag = true; $query->is_archive = true;

И только после этого начинают работать:

is_category() is_tag() is_archive()

⚠ Важно: где они работают корректно

Conditional tags корректно работают:

  • после того как WordPress разобрал запрос

  • внутри pre_get_posts

  • внутри template_redirect

  • внутри шаблонов

❌ Они НЕ работают корректно внутри init, потому что запрос ещё не разобран.

📌 Почему лучше проверять через $query

В pre_get_posts безопаснее писать так:

add_action('pre_get_posts', function ($query) {
    if (is_admin() || !$query->is_main_query()) {
        return;
    }

    if (
        get_query_var('lang') === 'en' &&
        ( $query->is_category() || $query->is_tag() )
    ) {
        ...
    }

});

Почему?

Потому что:

  • глобальная is_category() работает через $wp_query

  • внутри pre_get_posts мы должны работать с конкретным $query

Это более правильно архитектурно.


📌 Что именно проверяет is_category()

По сути это проверка:

return $wp_query->is_category;

Если хотите проверить руками:

global $wp_query; var_dump($wp_query->is_category); 

💡 Итог

is_category() и is_tag():

  • зависят от разобранного запроса

  • работают после parse_query

  • безопасны в pre_get_posts и позже

  • не зависят от вашего lang, если rewrite правильный