Условные теги в WordPress

В этой статье я постараюсь доходчиво объяснить что такое «условные теги в WordPress» (Conditional Tags). Полный список условных тегов смотрите на этой странице.

Условные теги так называются, потому что, сюрприз-сюрприз, проверяют выполняется ли кое-либо условие. На деле, условные теги — это вспомогательные PHP функции WordPress. А называют их «тегами», чтобы выделить из числа прочих PHP функций.

В большинстве своем, условные теги созданы для удобного выполнения проверок различных условий, например: находимся ли мы на главной странице сайта, авторизован ли пользователь и т.д.

Характеристики условных тегов в WordPress:

  • Каждый из тегов создан для проверки определенного условия. Грубо говоря любую функцию начинающуюся с is_ можно назвать условным тегом.

  • Некоторые условные теги могут принимать параметры. Например, is_page( 20 ) - проверяет ID текущей страницы. Если ID равен 20 то условие выполняется (тег срабатывает).

  • Любой условный тег возвращает логическое значение: true или false (правда или ложь). На основе этого ответа можно что-либо делать или не делать.

С условными тегами очень тесно связана иерархия файлов темы.

ВАЖНО: нельзя использовать теги до срабатывания хука parse_query, то есть их нужно использовать начиная с хука wp, потому что до этого хука еще нет данных для правильной работы условных тегов (не заполнены глобальные переменные, которыми пользуются условные теги).

Таким образом, условный тег не будет работать, если использовать его в теле файла темы functions.php, потому что этот файл подключается раньше чем срабатывает хук wp. Обычно условные теги в файле functions.php используются внутри других функций или хуков.

Пример использования Условных тегов

Предположим нам нужно вывести ссылку в подвале и сделать это нужно только на главной странице сайта. Для этих целей в WordPress есть условный тег is_front_page(), или его аналог is_home(). Эти функции вернут true, только в том случае, если страница на которой находится посетитель — это главная страница. В коде это выглядит так:

<?php
if( is_front_page() ){
	echo '<a href="http://example.com">Текст ссылки</a>';
}
?>

Вместо HTML может быть PHP код, который будет выполнятся только на главной странице. Вместо is_front_page() может быть is_home(). Это похожие условные теги, разницу смотрите ниже.

Список Условных тегов WordPress

Самый полный список условных тегов смотрите по этой ссылке.

is_home() (основная страница)
Возвращает true, если это основная страница блога. Под основной понимается контент установленный для главной страницы, т.е. если установить в настройках (параметры > чтение) показ Постоянной страницы на главной странице, то этот тег будет работать только для этой установленной Постоянной страницы, а не для главной.
is_front_page() (главная страница)
Возвращает true, если вы на главной странице, независимо от того, что установлено в настройках. Страницы пагинации (/page/2 и т.д.) не учитываются.
is_single() (Страница отдельной записи (поста))

Функция принимает параметры: ID записи, заголовок записи, ярлык записи или массив из любых этих параметров.

if( is_single() ){ ... }     // сработает для любого поста
if( is_single(10) ){ ... }   // сработает если это пост ID которого равен 10
if( is_single('Привет мир') ){ ... } // сработает если это пост с заголовком "привет мир"
if( is_single('privet_mir') ){ ... } // сработает если это пост со слагом "privet_mir"
// Вариант с массивом
if( is_single( array('10','Привет мир','new_post') ) ){ ... }
// сработает если это пост у которого ID равен 10, или заголовок "Привет мир", или слаг "new_post".
is_page() (страница Постоянной страницы)
Страница типа page. Функция принимает такие же параметры как и is_single(): ID страницы, Заголовок страницы, Слаг страницы или массив из любых этих параметров.
is_page_template() (шаблон страницы)

Если это страница шаблона для Постоянной страницы. Функция может принимать параметр название файла шаблона.

if ( is_page_template() ){ ... } // сработает на постоянной странице, для которой используется отдельный шаблон
if ( is_page_template('my_page.php') ){ ... } // сработает на постоянной странице, для которой используется отдельный шаблон с названием файла my_page.php
is_singular() (любая одиночная страница)
Любая одиночная страница, к ним относятся посты, постоянные страницы и созданные типы записей. Это короткая запись такой проверки: if( is_page() || is_single() ).
is_year() (архив за год)
Архив за год (example.com/2010)
is_month() (архив за месяц)
Архив за месяц (example.com/2010/06)
is_day() (архив за день)
Архив за день (example.com/2010/06/02)
is_time() (архив по времени)
Архив по времени.
is_date() (страница любого типа даты)

Страница даты (общий условный тег). Это короткая запись такой проверки:

if( is_year() or is_month() or is_day() or s_time() )
is_author() (страница автора)

Страницы с выводом постов автора. Функция принимает параметры: ID автора, Имя автора и Ник автора. Так же, можно передать сразу несколько параметров в массиве. Пример записи:

