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

Пусть у нас есть вот такой шаблон сайта, расположенный в файле index.php:

<!DOCTYPE html> <html> <head> <meta charset="<?php bloginfo( 'charset' ); ?>"> <title><?php echo wp_get_document_title(); ?></title> <link rel="stylesheet" href="<?php echo get_stylesheet_uri(); ?>" type="text/css" /> <?php wp_head(); ?> </head> <body> <header class="header"> <h1><?php bloginfo( 'name' ); ?></h1> <h2><?php bloginfo( 'description' ); ?></h2> </header> <div class="middle"> <?php if (have_posts()) { while (have_posts()) { the_post(); echo '<h3><a href="'. get_permalink() .'">'. get_the_title() .'</a></h3>'; echo get_the_excerpt(); } } else { echo '<p>Записей нет...</p>'; } ?> </div> <footer class="footer"> <?php echo date('Y') ?> © Я и компания моя </footer> <?php wp_footer(); ?> </body> </html>

Как вы уже знаете, на сайте, созданном на WordPress, существуют разные типы страниц. Есть страницы, на которых выводится список постов, а есть страницы для вывода отдельного поста.

Сейчас у нас получается, что шаблон index.php применяется как для вывода списка записей, так и для вывода одной записи.

Давайте рассмотрим Цикл WordPress, расположенный в нашем шаблоне:

<?php if (have_posts()) { while (have_posts()) { the_post(); echo '<h3><a href="'. get_permalink() .'">'. get_the_title() .'</a></h3>'; echo get_the_excerpt(); } } else { echo '<p>Записей нет...</p>'; } ?>

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

Давайте посмотрим на поведение нашего цикла на сайте. Для этого зайдите на главную страницу сайта - там вы увидите список записей, которые будут представлять собой короткое описание, а над ним - заголовок h3 с ссылкой внутри.

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

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

Для решения проблемы мы можем использовать функцию is_single. Данная функция возвращает true, если мы находимся на странице одной записи и false, если на какой-то другой странице (например, на выводе списка записей).

Итак, давайте с помощью этой функции сделаем так, чтобы на странице одной записи выводился заголовок h1 и полный текст, а на странице списка записей - заголовок-ссылка h3 и короткое описание:

<?php if (have_posts()) { while (have_posts()) { the_post(); if (is_single()) { echo '<h1>'. get_the_title() .'</h3>'; echo get_the_content(); } else { echo '<h3><a href="'. get_permalink() .'">'. get_the_title() .'</a></h3>'; echo get_the_excerpt(); } } } else { echo '<p>Записей нет...</p>'; } ?>

Функцию is_single можно использовать не только внутри Цикла, но и снаружи:

<?php if (is_single()) { echo 'выведем что-нибудь'; } if (have_posts()) { while (have_posts()) { the_post(); if (is_single()) { echo '<h1>'. get_the_title() .'</h3>'; echo get_the_content(); } else { echo '<h3><a href="'. get_permalink() .'">'. get_the_title() .'</a></h3>'; echo get_the_excerpt(); } } } else { echo '<p>Записей нет...</p>'; } ?>

Сделайте так, чтобы на странице одной записи выводился заголовок h1, автор записи, дата публикации, а также ее полный текст и миниатюра. А на странице со списком записей пусть для каждой записи выводится заголовок h2 (без ссылки), короткое описание, а под ним - ссылка с текстом "Подробнее", ведущая на полный текст записи.

Модифицируйте предыдущую задачу так, чтобы в списке записей выводились еще и миниатюры.

Модифицируйте предыдущую задачу так, чтобы миниатюры были ссылками на полный текст записи.

Использование the_content

Давайте вспомним, как работает функция the_content: когда функция используется на страницах архивов (не отдельная страница записи) и если в контенте используется блок Подробнее либо тег-разделитель <!--more-->, функция the_content обрежет текст: все что выше <!--more--> будет показано, а все что после этого тега, будет вырезано и будет вставлена ссылка "читать дальше". Если же функция используется на странице отдельной записи, то она просто покажет весь текст записи (по умолчанию вместе с коротким описанием).

Поэтому, вместо того, чтобы использовать для одной страницы функцию get_the_content, а для списка - get_the_excerpt, можно просто для всех типов страниц использовать the_content:

<?php if (have_posts()) { while (have_posts()) { the_post(); if (is_single()) { echo '<h1>'. get_the_title() .'</h3>'; } else { echo '<h3><a href="'. get_permalink() .'">'. get_the_title() .'</a></h3>'; } the_content(); // используем функцию вне условия } } else { echo '<p>Записей нет...</p>'; } ?>

Не забывайте, что get_the_excerpt и the_content имеют немного разный алгоритм показа короткого текста (то есть наш новый код не полностью эквивалентен старому). Разницу между этими функциями мы разбирали в предыдущих уроках.

Реализуйте вывод коротких описаний и текста записи через функцию the_content. Проверьте в браузере внешний вид страницы со списком записей и страницы с одной записью.

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

Используя настройки функции the_content, сделайте так, чтобы на странице со списком записей текст ссылок на полную запись был "Подробнее...", а не тот, который стоит по умолчанию.

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

Функции, подобные функции is_single, в терминах Wordpress называются условными тегами (в данном случае слово "теги" не имеет отношения к HTML, просто такое название).

Давайте изучим самые распространенные условные теги и потренируемся с ними работать.

Отработайте изученные функции самостоятельно.

Отработайте изученные функции самостоятельно.

Отработайте изученные функции самостоятельно.

Отработайте изученные функции самостоятельно.

Отработайте изученные функции самостоятельно.

Отработайте изученные функции самостоятельно.

Отработайте изученные функции самостоятельно.