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

Условные теги WordPress
Условные теги (Conditional Tags) можно использовать в файлах-шаблонах Темы для того, чтобы указывать какой контент отображать на определенной странице в зависимости от того, выполнены ли какие-либо из заданных условий для этой страницы. Например, вы можете отображать какой-то текст только на главной странице. C условным тегом is_home () сделать это легко.
Работа всех условных тегов построена на том, чтобы в тот момент, когда выполнено конкретное условие, вернуть TRUE (т.е. сработать). Все возможные условия перечислены ниже.

Главная страница

is_home ()
Когда отображается главная страница (в WordPress 2.1 эта функция работает по-другому, чем в более старых версиях WordPress, смотрите static Front Page.)

Главная страница (новый тег)

is_front_page ()
Когда отображается главная страница блога, вне зависимости от того, что на ней выводится: записи или Статическая Страница. Срабатывает когда показывается главная страница блога, при этом не важно что стоит в настройках: Настройки->Чтение->На главной странице отображать Ваши последние записи или Постоянная страница. Кстати: этот условный тег добавлен в WordPress версии 2.5 и выше.

Панель администратора

is_admin ()
Когда отображается Доска объявлений или меню администратора.

Одиночная запись

is_single ()
Когда отображается одиночный пост.
is_single ('17')
Когда отображается одиночный пост с id=17.
is_single ('Irish Stew')
Когда отображается одиночный пост с заголовком «Irish Stew».
is_single ('beef-stew')
Когда отображается одиночный пост с короткой ссылкой beef-stew.
is_single (array (17,'beef-stew','Irish Stew'))
Когда отображается одиночный пост, при этом должно сработать хотя бы одно условие из трех для этой записи: 1) ID 17 или 2) короткая ссылка «beef-stew» или 3) заголовок «Irish Stew». Кстати: возможность использования массива была добавлена в WordPress версии 2.5.

Любая страница, на которой выводятся записи

comments_open ()
Когда комментарии разрешены для текущего Поста, обрабатываемого в Цикле.
pings_open ()
Когда пинги разрешены для текущего Поста, обрабатываемого в Цикле.

Постоянные страницы

Это относится только к Постоянным страницам.

is_page ()
Когда отображается Постоянная страница.
is_page ('42')
Когда отображается Постоянная страница с id=42
is_page ('About Me And Joe')
Когда отображается Постоянная страница с заголовком «About Me And Joe».
is_page ('about-me')
Когда отображается Постоянная страница с короткой ссылкой «about-me».
is_page (array (42,'about-me','About Me And Joe'))
Когда отображается Постоянная страница, при этом должно сработать хотя бы одно условие из трех для этой Постоянной страницы: 1) ID 42 или 2) короткая ссылка «about-me» или 3) заголовок «About Me And Joe». Кстати: возможность использования массива была добавлена в WordPress версии 2.5.

Дочерние страницы Постоянной страницы

Такого условного тега как is_subpage () не существует, но вы можете использовать такой код:

<?php
// Get $post if you're inside a function
global $post;
if (is_page() && $post->post_parent ) {
// This is a subpage
} else {
// This is not a subpage
}
?>

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

  • на Постоянной странице (ID=2) с короткой ссылкой about и всех ее подстраницах-дочках баннер home.jpg
  • на Постоянной странице (ID=56) с короткой ссылкой learning и всех ее подстраницах-дочках баннер teaching.jpg
  • * и т.д.

<?php if (is_page(about) || $post->post_parent=="2") {
$bannerimg="home.jpg";
} elseif (is_page(learning) || $post->post_parent=="56") {
$bannerimg="teaching.jpg";
} elseif (is_page(admissions) || $post->post_parent=="15") {
$bannerimg="admissions.jpg";
} else {
$bannerimg="home.jpg" ; // Fall-through
}
?>

Используется ли индивидуальный шаблон страницы

Начиная с WordPress версии 2.5 и выше можно определить, какой Индивидуальный шаблон используется для вывода конкретной страницы.