if ( is_author() ) { ... }     // сработает для любых страниц автора
if ( is_author(10) ) { ... }   // сработает если отображается страница автора с ID равным 10
if ( is_author('Виктор') ) { ... } // сработает если отображается страница автора с именем "Виктор"
if ( is_author('Viktor') ) { ... } // сработает если отображается страница автора с Ником "Viktor"
// Вариант с массивом
if ( is_author( array('10','Виктор','Viktor') ) ) { ... }
// сработает если отображается страница  автора с ID 10, или Именем "Виктор", или Ником "Viktor".
is_archive() (любая страница архива)
Если это любая из страниц типа: категорий, меток, дат, авторов, таксономий (в WP 3.0). Общий условный тег.
is_post_type_archive() (страница архива типа записи)
Если это страница архива произвольного типа записей. Например, у нас есть тип записи knigi и при его регистрации мы указали, что у него есть страница архива, тогда её Url будет такой: example.com/knigi. Этот условный тег будет срабатывать на такой странице.
is_paged() (страницы пагинации)
Если страницы пагинации (/page/2 или /page/3 и т.д.)
is_category() (страница категории)
Если страница категории.
cat_is_ancestor_of() (является ли одна рубрика дочерней к другой)
Проверяет, является ли одна рубрика дочерней к другой указанной (проверяются все уровни ветки).
is_tag() (страница метки)

Если страница метки. Функция может принимать параметры: Слаг(название) метки или массив из названий. Пример:

if ( is_tag() ) { ... }              // сработает для любых страниц меток/тегов
if ( is_tag('wordpress') ) { ... }    // сработает для страницы метки/тега Слаг (название), которого равен 'wordpress'
// вариант с массивом
if ( is_tag( array('wordpress','tag_name' ) ) { ... }   // сработает для страницы метки/тега Слаг (название), которого равен wordpress или tag_name
is_tax() (страница любой таксономии)

Если это страница любой таксономии (стандартно это страницы категорий или меток). может принимать два параметра, название таксономии и название элемента текущей таксономии:

if ( is_tax('category') ) { ... }                   // сработает, если в запросе открываемой страницы присутствует таксономия category. Тоже самое, что is_category()
if ( is_tax('category','category_slug') ) { ... }   // сработает, если это страница категории, слаг (ярлык) которой равно category_slug. Т.е. для конкретной категории.
// можно передавать массивы
if ( is_tax( array('category','post_tag') , array('tax_name1','tax_name2') ) ) { ... }
// сработает, если это страница категории или метки, название которой равно tax_name1 или tax_name2
Если страница результатов поиска.
is_404() (страница 404)
Если страница ошибки 404.
is_attachment() (страница вложения)
Если это отдельная страница прикрепленного файла (обычно картинки).
is_admin() (страница админки)
Если это страница админки блога.
is_user_logged_in() (пользователь авторизован)
Срабатывает если юзер залогинен.
current_user_can('право') (проверяет право пользователя)
Проверяет права пользователя, совершать то или иное действие. Право пользователя указывается в параметре функции. Полный список прав смотрите в кодексе. Например: if( current_user_can('manage_options') ){ ... } - это условие проверит, может ли текущий пользователь редактировать опции, обычно такое право есть у пользователя с правами Админимтратора.
have_posts() (есть записи для вывода)
Если текущий запрос ВП вернул данные для построения цикла loop, проще говоря, если есть посты на странице.

Условные теги и проверки предназначенные для отдельных страниц или постов

Следующие условные теги (проверки) будут работать только на отдельных страницах, говоря языком этой статьи, если выполняется условие: is_single(), is_page() или is_singular()

has_tag() (у поста есть метки)

Если у поста есть метки. Функция может принимать параметр название метки или массив с несколькими названиями меток. Пример:

if ( has_tag() ) { ... }           // сработает если у поста есть хотя бы одна метка
if ( has_tag('tag_name') ) { ... } // сработает если у поста есть метка с названием tag_name
// Вариант с массивом
if ( has_tag( array('tag_name','tag_name2') ) ) { ... }
// сработает если у поста есть метка с названием tag_name или tag_name2
in_category( 10 ) (запись находится в категории 10)
Если запись находится в категории ID которой равен 10. Можно использовать внутри цикла Loop.
have_comments() (у поста есть комментарии)
Если у поста есть комментарии.
pings_open() (открыты уведомления)
Если пост принимает уведомления, т.е. открыты пинги.
$wp_query->query_vars[cpage](страница пагинации комментариев)
Если это страница пагинации комментариев. (/comment-page-1 /comment-page-2 и т.д.)
$post->post_excerpt(у поста есть "Цитата")
Если у поста есть "Цитата" (excerpt).
$post->post_parent == 20(ID родительской страницы равен 20)
Если ID родительской страницы равен 20. Работает только для постоянных страниц. Может также пригодится для вложений (файлы).

Редкие условные теги WordPress (используются редко или предназначены не для шаблонов)

  • is_sticky() — Проверяет прилеплен ли текущий пост к главной странице сайта. Условный тэг.
  • is_comment_feed() — Проверяет, является ли запрос, страницей фида комментариев. Условные тег.
  • is_comments_popup() — Determines whether the current URL is within the comments popup window.
  • is_preview() — Проверят находится ли пользователь на странице предпросмотра записи. Условный тег
  • is_trackback() — Проверяет, является ли текущий запрос запросом на страницу пингов (trackback)
  • is_feed() — Проверяет запрашивается ли в текущий момент фид.