Подробнее об is_xxx()
В WordPress есть целое семейство функций — is_xxx()
, возвращающих информацию о том, что именно запросил пользователь.
С этими всеми функциями есть одна проблема — они отвратительно документированы. Как следствие, с неоднозначностью возвращаемых результатов приходится разбираться самостоятельно.
Вся магия, связанная с определением типа запроса, находится в файле wp-includes/query.php
(сама логика разбора реализована в методе WP_Query::parse_query()
).
Условно все переменные, передаваемые в запросе, можно разделить на семь групп, первые шесть из которых являются взаимоисключающими (в них приоритет отдаётся параметрам из группы с меньшим номером):
- 404 — страница не найдена. Обращаю внимание, что
404.php
вызывается только в том случае, если условия поиска являются однозначными и при любом наборе данных соответствуют лишь либо одной, либо ни одной записи. - Вложения (параметры
attachment
,attachment_id
,subpost
иsubpost_id
). А Вы знаете, что WordPress позволяет оставлять комментарии даже к вложениям? Если нет, то попробуйте: ссылка 1 и ссылка 2. - Записи (параметры
name
иp
; а также, если установлены все шесть параметровyear
,monthnum
,day
,hour
,minute
иsecond
); - Страницы (параметры
static
,pagename
иpage_id
) - Поиск (параметр
s
) - Архив — всё, что связано с таксономией, авторами, датой и временем (в эту группу относятся параметры
second
,minute
,hour
,day
,monthnum
,year
,m
,w
,cat
,category_name
,category__in
,category__not_in
,category__and
,tag
,tag_id
,tag__in
,tag__not_in
,tag__and
,tag_slug__in
,tag_slug__and
, параtaxonomy
иterm
,author
,author_name
); - Прочие параметры, играющие роль модификаторов (
preview
,comments_popup
,paged
и т.п.)
Поясню про приоритеты. Например, если пользователь ввёл http://blog.sjinks.org.ua/?p=336&category_name=CSS (статья с ID 336 не относится к категории CSS), WordPress будет искать только статью и полностью проигнорирует категорию.
Ниже приведена таблица, указывающая, какая функция из семейства is_xxx()
вернёт значение true
для разных категорий запросов. Как я уже говорил, первые шесть категорий являются взаимоисключающими (исключение: для первых трёх категорий функция is_singular()
вернёт true
).
Отдельно указаны Home Page и Front Page — они не относятся к категориям запросов как к таковым, но значения, возвращаемые функциями get_xxx()
, знать полезно.
Attachment | Post | Page | Search | 404 | Archive | Misc | Home Page | Front Page | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Year | Month | Day | Week | Hour/Min/Sec | Category | Tag | Taxonomy | Author | Paged | Comments Popup | Preview | ||||||||
is_404 | - | - | - | - | + | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
is_archive | - | - | - | - | - | + | + | + | + | + | + | + | ? | + | ? | ? | ? | - | - |
is_attachment | + | - | - | - | - | - | - | - | - | - | - | - | - | - | ? | ? | ? | - | - |
is_author | - | - | - | - | - | ? | ? | ? | ? | ? | ? | ? | ? | + | ? | ? | ? | - | - |
is_category | - | - | - | - | - | ? | ? | ? | ? | ? | + | ? | ? | ? | ? | ? | ? | - | - |
is_tag | - | - | - | - | - | ? | ? | ? | ? | ? | ? | + | ? | ? | ? | ? | ? | - | - |
is_tax | - | - | - | - | - | ? | ? | ? | ? | ? | ? | ? | + | ? | ? | ? | ? | ? | - |
is_date | - | - | - | - | - | + | + | + | + | + | ? | ? | ? | ? | ? | ? | ? | - | - |
is_day | - | - | - | - | - | - | - | + | - | - | ? | ? | ? | ? | ? | ? | ? | - | - |
is_month | - | - | - | - | - | - | + | - | - | - | ? | ? | ? | ? | ? | ? | ? | - | - |
is_year | - | - | - | - | - | + | - | - | - | - | ? | ? | ? | ? | ? | ? | ? | - | - |
is_time | - | - | - | - | - | - | - | - | - | + | ? | ? | ? | ? | ? | ? | ? | - | - |
is_page | - | - | + | - | - | - | - | - | - | - | - | - | - | - | ? | ? | ? | - | ? |
is_single | + | + | - | - | - | - | - | - | - | - | - | - | - | - | ? | ? | ? | - | - |
is_singlular | + | + | + | - | - | - | - | - | - | - | - | - | - | - | ? | ? | ? | - | ? |
is_search | - | - | - | + | - | - | - | - | - | - | - | - | - | - | ? | ? | ? | - | - |
is_paged | ? | ? | ? | ? | - | ? | ? | ? | ? | ? | ? | ? | ? | ? | + | ? | ? | - | - |
is_preview | ? | ? | ? | ? | - | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | + | - | - |
is_comments_popup | ? | ? | ? | ? | - | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | + | ? | - | - |
is_home_page | - | - | - | - | - | - | - | - | - | - | - | - | ? | - | ? | ? | ? | + | - |
is_front_page | - | - | - | - | - | - | - | - | - | - | - | - | - | - | ? | ? | ? | ? | + |
Легенда: если в ячейке стоит плюс (минус), то функция is_xxx()
(определяется строкой) вернёт true
(false
) для категории запроса, определяемого столбцом. Если в ячейке стоит знак вопроса, то результат может быть любым (в том плане, что категория запроса не является определяющей).
Порядок применения шаблонов в спорных случаях
В случае "сложных" запросов может возникнуть ситуация, когда результат соответствует более, чем одному шаблону. Например, для вышеприведёноой ссылки результат соответствует следующим шаблонам:
taxonomy.php
(is_tax()
возвращаетtrue
);category.php
(is_category()
возвращаетtrue
);archive.php (
is_archive()
возвращаетtrue
);index.php
(в случае, если предыдущие шаблоны не найдены).
WordPress ищет шаблоны в следующей последовательности (файлы, перечисленные слева направо, будут пробоваться именно в таком порядке):
is_404()
:404.php
;is_search()
:search.php
;is_home()
:home.php
,index.php
;is_attachment()
:<media-type>.php
,<media-subtype>.php
,<media-type>_<media-subtype>.php
,attachment.php
;is_single()
:single.php
;is_page()
:<page-template>.php
,page.php
;is_category()
:category-<cat-id>.php
,category.php
;is_tag()
:tag-<tag>.php
,tag.php
;is_tax()
:taxonomy-<taxonomy>-<term>.php
,taxonomy-<taxonomy>.php
,taxonomy.php
;is_author()
:author.php
;is_date()
:date.php
;is_archive()
:archive.php
;is_comments_popup()
:comments-popup.php
;is_paged()
:paged.php
;- если ничего не найдено:
index.php
.
Для приведённого примера (http://blog.sjinks.org.ua/?category_name=CSS&term=layout&taxonomy=post_tag) шаблоны будут "пробоваться" в следующей последовательности:
category-25.php
;category.php
;taxonomy-post_tag-layout.php
;taxonomy-post_tag.php
;taxonomy.php
;attachment.php
;index.php
.
Отдельного слова заслуживают вложения: если, например, имеется вложение с MIME-типом image/png
, WordPress будет пытаться загрузить следующие шаблоны:
image.php
(type);png.php
(subtype);image_png.php
(type/subtype);attachment.php
;index.php
.
На всякий случай отмечу: имя шаблона может быть переопределено фильтром xxx_template
, где xxx
— это archive
, category
, tag
, taxonomy
и т.п.
Стоило бы упомянуть, что некоторые из этих функций можно вызывать с параметром, например, is_page(’about’), пригодится если нужно показать в меню активную страницу.