is_page_template ()
Используется ли какой-либо индивидуальный шаблон для отображения Постоянной страницы?

is_page_template ('about.php')
Используется ли индивидуальный шаблон 'about.php'? Заметьте, что этот условный тег в отличие от остальных, если вы хотите определить конкретный шаблон Постоянной страницы, то используйте имя файла, т.е. about.php или my_page_template.php.

Страница рубрики

is_category ()
Когда отображается рубрика.
is_category ('9')
Когда отображается рубрика с ID=9.
is_category ('Stinky Cheeses')
Когда отображается рубрика с названием «Stinky Cheeses».
is_category ('blue-cheese')
Когда отображается рубрика с короткой ссылкой «blue-cheese».
is_category (array (9,'blue-cheese','Stinky Cheeses'))
Когда отображается рубрика, при этом должно сработать хотя бы одно условие из трех для этой рубрики: 1) ID 9 (term_ID) или 2) короткая ссылка «blue-cheese» или 3) название «Stinky Cheeses». Кстати: возможность использования массива была добавлена в WordPress версии 2.5.
in_category ('5')
Когда отображается одиночная запись, которая находится в рубрике с ID=5. Подробнее тут

Кстати: запомните, что is_category и in_category это совершенно разные условные теги!

Страница тега (метки)

is_tag ()
Когда отображается страница архива тега (список постов с этим тегом).
is_tag ('mild')
Когда отображается страница архива тега 'mild'.
is_tag (array ('sharp','mild','extreme'))
Когда отображается архив тега, при этом должно сработать хотя бы одно условие из трех для этой страницы: 1) короткая ссылка «sharp», «mild», или «extreme». Кстати: возможность использования массива была добавлена в WordPress версии 2.5.
has_tag ()
Когда текущий пост имеет тег. Используется внутри Цикла. Кстати: возможность использования массива была добавлена в WordPress версии 2.6.
has_tag ('mild')
Когда текущий пост имеет тег 'mild'.
has_tag (array ('sharp','mild','extreme'))
Когда текущий пост имеет тег какой-либо тег из перечисленных в массиве.

Страница автора

is_author ()
Когда отображается страница автора.
is_author ('4')
Когда отображается страница автора, у которого ID=4.
is_author ('Vivian')
Когда отображается страница автора с ником «Vivian».
is_author ('john-jones')
Когда отображается страница автора с именем «john-jones».
is_author (array (4,'john-jones','Vivian'))
Когда отображается страница автора, при этом должно сработать хотя бы одно условие из для этой страницы: ID автора = 4, имя «john-jones», или ник «Vivian». Кстати: возможность использования массива была добавлена в WordPress версии 2.5.

Страница даты

is_date ()
Когда отображается архив любого периода времени (за месяц, за год, за день или архив основанный на дате).
is_year ()
Когда отображается архив за год.
is_month ()
Когда отображается архив за месяц.
is_day ()
Когда отображается архив за день.
is_time ()
Когда отображается почасовой архив за час, поминутный или посекундный.

Страница архива

is_archive ()
Когда отображается любой тип архива, буть то рубрика, страница тега, страница автора и даты.

Страница результатов поиска

is_search ()
Когда отображается страница результатов поиска.

Страница ошибки 404 (ничего не найдено)

is_404 ()
Когда на какой-либо странице случается ошибка «HTTP 404: Не найдено».

2,3,4 и т.д. страницы

is_paged ()
Когда отображается 2, 3 и т.д. страницы блога. Это относится к страницам архива или главной странице блога, когда вы переходите по ссылке Ранее (в Теме default) или на 2, 3, 4 и т.д. страницы (когда используется плагин типа wp-pagenavi). Это не относится к разбиению поста или Постоянной страницы на страницы с помощью тега <!--nextpage--> QuickTag.

Аттачмент (прикрепленный файл)

is_attachment ()
Когда отображается на отдельной (своей) странице аттачмент (прикрепленный файл) к посту или Постоянной странице. Обычно это картинка или любой другой файл, загруженный через стандартный загрузчик при написании/редактировании поста или Постоянной страницы. Аттачменты можно отображать на их собственной странице и использовать для них свой шаблон в папке Теме. для более детальной информации посетите страницу Using Image and File Attachments.

