Теперь, когда вы наконец смогли понять, где и как применяются циклы (к примеру, при отображении списка записей, вне зависимости от их количества) настало время научиться не просто их использовать, а использовать их с умом. Допустим, вы хотите не просто вывести на экран список всех имеющихся записей, а лишь их сокращенный вариант, содержащий несколько предложений. Все это заставляет нас вернуться к тегам шаблонов, в частности к тем из них, которые используются в циклах.
Рассмотрим участок кода, присутствующий в файлах шаблонов любой темы:
<h2><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></h2>
Тег h2 отвечает за отображение заголовка записи (также заголовок используется в атрибуте title гиперссылки). Название заголовка является гиперссылкой на содержание записи. В качестве адреса гиперссылки (параметр href) используется относительная ссылка на запись. Теперь попробуем вывести содержание. За вывод содержания отвечают два тега шаблона:
<?php the_content() ;?> <?php the_excerpt() ;?>
Первый из них выводит полное содержание записи, за исключением случая, когда вы находитесь на странице со списком записей. В этом случае запись выводится до тега <!—more—>, который и определяет краткий вариант текста. Этот тег можно вставить вручную в любую запись через панель управления WordPress. Он отвечает за появление ссылки «Read more» (Читать далее) под кратким вариантом записи. Изменить текст ссылки можно следующим образом:
<?php the_content('Read more here, mate!') ;?>
Естественно, вместо текста ссылки можно вставить изображение или какой-либо HTML-код — все зависит от желания создателя блога. В дальнейшем мы рассмотрим эти возможности, сейчас же важно остановиться на том, что тэг шаблона the_content(), который выводит содержимое записи, может быть прерван тегом <!—more—>.
Если вы перешли на страницу с отдельной записью, на которой используется тег шаблона the_content(), то несмотря на то, был ли задан тег <!—more—> или нет, вы увидите полное содержимое записи.
Второй тег шаблона, отвечающий за вывод содержания — the_excerpt(). Он выводит так называемую цитату записи, по умолчанию представляющую собой первые 55 слов. Важно помнить, что the_excerpt() отрежет нужный кусок от любого содержимого, будь то видеоролик или изображение, в связи с чем применять его нужно осторожно. К сожалению, никаких параметров по настройке длины цитаты в WordPress не имеется.
Вставить цитату можно и через панель администратора. Она будет выведена там, где помещен тег the_excerpt(). Цитаты становятся очень удобным инструментом для отображения результатов поиска и страниц с архивами, поскольку позволяют экономить свободное пространство.
Однако, самый популярный путь использования тэга the_excerpt() заключается в продвижении какой-либо отдельной записи. При щелчке по названии записи показывается не ее полное содержание, а сокращенный вариант — цитата; если пользователя заинтересует краткое описание записи, он сможет перейти на ее полный вариант и ознакомиться с ним.
По умолчанию синтаксис цитаты следующий:
<?php the_excerpt(); ?>
Помните, что использовать the_excerpt() на странице отдельной записи нельзя! Отдельная запись всегда будет отображена в полном варианте. Также, если какие-либо причины подтолкнули вас на это, вы всегда можете использовать на странице одновременно оба тега: the_content() и the_excerpt().
Совет: как отобразить цитаты вместо полных записей
- Переходим в папку wp-content/themes/default, в которой содержится заданная по умолчанию тема. Нам понадобится файл index.php. Открываем его.
- Ищем в нем следующую строку:
<?php the_content('Read the rest of this entry »'); ?>
- Заменяем ее на:
<?php the_excerpt(); ?>
- Сохраняем index.php и обновляем его. Теперь при посещении сайта вы увидите не полные записи, а лишь цитаты. Прочесть полную запись можно будет, кликнув по ее заголовку.
- Если вы хотите использовать какую-либо свою цитату вместо той, что была сгенерирована the_excerpt(), зайдите в панель администратора и введите цитату в соответствующее поле.
Несколько слов о прилепленных записях
Вместе с версией 2.7 WordPress предоставил возможность создания так называемых прилепленных записей. Людям, часто посещающим форумы, должно быть знакомо это понятие — так обычно называют тему, которая всегда висит в самом верху, вне зависимости от того, в какое время она была создана и сколько человек в ней отписалось. Сделать запись прилепленной можно в панели администратора, в разделе Записи — > Изменить. Если имеются две прилепленных записи, они будут обе расположены в самом верху в порядке добавления. В случае изменения статуса записи с прилепленной на обычную она просто добавиться к остальным в соответствии с хронологией.
Ранее в WordPress существовал тэг шаблона sticky_class(), отвечающий за вывод прилепленных записей, однако затем на замену ему пришел тэг post_class().
<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
Тэг шаблона post_class() добавляет специальные классы в зависимости от типа записи. Если запись является прилепленной, то post_class() добавляет в CSS-файл специальный класс .sticky. Таким образом, вы можете напрямую влиять на его отображение. Пример:
.sticky { padding: 15px; background: #eee; border: 1px solid #bbb; color: #444; font-size: 18px; }
В данном случае запись будет отображена в светло-сером поле с темной рамкой. Размер шрифта установлен в 18px.
Прилепленные записи можно использовать в целях оповещения посетителя о наиболее важных событиях. Важно помнить, что каждая новая прилепленная запись будет выталкивать старую вниз. Если же вы нуждаетесь в том, чтобы одна из прилепленных записей всегда была в самом верху, можно воспользоваться условным тегом is_sticky():
<?php if (is_sticky()) echo 'Super important post! Read it! Now!'; ?>
Многие разработчики блогов незаслуженно забывают эту полезную возможность. Прилепленные записи оказываются довольно удобным инструментом для оповещения посетителей относительно новых возможностей или интересных событий.
Применение query_posts()
Любой квалифицированный проектировщик блогов на WordPress должен обязательно знать о наличии такого тэга шаблона как query_posts(). В сущности, этот тег влияет на отображение выводимых записей, а также определяет некоторые важные настройки вывода (к примеру, с помощью его виджеты выводят список последних добавленных записей).
Сразу же оговоримся, что применять этот тег шаблона нужно только в пределах основного цикла во избежание различных ошибок. Далее в главе «Вложенные циклы» мы более подробно остановимся на этом.
Тэг шаблона query_posts() располагается до основного цикла:
<?php query_posts(); ?> <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <!-- Doing stuff here, styling the posts and so on. --> <?php endwhile; else: ?> <p>Some error message or similar.</p> <?php endif; ?>
Естественно, этот код можно немного ужать, поскольку не имеется никакой необходимости в использовании отдельных PHP-тегов для query_posts() и have_posts().
Что же сделает приведенный выше цикл? Да ничего особенного, поскольку query_posts() не имеет никаких параметров. Цикл просто выполнит свою работу в соответствии с установленными настройками WordPress. Что же делает query_posts()? Он посылает SQL запрос с теми параметрами, которые вы хотели бы изменить.
Вообще, при помощи данного тега можно изменять огромное количество настроек, что в сочетании с условными тегами дает безграничный простор для творчества.
Подробнее о query_posts() можно узнать на странице кодекса codex.wordpress.org/Template_Tags/query_posts.
Сейчас же рассмотрим несколько примеров. Для того чтобы исключить все записи из определенной категории, можно воспользоваться параметром cat:
<?php query_posts('cat=-130'); ?>
Здесь 130 — это идентификатор категории. Знак минус означает, что все записи из данной категории будут исключены.
Если вы хотите, чтобы названия записей были отмечены синим, зеленым или желтым цветами, поместите следующий код перед основным циклом:
<?php query_posts('tag=blue+green+yellow'); ?>
Также query_posts() предлагает различные возможности, связанные с выборкой записей по автору, по дате, и т.д.
Единственная сложность, возникающая в процессе использования query_posts(), заключается в определении количества выводимых записей. На эту настройку влияет фактически установленное администратором количество записей на главной странице. Однако, имеется возможность настраивать формат отображения. Допустим, вы хотите, чтобы на главной странице выводилось пять записей, а все остальные списки отображали десять. Эту проблему можно решить двумя способами. В первом случае можно создать отдельный шаблон home.php, в котором с помощью query_posts() определить количество отображаемых записей. Во втором случае можно применить условный тег в шаблоне index.php. Начнем с первого случая, поскольку он наиболее прост для восприятия. Параметр posts_per_page позволяет управлять количеством записей:
<?php query_posts('posts_per_page=5'); ?>
Поместив эту строку перед основным циклом в шаблоне home.php, можно получить требуемый формат вывода записей на странице (в данном случае пять записей на странице). Однако, создание отдельного файла под данную возможность — это слишком громоздкое решение. Воспользуемся условным тегом is_home() для проверки того факта, находимся ли мы на домашней странице. Если это так, то ничего не произойдет, иначе же будет выполнена инструкция query_posts(). Пример:
<?php if (is_home()) { query_posts('posts_per_page=5'); } ?>
Эту инструкцию необходимо разместить перед основным циклом. Естественно, если вы можете ограничивать вывод количества записей, то вы можете и удалять поставленное ограничение. Сделать это очень просто: достаточно присвоить параметру posts_per_page значение -1. Однако, важно помнить, что в данном случае будут выведены все имеющиеся в блоге записи, а если их несколько тысяч, то это заметно отразиться на времени загрузки главной страницы. Допустим, вы хотите вывести все записи, сделанные автором TDH за 2009 год:
<?php query_posts('author_name=TDH&year=2009&posts_per_page=-1'); ?>
Как вы уже заметили, query_posts() принимает параметры в стиле запросов. Это очень удобно и в то же время эффективно.
Альтернатива циклам
Теперь, когда вы поняли, как работает query_posts(), у вас наверняка появилось желание создать что-либо сверхсложное: написать какой-нибудь длинный запрос или же применить вложенные циклы в своем файле шаблона. Однако, важно помнить, что не всегда query_posts() предлагает наиболее эффективное решение проблемы, даже несмотря на свою хваленую универсальность.
Первый вопрос, который стоит себе задать — действительно ли вы нуждаетесь в дополнительном цикле? Чаще всего для решения возникших проблем как нельзя лучше подходят существующие теги шаблона. Дополнительные циклы нужны лишь в тех случаях, когда никакого другого варианта попросту не существует. Эффективные замены, такие как, например, условные теги, позволяют решить тот же самый вопрос более качественно и быстро, так что про них не стоит забывать.
Ну и, наконец, плагины. Они позволяют существенно сократить работу по написанию кода и сделать блог более функциональным. Практически любая проблема может быть быстро решена при помощи соответствующего плагина. Это, пожалуй, одно из самых лучших решений. Зачем изобретать велосипед, если все уже создано для вас?
Использование циклов влечет за собой частые SQL запросы к базе данных, что, в свою очередь, значительно замедляет работу сайта в целом. Это еще один повод за то, чтобы использовать простые и ненавязчивые конструкции.
Мой совет: всегда, прежде чем использовать дополнительный цикл, подумайте, быть может, имеется иное, более простое решение проблемы. Тем самым вы избавите себя от головной боли в будущем.
как вывести сначала одну категорию потом другие
два цикла, один для одного id, второй для другого