RSS лента

is_feed ()
Этот условный тег обычно не используется обычными пользователями, а используется самим WordPress или разработчиками плагинов.

Трэкбек

is_trackback ()
Этот условный тег обычно не используется обычными пользователями, а используется самим WordPress или разработчиками плагинов.

Предпросмотр

is_preview ()
Когда отображается одиночный неопубликованный пост в режиме предпросмотра.

Есть ли цитата (excerpt) у поста?

!empty ($post->post_excerpt)
Штатного способа проверки на существование цитаты (excerpt) у поста НЕТ, но вы можете использовать приведенный выше код. Удалите восклицательный знак '!' из этого кода чтобы выполнять проверку 'нет цитаты'.

Работающие примеры

Здесь несколько примеров для демонстрации того, как следует использовать условные теги.

Одиночный пост

Этот пример показывает как использовать условный тег is_single () для того, чтобы отобразить информацию только на странице одиночного поста:

<?php if (is_single())
{
echo 'Это один из постов в рубрике ' . single_cat_title() . ', вот так!';
}
?>

Разница, основанная на дате

Если кто-то просматривает ваш блог по датам, то он увидит «помеченные» посты разных лет разным цветом бэкграунда:

<?php
// начинаем Цикл
if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<h2 id="post-<?php the_ID(); ?>">
<a href="<?php the_permalink() ?>" rel="bookmark" title="Постоянная ссылка <?php the_title(); ?>">
<?php the_title(); ?></a></h2>
<small><?php the_time('F jS, Y') ?> <!-- by <?php the_author() ?> --></small><?php
// если отображаем архив даты
if (is_date())
{
if (date('Y') != get_the_date('Y'))
{
// этот пост был написан в прошлом году
// поэтому припишем css класс "oldentry" к блоку с постом,
// чтобы придать ему отличный от других блоков вид
echo '<div class="oldentry">';
} else {
echo '<div class="entry">';
}
} else {
echo '<div class="entry">';
}
the_content('Далее »');
?>
</div>

Разный контент в боковой колонке (сайдбаре)

Этот пример выводит различный контент в боковой колонке в зависимости от того, какой тип контента просматривается в текущий момент.

<!-- начало боковой колонки -->
<div id="sidebar">
<?php
// let's generate info appropriate to the page being displayed
if (is_home()) {
// на главной странице покажем список рубрик первого уровня:
echo "<ul>";
wp_list_cats('optionall=0&sort_column=name&list=1&children=0');
echo "</ul>";
} elseif (is_category()) {
// на странице рубрики покажем все рубрики всех уровней
echo "<ul>";
wp_list_cats('optionall=1&sort_column=name&list=1&children=1&hierarchical=1');
echo "</ul>";
} elseif (is_single()) {
// на странице одиночного поста покажем... что-нибудь, впишите сами:

} elseif (is_page()) {
// на странице Постоянной страницы. А какой именно?
if (is_page('Обо мне')) {
// Постоянная страница About
echo "<p>Это страница обо мне!</p>";
} elseif (is_page('Используемые плагины')) {
echo "<p>На этой странице список используемых плагинов, я использую WordPress версии " . bloginfo('version') . "</p>";
} else {
// для всех других Статичных страниц
echo "<p>Привет, я Педро!</p>";
}
} else {
// для всех остальных типов страниц (архивов, страницы рез-тов поиска, 404 ошибки и т.д.)
echo "<p>Педро славный парень.</p>";
} // на этом все!
?>
<form id="searchform" method="get" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<div>
<input type="text" name="s" id="s" size="15" />
<input type="submit" value="<?php _e('Search'); ?>" />
</div>
</form></div>
<!-- конец боковой колонки -->

Полезная страница ошибки 404

Когда посетитель получает 404 ошибку, то может растеряться. Вы можете извлечь некоторую пользу для себя, т.к. каждый раз, как кто-то попадает на несуществующую страницу вам будет отправляться автоматическое письмо-уведомление.

<p>You
<?php
#некоторые переменные для скрипта
#вы можете тут что-то поменять по своему усмотрению.
$adminemail = get_bloginfo('admin_email');
#эл. адрес администратора, указанный в настройках блога
$website = get_bloginfo('url');
#урл блога
$websitename = get_bloginfo('name');
#имя вашего блога
if (!isset($_SERVER['HTTP_REFERER'])) {
#politely blames the user for all the problems they caused
echo "tried going to "; #starts assembling an output paragraph
$casemessage = "Не все потеряно!";
} elseif (isset($_SERVER['HTTP_REFERER'])) {
#это поможет посетителю найти то, что ему нужно, а администратор будет уведомлен об этом кривом адресе странички
echo "кликните сюда"; #now the message says You clicked a link to...
#опеределяем сообщение, которое прийдет администратору
$failuremess = "Кто-то пытался перейти сюда: $website"
.$_SERVER['REQUEST_URI']." и получил 404 ошибку (страница не найдена). ";
$failuremess .= "Проверьте эту страницу и исправьте положение дел
Он пришел отсюда: ".$_SERVER['HTTP_REFERER'];
mail($adminemail, "Плохая ссылка на ".$_SERVER['REQUEST_URI'],
$failuremess, "От: $websitename <[email protected]$website>"); #email you about problem
$casemessage = "Уведомление о 404 ошибке отправлено администратору.";#set a friendly message
}
echo " ".$website.$_SERVER['REQUEST_URI']; ?>
and it doesn't exist. <?php echo $casemessage; ?> Вы можете вернуться назад
и попробовать снова, или поищите так:
<?php include(TEMPLATEPATH . "/searchform.php"); ?>
</p>

Перевод статьи Кодекса WordPress: Conditional Tags. За перевод огромное спасибо Sonike.

Рубрика: Учебник WordPress | 17 марта 2009

Предыдущие записи из рубрики `Учебник WordPress`

16 комментариев

Дмитрий, 17.11.2009 в 01:11

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

Одно только немного озадачило - нет возможности подписаться по почте на вашу ленту новостей. Мне какжется это должно быть обязательно.

Успехов вам. А я буду потихоньку знакомиться с представленной вами здесь информацией. Спасибо за ваш труд. =)

ОтветитьОтветить
Deimos, 17.11.2009 в 09:44

Дмитрий, как нельзя?) Вверху справа кнопка "ПОЛУЧАТЬ RSS НА EMAIL".
Спасибо за добрые слова, будем стараться дальше в таком же духе 😉

ОтветитьОтветить
Илья, 26.11.2009 в 15:37

Спасибо! Отличный мануал, очень помог.

ОтветитьОтветить
инкормедиа, 16.10.2010 в 14:47

как.. хорошо подобрали..

ОтветитьОтветить
Manager, 13.06.2011 в 15:34

Крутая статья! 🙂 оч понравилась!

ОтветитьОтветить
Макс, 02.08.2011 в 14:07

У меня такой вопрос - направить меня нужно в правильную сторону.

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

В адресе у меня отображается либо категория
http://site.ru/category/notes
если показаны все записи в ней

либо категория с подкатегорией
http://site.ru/category/notes/podkategoria1
http://site.ru/category/articles/podkategoria2
http://site.ru/category/questions/podkategoria3
если выбрана одна из подкатегорий.

так вот как мне в сайдбаре определить что идет вывод podkategoria3 и показать станицу как http://site.ru/category/questions/

Как то сумбурно получилось.. но смысл такой - мне надо определять какой родительской категории относиться текущая запись или текущее записи показанные на станице( каждая из низ модет иметь различные категории но общую родительскую)

ОтветитьОтветить
kama, 02.08.2011 в 21:16

Макс, чет не понятно, что вам нужно 🙂 Если вам нужно определить родительскую категорию текущей и вывести список подкатегорий этой родительской, то используйте для определения род. категории функцию get_ancestors(), а для вывода подкатегорий базовую функцию: wp_list_categories('child_of=...').

ОтветитьОтветить
Макс, 03.08.2011 в 14:31

Что такое $cat_ID = get_query_var('cat'); ?

ни где не могу найти объяснение.

$thisCat = get_category(get_query_var('cat'),false); и это что за конструкция ?

Смысл в том что они возращают id категории я даже скомбинировав их получил то что хотел, однако не пойму как это работает и что это значит, наверняка есть более простой способ. на моем сайте можно глянуть то чего я хочу добиться более простым способом. http://tlt-invest.ru/notes нужно переключаться между Заметки, Статьи и Вопросы-ответы

ОтветитьОтветить
kama, 03.08.2011 в 19:51

Макс, чтобы получить ID родительской рубрики категории в которой находится статья, используйте такой код:

if( is_single() ){
	$Cat = get_the_category(); 
	$ansestors = get_ancestors( $Cat[0]->cat_ID, 'category' ); 
	$ansestors = array_reverse($ansestors);
	$cat_ID = $ansestors[0]; // ID родительской рубрики
}
wp_list_categories('child_of='.$cat_id);


Что касается непонятного вам кода:

get_query_var('cat')

- получает ID текущей категории на странице категорий.

get_category(get_query_var('cat'), false);

Получает все данные текущей категории на странице категорий.

ОтветитьОтветить
Макс, 06.08.2011 в 01:19

Спасибо Ваш код работает именно так как я хотел! Правда я чуток поковырялся и сделал немного подругому:

function get_current_cat_id(){


	if( is_category() ) {
		$curent_id = get_query_var('cat');
		$cat = get_category($curent_id,false);
		$parrentCategory_id=$cat->category_parent;
		if( $parrentCategory_id == 0) {
			$parrentCategory_id = $curent_id;
		}
	} else {
		if( is_single() ){
			$cat = get_the_category();
			$parrentCategory_id=$cat[0]->category_parent;
		}
    }
    return $parrentCategory_id;
}

это тоже работает, хотя честно говоря я до конца все ньансы не понял. Например, почему тут так -

		$cat = get_category($curent_id,false);
		$parrentCategory_id=$cat->category_parent;

а тут уже так -

	$cat = get_the_category();
	$parrentCategory_id=$cat[0]->category_parent;

в моем понимании get_category и get_the_category почти одинаковые функции должны быть.

ОтветитьОтветить
Макс, 06.08.2011 в 01:25

И еще вопрос если уж так пошло. У меня там должен быть раздел вопросы-ответы, я хочу чтобы люди задавали через форму вопросы, вопросы должны в ленте отображаться в виде поста и снизу ответ, ну обычная в общем система. Так вот, я хочу свой ответ давать в виде коммента к посту, можно ли в ленте разместить сами посты и по одному первому кооменту к каждому из них ?

ОтветитьОтветить
kama, 07.08.2011 в 13:51

Макс, да, комментарии наверное лучше выводить этой функцией: get_comments().

ОтветитьОтветить
Юрий, 16.08.2011 в 23:27

Здравствуйте. У меня такая ситуация: в сайдбаре у меня находится реклама от google AdSense, я хочу установить поиск googl с показом на моем сайте, как я понял из правил, нельзя на странице поиска размещать другие объявления от google, т.е. мне надо убрать рекламный блок из сайдбара на странице поиска. как это сделать?
p.s. сайдбар у меня полностью прописан в файле saidbar.php, виджетами не пользуюсь.

ОтветитьОтветить
kama, 21.08.2011 в 15:06

Юрий, значит где-то в сайдбаре есть код блока, удалите его или закоментируйте.

ОтветитьОтветить
Юрий, 21.08.2011 в 18:26

Если удалю, он совсем исчезнет, а я хочу чтоб рекламы не было в сайдбаре только на одной странице.
т.е. надо как то прописать исключение. чтобы этот блок не отображался на определенной странице.

ОтветитьОтветить
ILYA, 22.08.2011 в 12:04

Уберите виджет со страницы search.php

ОтветитьОтветить

Комментировать