Loop
Понимание цикла
От параметров запроса к SQL
Понимание контента в WordPress
Помещение цикла в контекст
Использование Цикла
Теги шаблона
Где находятся теги шаблонов?
Часто используемые теги шаблона
Параметры тегов
Иерархия шаблонов
Минимальное количество файлов темы
Использование тегов условий
Иерархия шаблонов
Типы страниц и названия файлов
Записи
Страница (запись page)
Запись (запись post)
Произвольный тип записи
Вложение
Архивы
Рубрика
Метка
Таксономия
Страница архива типа записи
Страница автора
Страница архива по дате (день, месяц, год)
404 страница
Страница поиска
Главная страница
Страница блога
Встраивания (embeds)
Как это работает
Фильтры
WP_Query
Хуки из класса
Знакомство с WP_Query
Параметры Категорий (рубрик)
Параметры Меток
Параметры Таксономий
Параметры Авторов
Параметры Постов и Страниц
Параметры Произвольных полей (postmeta)
Параметры Типов постов
Параметры Статусов
Параметры Даты (времени)
Параметры Отступов
Параметры Сортировки и порядка
Параметры Пагинации
Параметры Комментариев
Параметры Поиска
Параметры Доступа
Параметры Кэширования
Параметры Возвращаемых данных
Комбинирование параметров
Методы и свойства класса
Заметки по фильтрам
Цикл WordPress — Что это такое и как его использовать?
Цикл WordPress — руководство по эксплуатации для начинающих
Что такое цикл «the loop» в WordPress
Функции для темы (теги шаблона)
Что такое Теги шаблонов в WordPress?
Методы и свойства класса WP_Query
WP_Query(), описание класса, параметры
Объект $wp_query и массив $posts.
Иерархия файлов темы (шаблона)
Иерархия выполнения файлов темы WordPress
Иерархия файлов в теме WordPress
Порядок загрузки файлов WordPress темы
Знакомство с глобальными переменными в WordPress
Использование глобальных переменных в WordPress на практике
Знакомство с условными тегами (Conditional Tags) в WordPress
Loop
Цикл имеет отношение к тому, как WordPress отображает контент (записи, страницы
или пользовательский контент) на посещаемой странице. Цикл может выдавать отдельный фрагмент содержимого или группу записей или страниц, которые выбраны и отображаются посредством кругового обхода, поэтому процесс и называется циклом.
Как WordPress отображает записи блога по умолчанию? Цикл выбирает записи из базы данных MySQL на основе набора параметров. Параметры обычно определяются через URL, используемый для доступа к сайту WordPress. Например, домашняя страница по умолчанию должна отображать все записи блога в обратном хронологическом порядке. Страница категории показывает только записи блога, относящиеся к этой категории.
Страница архива показывает только записи блога, датированные определенным месяцем и датой. WordPress превращает практически каждый параметр записи в выбранную переменную, давая циклу возможность использования разных алгоритмов выбора контента. Настроить тип и место отображения контента на сайте легко, если понимаешь, как цикл превращает URL в то, что отображается при переходе по ссылке.
Информацию о каждой записи можно отобразить с помощью соответствующих тегов шаблона или (для продвинутых пользователей) с помощью введения переменной $post, которая содержит информацию текущей записи, пока Цикл выполняется.
Понимание цикла
Понимание того, как функционирует цикл, поможет вам им управлять. Управление циклом с целью отображения именно того контента, который вам нужен, будет одним из самых часто используемых инструментов при разработке сайтов на WordPress. Поскольку цикл — в сердце каждой темы WordPress, возможность настроить отображаемый контент таким образом, чтобы заставить WordPress выглядеть и действовать так, как вам хотелось бы.
Чтобы понять цикл, полезно разобрать шаги, которые WordPress предпринимает.
Должен ли URL обрабатываться веб-сервером или же его следует превратить в запрос по контенту WordPress, решают веб-сервер и созданный WordPress файл . htaccess. Если URL не загружает файл ядра WordPress, он должен быть проанализирован, чтобы решить, какой контент загружать. Веб-сервер начинает с загрузки ядра WordPress через index, php, чтобы задать параметры для цикла. При посещении страницы какой-либо метки, WordPress определит, что вы просматриваете метку, загрузит соответствующий шаблон, выберет записи, сохраненные с этой меткой, и сгенерирует выходные данные для страницы с меткой. Магическая трансформация URL в выбранный контент происходит внутри метода parse_query( ) в объекте WP_Query, который WordPress создал ранее при обработке. WordPress сначала разбирает URL на набор параметров запроса, которые описаны в следующем разделе. Все строки запроса из URL передаются для определения отображаемого контента, даже если они выглядят как аккуратно отформатированные пути. Если ваш сайт использует «красивые» постоянные ссылки, значения между слэшами — просто параметры для строк запроса. Например, http://example.com/tag/book — то же самое, что и http://example.com?tag=book, передающая строку запроса тега со значением book. После этого WordPress конвертирует детальные параметры запроса в запрос для базы данных MySQL, чтобы вернуть контент. Рабочей лошадкой тут является метод get_posts() внутри объекта WP_Query, который описывается в этой части далее. Метод get_posts() берет все параметры запроса и превращает их в операторы SQL, в конечном счете посылая строку SQL на сервер баз данных MySQL и извлекая желаемый контент. Контент, возвращенный из базы данных, сохраняется в объекте WP_Query, чтобы использоваться в цикле WordPress, и кэшируется для ускорения других обращений к тем же самым записям до выполнения другого запроса базы данных. После возвращения контента WordPress устанавливает все условные метки is _ такие как is_home() и is_page( ). Они устанавливаются как часть выполняемого запроса по умолчанию на основе парсинга URL, и мы еще рассмотрим случаи, когда может потребоваться сбросить эти метки. WordPress берет образец из темы, основываясь на типе запроса и числе возвращенных записей, — например, единичная запись или запрос по категории, — и полученные по запросу данные передаются в процедуру цикла по умолчанию. Цикл можно настроить для различных целей.
От параметров запроса к SQL
После того как заданы параметры запроса — посредством парсинга URL, заданного пользователем, или явного задания в специально настроенном цикле, — метод get_posts( ) объекта WP_Query транслирует эти параметры в SQL для запроса базы данных. Помимо того что вы можете во многом контролировать тип, выбор и упорядочивание контента с помощью параметров запроса, ядро WordPress также предоставляет фильтры, чтобы позволить вам изменить сгенерированный SQL для тончайшего контроля выбора контента и его группировки.
Базовый формат запроса SQL: SELECT fieLds FROM table WHERE conditions (ВЫБРАТЬ поля ИЗ таблицы ГДЕ условия). Поля — это столбцы базы данных, которые вы хотите вернуть. Обычно эту часть запроса менять не требуется. Условия, определенные в операторе WHERE, меняют порядок, группировку и число возвращаемых записей. Если вы выгрузите сгенерированный запрос SQL, проанализировав поле request объекта WP_Query, то увидите, что WHERE в SQL содержит 1=1 как первое условие. Если нет других параметров выбора контента, 1=1 гарантирует, что сгенерированный SQL не будет синтаксически плохо сформированным в отсутствие других выражений в WHERE. Оптимизатор SQL в MySQL знает достаточно, чтобы проигнорировать 1=1.
Таблица — это не просто «записи» таблицы в базе данных MySQL, которые содержат все данные записей. Это также может быть SQL JOIN из двух или большего числа таблиц, где вам необходимо выбрать записи на основе иерархических метаданных. В WordPress любая запись может быть легко отмечена разными метками или помещена в более чем одну категорию. Но соответствующие базы данных не приспособлены для управления этими иерархическими или сетевыми отношениями.
WordPress использует множественные таблицы для управления этими сложными взаимоотношениями, но это делает такие запросы, как «найти все записи с меткой “book”», более сложными для выполнения. Например, чтобы выбрать записи с меткой bacon, SQL JOIN необходимо сначала найти book в таксономии метаданных, построить в памяти промежуточную таблицу записей, которые были отмечены как book, а затем выбрать записи, ID которых содержатся одновременно и во временной таблице, и в главной таблице контента WordPress. Приверженцы баз данных называют это «картезианским продуктом», или внутренним слиянием двух и более таблиц. Мультипликативное описание, сложность запроса и потребление памяти выражены здесь очень точно.
При генерации запроса SQL есть некоторое число фильтров, которые запускаются, чтобы обеспечить авторам плагина динамическое связывание и в высшей степени ясный контроль над выполняемым SQL. Например, возьмем плагин, который меняет выборку записей в зависимости от пользовательских метаданных записи и контекста, которые плагин держит в отдельной таблице базы данных. Ваш плагин будет использовать фильтр posts_join, чтобы перезаписать оператор JOIN, добавляя еще одну таблицу и поле, соответствующее оператору, для дальнейшего расширения набора выбора. Если вы хотите изучить ядро на предмет наличия «кровавых» подробностей генерирования SQL, большая часть парсинга запроса (базы данных) в запрос выполняется в wp-includes/query. php, а большая часть работы JOIN определяется в wp-includes/taxonomy.php.
Понимание контента в WordPress
Перед тем как погружаться в Loop, важно понять, какие типы контента существуют в WordPress. По умолчанию WordPress определяет два типа содержимого: записи и страницы. Все типы содержимого хранятся в одной таблице wp_posts MySQL и различаются по «типу». Начиная с версии WordPress 2.9 можно определять пользовательские типы записей, по сути являющиеся пользовательским контентом WordPress. Например, вы можете создать пользовательский тип записи «События», чтобы регистрировать события в WordPress.
В этой главе под контентом подразумеваются «записи», но важно помнить, что записи на самом деле могут быть контентом WordPress любого типа.
Помещение цикла в контекст
Цикл — это сердце темы, контролирующее отображение контента. Это функциональное соединение между базой данных MySQL и HTML, которое генерируется в браузере посетителя. В целом, где бы ни отображались запись или страница, WordPress использует цикл. Это может быть одиночная запись или страница, цикл записей или последовательность циклов с различными параметрами отображения.
Большинство тем WordPress включают в себя заголовок, подвал и боковые панели.
На рис. 14.1 показано, как цикл помещается прямо посредине этих элементов, создавая область контента сайта. Эта часть вашего сайта обычно является динамической и будет меняться по мере навигации через нее.
Рис. 14.1. Цикл WordPress
Цикл по умолчанию используется в файлах шаблона вашей темы WordPress. Цикл можно создавать где угодно в файлах шаблона темы, как показано на рис. 14.2. Цикл с индивидуальными настройками используется в плагинах и виджетах. Его можно использовать где угодно внутри WordPress, но в зависимости от конкретного места существуют разные методы создания цикла с индивидуальной настройкой, а потенциальные побочные эффекты у каждой конструкции свои.
Рис. 14.2. Использование нескольких циклов
В файлах шаблона темы цикл можно использовать многократно. Циклы могут создаваться в заголовке, на боковых панелях, в подвале и в области основного контента сайта. Количество циклов, которые могут отображаться на сайте, не ограничено. Не забывайте, что цикл, по сути, — запрос базы данных для выбора контента и последующего цикла для обработки и отображения последнего. По умолчанию для осуществления выборки цикл использует контекст запрошенного URL, но вы можете провести тонкую настройку и создать запрос для базы контента WordPress, чтобы выполнять любое число процессов управления содержимым.
Использование Цикла
Loop использует некоторые стандартные для программирования условные операторы, чтобы определить, что и как отображать. Первым оператором в Loop является if , который проверяет, существует ли хотя бы одна запись, поскольку у вас может не быть записей в выбранной категории и с нужной меткой. Если контент существует, оператор while используется для запуска цикла, охватывающего все записи или страницы, которые должны быть отображены. Наконец, функция
the_post() — вызывается для построения данных записи, делая их доступными для других функций WordPress. После построения данных записи контент цикла может быть отображен в том формате, который вы предпочитаете.
Минимальный пример цикла. Он включает в себя элементы, необходимые для правильного функционирования цикла:
<?php
if ( have_posts() ) :
while ( have_posts() ) :
the_post();
/ / код внутри цикла (теги шаблонов, html и пр.)
endwhile;
endif;
?>
the_post() устанавливает индексы поста в Цикле WP. Получает следующий пост, переопределяет глобальную переменную $post и устанавливает свойство in the loop в true.
Помните, что это код РНР, поэтому он должен быть заключен в теги <?php и ?>. Это цикл в простейшем варианте. Если вы гадаете, как информация на выходе запроса базы данных передается этому простейшему Loop, в котором нет переменных в качестве параметров, ответ лежит в глобальной переменной $wp_query, являющейся экземпляром WP_Query, на которую ссылаются функции в простом цикле. По сути, это запрос для цикла по умолчанию. Заметьте, что к моменту вызова этого цикла по умолчанию WordPress уже вызвал метод get_posts( ) в рамках объекта запроса по умолчанию, чтобы построить список искомого контента для просматриваемого URL, а цикл в данном случае отвечает за отображение этого списка записей. Позже вы увидите, как вручную структурировать запросы, чтобы осуществлять высокоточный контроль над выбором записей, но на данный момент безопаснее положиться на четкую работу базы данных, после чего результаты при вызове цикла сохраняются в $wp_query.
Существуют минимальные требования для работы цикла в WordPress. Давайте разберем пример, чтобы изучить отдельные части цикла:
have_posts — проверяется есть ли у текущего запроса WP результаты для вывода, т.е. есть ли в наличии посты, которые можно вывести для текущей страницы. Условный тег.
if ( have_posts() ) :
Эта строка проверяет, будут ли на текущей просматриваемой странице отображаться какие-либо записи и страницы. Если записи и страницы существуют, будет выполняться следующее предложение:
while ( have_posts() ) :
Содержащийся выше оператор while запускает цикл, обыкновенно проходя через все записи и страницы, которые должны быть отображены на странице, если не задано ничего другого. Цикл будет продолжаться, пока есть контент для отображения.
Когда все содержимое будет отображено, цикл закончится. Функция have_posts() просто проверяет, полностью обработан список записей или же в списке нет записей.
the_post();
Теперь вызывается функция the_post () для загрузки всех данных записи. Эта функция должна быть вызвана внутри цикла, чтобы данные записи были установлены корректно. Вызов the_post () в свою очередь вызывает функцию setup_postdata(), чтобы установить метаданные записи, такие как автор и метки контента, который вы отображаете в цикле, а также содержимое самой записи. Эти данные передаются глобальной переменной каждый раз через повтор цикла. У специально вызываемого the_post() есть побочный эффект в виде установки глобальной переменной $post, используемой большинством описанных далее шаблонов, которая затем передается следующей записи в списке.
Установка данных записи также использует соответствующие фильтры для сырого контента, который выходит из базы данных WordPress. WordPress хранит отредактированное пользователем содержимое в том виде, в каком оно было введено. Поэтому если пользователь, к примеру, использовал сокращенный код, чтобы добавить объект Google AdSense в конце записи, этот код будет храниться в контенте базы данных. Когда настройка записи завершена, вызывается плагин, который конвертирует сокращенные коды в куски JavaScript наряду с другими зарегистрированными плагинами, которые модифицируют контент сырой записи.
Важно заметить разницу между сырыми данными записи в объекте запроса WordPress и отфильтрованным контентом, который формируется в конце.
/ / код внутри цикла
Сюда помещаются теги всех шаблонов цикла и любой дополнительный код, который вы хотели бы отобразить внутри цикла. Эта тема будет более подробно рассмотрена далее.
endwhile;
endif;
Операторы endwhile и endif заканчивают цикл. Любой код, помещенный после этих двух строк, будет отображаться внизу страницы после всех записей. Вы также можете поместить оператор else для отображения сообщения, если содержания для отображения в Loop нет. В файлах шаблона темы цикл обычно окружен тегами HTML.
Теги шаблона
Функции РНР, используемые шаблонами тем WordPress для отображения контента цикла, называются тегами шаблона (template tags). Эти теги используются для отображения тех или иных фрагментов данных вашего сайта и контента. Это позволяет вам настроить отображение контента на сайте.
Например, тег шаблона the_title() отображает название записи или страницы внутри Loop. Основное преимущество использования тегов шаблона в том, что вам не нужно знать код РНР для работы с ними.
На WordPress доступно много различных шаблонов. Некоторые теги шаблонов должны находиться внутри цикла, тогда как другие могут использоваться где угодно в файлах шаблона. Заметьте, что в этом контексте под тегами шаблона по нимаются функции WordPress, используемые для извлечения данных записи для отображения. Файлы шаблона — это элементы темы, которые контролируют, как отображается тот или иной тип контента. Иначе говоря, файлы шаблона содержат циклы, включающие в себя теги шаблона. Обновляемый список тегов шаблона доступен по ссылке https://codex.wordpress.org/Template_Tags
Где находятся теги шаблонов?
Вы можете найти файлы, которые хранят функции для всех тегов шаблонов в папке wp-includes. Всего есть девять разных файлов с суффиксом –template :
- wp-includes/author-template.php — Теги шаблонов, связанные с автором
- wp-includes/bookmark-template.php — Теги шаблонов, связанные с закладками
- wp-includes/category-template.php — Теги шаблонов обо всех условиях и таксономии, в том числе категориях и тегах
- wp-includes/comment-template.php — Для тегов шаблонов отдела комментариев
- wp-includes/link-template.php — Теги шаблонов для ссылок (постоянные ссылки, ссылки прикрепления, архивные ссылки и т.д.)
- wp-includes/nav-menu-template.php — Теги шаблонов для меню навигации
- wp-includes/post-template.php — Теги шаблонов, связанные с постами
- wp-includes/post-thumbnail-template.php — Для тегов шаблонов, связанных с миниатюрами записей
- wp-includes/general-template.php — Для других тегов шаблонов, которые могут использоваться где угодно
Часто используемые теги шаблона
Тегов шаблона существует много, но обычно в цикле вы видите только их небольшую
часть. Вот наиболее часто используемые теги шаблона, доступные в цикле. Эти теги шаблона будут возвращать и отображать перечисленные данные записи.
- the_permalink() — отображает URL записи.
- the_title() — отображает название записи.
- the_ID() — отображает уникальный ID записи.
- the_content() — отображает полное содержание записи.
- the_excerpt() — отображает цитату записи. Будет использоваться, если заполнено поле Цитата (Excerpt) на экране редактирования записи. Если нет, то WordPress сгенерирует отрывок автоматически.
- the_time() — отображает дату/время публикации записи.
- the_author() — отображает автора записи.
- the_tags() — отображает метки записи.
- the_category() — отображает категории записи.
- edit_post_link() — отображает ссылку edit, которая показывается, только если вы авторизованы. Она позволяет редактировать запись.
- comments_popup_link() — отображает ссылку на форму комментария к записи.
Чтобы понять, как работают теги шаблона, просто поместите любой тег внутрь Loop и посмотрите, что получится. Следующий пример показывает, как работает пара таких тегов:
<div class=»content»>
<article class=»post hentry» itemscope itemprop=»blogPost» itemtype=»http://schema.org/Article»>
<header class=»entry-header»>
<h2 class=»entry-title» itemprop=»headline»>
<a href=»<?php the_permalink(); ?>»><?php the_title() ;?></a>
</h2><div class=»entry-meta»>
<span class=»post-date»>
<i class=»fa fa-clock-o fa-fw»></i>
<span class=»updated»>
<?php the_date(); ?>
</span></span> <!— .post-date —>
<span class=»post-author»>
<i class=»fa fa-user fa-fw»></i>
<span class=»vcard»>
<a class=»fn url» href=»<?php the_author_link(); ?>»>
<?php the_author(); ?>
</a></span></span> <!— .post-author —>
<span class=»post-categories»>
<i class=»fa fa-folder fa-fw»></i>
<?php the_category(‘ ‘);?>
</span> <!— .post-categories —>
<span class=»post-tags»>
<i class=»fa fa-tags fa-fw»></i>
<?php the_tags(», ‘ ‘, »); ?>
</span> <!— .post-tags —>
</div> <!— .entry-meta —>
</header> <!— .entry-header —>
<div class=»entry-image»>
<?php if ( has_post_thumbnail()) :?>
<a href=»<?php the_permalink(); ?>» title=»<?php the_title_attribute(); ?>» >
<?php the_post_thumbnail(); ?>
</a><?php else: ?>
<img src=»http://dummyimage.com/800×250/f3f3f3/d1d1d1.jpg&text=Featured+Image» alt=»Featured Image» itemprop=»image»><?php endif; ?>
</div> <!— .entry-image —>
<div class=»entry-content» itemprop=»articleBody»>
<?php the_excerpt(); ?>
</div> <!— .entry-content —>
</article> <!— .post —>
</div> <!— .content —>
Параметры тегов
У большинства тегов шаблона есть параметры, которые могут быть добавлены для изменения возвращаемого значения. Например, у тега the_content() есть два параметра. Первый позволяет устанавливать ссылку more на дальнейший текст:
<?php the_content( ‘Read more’, false ); ?>
Контент записи будет отображаться нормальным образом, но при наличии в записи тега <! —more —> WordPress будет автоматически добавлять текст Read more, который будет снабжен ссылкой на полную запись. Второй параметр определяет, следует ли отображать параграф-тизер еще раз при просмотре полной записи. По умолчанию стоит значение false , и тизер отображается в обоих местах.
Вы также можете присвоить несколько параметров любому тегу шаблона, который их поддерживает. Например, тег шаблона the_title() принимает три параметра:
$before, $after и $echo. Следующий код задает тегу the_title( ) параметры $before и $after для помещения названия записи в теги h1:
<?php the_title( ‘<h1>’, ‘</h1>’ ); ?>
Вы также можете просмотреть актуальные функции в исходном коде WordPress. Функции шаблона записи находятся в wp-includes/post-template.php . Осуществляя быстрый поиск function the_title() , вы найдете точное описание функции для тега the_title( ) . Вы также можете использовать Кодекс для получения подробного описания тега шаблона, с которым работаете. В данном случае: https://codex.wordpress.org/Template_Tags
Иерархия шаблонов
Страницы WordPress сайта собираются подобно пазлу из файлов-шаблонов. Некоторые шаблоны (например header.php и footer.php) задействованы на всех страницах, другие используются только при определенных условиях.
Минимальное количество файлов темы
Важно понимать, что любая тема начинается с 2-х файлов, это index.php и style.css — уже только эти 2 файла смогут отобразить сайт. Но каждая страница, которую вы будете открывать в браузере, будет обрабатываться файлом index.php. Это не очень удобно, так как у вас на сайте должна быть главная страница, страница категорий и страница единичного материала. Исключением, конечно, могут стать одностраничные сайты.
Использование тегов условий
WordPress может несколькими способами подбирать шаблоны в соответствии с типом контента. Разработчики Тем для WordPress могут также использовать теги условий (Conditional Tags) для того, чтобы определенный шаблон был использован на конкретной странице блога. Некоторые Темы могут не содержать всех файлов-шаблонов, описанных в этой статье. В некоторых Темах использованы теги условий (conditional tags) для вызова других шаблонов.
Иерархия шаблонов
WordPress использует Строку Запроса — информацию, содержащуюся в каждой ссылке вашего сайта — для того, чтобы определить какой шаблон или набор шаблонов использовать для отображения страницы.
Сперва WordPress находит каждую Строку Запроса по типам запросов — т.е. определяет какой тип страницы (страница поиска, страница категорий, главная страница и др.) был запрошен.
После этого шаблоны выбираются и содержимое страницы генерируется в порядке, предложенном иерархией шаблонов WordPress, в зависимости от доступности шаблонов конкретной темы WordPress.
WordPress ищет файлы шаблонов со специальными именами в папке текущей темы и использует первый подходящий файл шаблона указанный в соответствующем запросе.
За исключением основного шаблона index.php, разработчики тем могут использовать или не использовать файлы шаблонов по желанию. Если WordPress не находит шаблон с указанным именем, он переходит к следующему по иерархии шаблону. Если не один из искомых шаблонов не подходит, WordPress использует index.php (шаблон главной страницы Темы).
Иерархия в данном случае — последовательная проверка, говорит о том, что для вывода одной страницы на сайте, подходят несколько названий файлов. Проверка какой файл будет использован идет поочередно. Т.е. есть список файлов, каждый из них по очереди проверяется на физическое существование, как только найден существующий файл проверка прекращается и найденный файл используется в качестве шаблона.
Например, мы заходим на страницу рубрики «Плагины» с ярлыком plugins и id 25 — http://site.ru/category/plugins. Тогда для генерации кода этой страницы WordPress будет по очереди проверять наличие следующих файлов (проверка прервется на первом существующем файле):
- category-plugins.php
- category-25.php
- category.php
- archive.php
- index.php
Полная схема для всех видов страниц и их файлов выглядит так:
Еще одна схема, может быть она понятнее:

Типы страниц и названия файлов
Записи
- Страница (запись page)
- {любое_название}.php (когда используется шаблон страницы)
- page-{ярлык_записи}.php
- page-{ID_записи}.php
- page.php
- singular.php
- index.php
Точно так же как и с типами постов, можно для типа страниц сделать свои собственные шаблоны для отображения. Вначале WordPress будет искать пользовательский шаблон страницы, который имеет название в блоке информации верху файла:
/*
Template Name: Имя шаблона
*/
Дальше WordPress будет искать page-[slug].php, если его нет — тогда будет искать шаблон с id страницы — page-[id].php, если и этого нет — то будет использован шаблон по умолчанию page.php.
- Запись (запись post)
- single-post-{ярлык_записи}.php
- single-post.php
- single.php
- singular.php
- index.php
- Произвольный тип записи
- {любое_название}.php (для древовидного типа с поддержкой шаблонов. С WP 4.7)
- single-{post_type}-{ярлык_записи}.php
- single-{post_type}.php
- single.php
- singular.php
- index.php
- Вложение
- {начало_MIME_типа}.php
- {конец_MIME_типа}.php
- {начало_MIME_типа}-{конец_MIME_типа}.php
- attachment.php
- single.php
- singular.php
- index.php
Под началом и концом MIME типа, имеется виду первая и последняя часть MIME типа, разделенная /. Например, MIME-тип текстового файла: ‘text/plain’ и значит будет проверяться наличие файл text.php, затем plain.php, затем text-plain.php.
Полный список MIME типов смотрите в описании get_allowed_mime_types().
Архивы
- Рубрика
- category-{ярлык}.php
- category-{id}.php
- category.php
- archive.php
- paged.php (если страница пагинации)
- index.php
- Метка
- tag-{ярлык}.php
- tag-{id}.php
- tag.php
- archive.php
- paged.php (если страница пагинации)
- index.php
- Таксономия
- taxonomy-{ярлык_таксономии}-{ярлык_элемента}.php
- taxonomy-{ярлык_таксономии}-{id_элемента}.php
- taxonomy.php
- archive.php
- paged.php (если страница пагинации)
- index.php
- Страница архива типа записи
- archive-{ярлык_типа_записи}.php
- archive.php
- paged.php (если страница пагинации)
- index.php
- Страница автора
- author-{nickname}.php
- author-{id}.php
- author.php
- archive.php
- paged.php (если страница пагинации)
- index.php
- Страница архива по дате (день, месяц, год)
- date.php
- archive.php
- paged.php (если страница пагинации)
- index.php
404 страница
- 404.php
- index.php
Страница поиска
- search.php
- index.php
Главная страница
- front-page.php
- (логика постоянных страниц, если для главной выбрана страница)
- home.php
- index.php
Когда вы будете создавать главную страницу сайта WordPress будет для ее отображения искать начала шаблон front-page.php, если он есть — то будет задействован он, а если нет — то поиск пойдет дальше, следующим шаблоном он будет искать home.php, если его нет — то будет по-умолчанию использоваться index.php.
Страница блога
Страница блога появляется, когда для главной выбрана постоянная страница
- home.php
- index.php
Встраивания (embeds)
Шаблоны встраивания используются когда запрашивается запись через REST API. Встраивания появились в версии 4.5 и позволяют встраивать ваши записи в чужие сайты. См. get_post_embed_url()
- embed-{post-type}-{post_format}.php
- embed-{post-type}.php
- embed.php
Как это работает
За всю логику: какой файл подключать, отвечает файл ядра wp-includes/template-loader.php. Если разобраться, в нем все описано. Но, это занятие не особо интересное, поэтому я его распишу.
Прежде всего. template-loader.php подключается после того как загрузится вся среда WordPress. После того, как отработает файл wp-load.php и обработается основной запрос — функция wp(). Т.е. template-loader.php подключается в самом-самом конце PHP скрипта…
Сначала срабатывает хук template_redirect. В этом хуке можно произвести какие-то проверки и если надо перенаправить на другой URL. В нем нужно обрывать работу скрипта через die(). Т.е. если этот хук что-то меняет, то на этом работа файла template-loader.php заканчивается и мы «улетаем» на какую-то другую страницу.
Дальше срабатывает никому не интересный хук exit_on_http_head. Он позволяет сделать так, чтобы при HTTP HEAD запросе что-либо выводилось на экран…
Дальше идут проверки по всем условным тегам где выясняется какой файл шаблона подходит под текущий запрос. Проверяется условный тег, затем еще один и еще… Как только один из условных тегов сработал, вызывается соответствующая функция, которая находит подходящий файл шаблона и возвращает путь до него. Все такие функции описаны в get_query_template().
Дальше — путь до файла темы определен! Теперь он прогоняется через фильтр template_include. Который позволяет нам изменить файл шаблона для текущего запроса.
Дальше, файл подключается в PHP и запускается визуальная часть генерации страницы.
Фильтры
Иерархию файлов можно изменить через динамические фильтры:
- (type)_template_hierarchy — фильтрует массив названий файлов иерархии, по которому будет идти поиск нужного файла. С WP 4.7.
- (type)_template — фильтрует путь до уже определившегося файла шаблона.
Все варианты параметра type смотрите в одноименном параметр $type функции get_query_template(). Вот они:
- index
- 404
- archive
- post_type_archive
- author
- category
- tag
- taxonomy
- date
- home
- front_page
- page
- paged
- search
- single
- singular
- attachment
- comments_popup
WP_Query
WP_Query — это один из самых важных API в WordPress, ведь именно с помощью WP_Query мы имеем возможность получать записи, страницы и произвольные типы из базы данных. На основе WP_Query работают функции get_posts() и query_posts() и все остальные запросы связанные с выбором записей из таблицы wp_posts.
Хуки из класса
wp_query_search_exclusion_prefix
Возвращает объект/массив, результат запроса в виде массива объектов записей.
Знакомство с WP_Query
WP_Query — это PHP класс, который позволяет получать посты из базы данных по самым разным критериям. Например, мы можем получить посты:
- за определенный промежуток времени;
- из указанной категории, метки;
- свежие посты, случайные посты, популярные посты;
- посты с указанными произвольными полями или набором таких полей.
Рассмотрим простой запрос:
$query = new WP_Query( array( ‘category_name’ => ‘news’ ) );
Так, WordPress сделает запрос в базу данных, чтобы получить записи из категории «news».
Теперь, переменная $query содержит в себе объект с результатами запроса. Обработаем результат с помощью специальных методов:
while ( $query->have_posts() ) {
$query->the_post();
the_title(); // выведем заголовок поста
}
С помощью have_posts() мы проверяем есть ли записи для вывода в объекте $query. the_post() готовит текущую в цикле запись к выводу, делая доступными привычные функции the_title(), the_content() и другие.
WP_Query используется в WordPress всегда. Например, во время генерации любой страницы WP_Query создает глобальную переменную $wp_query где хранится информация о текущем запросе. На основе этой информации WP определяет на какой странице мы сейчас находимся (пост, архив, метка и т.д.). Также при построении базового цикла WordPress, данные берутся из переменной $wp_query и выводятся на экран через вспомогательные функции: the_permalink(), the_content(). Также, $wp_query хранит и другие данные. На разных типах страниц данные разные. Посмотреть какие данные находятся в переменной $wp_query можно так:
global $wp_query;
print_r($wp_query);
Часто вы получаете информацию не работая напрямую с этим классом и глобальными переменными. Происходит это благодаря набору функций: условные теги, теги шаблона относящиеся к выводу данных внутри Цикла и ряда других функций.
Все условные теги (is_*()) обращаются к этому классу. Также, при создании цикла if( have_posts() )… все связанные с выводом данных функции работают с этим классом. Таким образом, ни одна генерация базовой страницы WP не проходит без использования класса WP_Query.
Если вы используете the_post() в запросе, вам нужно заканчивать цикл функцией wp_reset_postdata()
Также код цикла может выглядеть так (тоже самое что get_post(), только без предустановленных параметров):
$my_posts = new WP_Query;
$myposts = $my_posts->query( array(
‘post_type’ => ‘page’
) );
foreach( $myposts as $pst ){
echo $pst->post_title;
}
Шаблоны использования WP_Query
Стандартный цикл:
// задаем нужные нам критерии выборки данных из БД
$args = array(
‘posts_per_page’ => 5,
‘orderby’ => ‘comment_count’
);
$query = new WP_Query( $args );
// Цикл
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
echo ‘<li>’ . get_the_title() . ‘</li>’;
}
} else {
// Постов не найдено
}
/* Возвращаем оригинальные данные поста. Сбрасываем $post. */
wp_reset_postdata();
Множественный цикл:
// Запрос к БД
$the_query = new WP_Query( $args );
// Цикл
while ( $the_query->have_posts() ) {
$the_query->the_post();
echo ‘<li>’ . get_the_title() . ‘</li>’;
}
/* Восстанавливаем оригинальные данные
* Так как мы используем new WP_Query мы не влияем на
* переменную $wp_query и нет необходимости сбрасывать запрос,
* поэтому сбрасываем только данные поста.
*/
wp_reset_postdata();
/* Второй запрос (без глобальной переменной) */
$query2 = new WP_Query( $args2 );
// 2-й Цикл
while( $query2->have_posts() ) {
$query2->next_post();
echo ‘<li>’ . get_the_title( $query2->post->ID ) . ‘</li>’;
}
// Восстанавливаем оригинальные данные поста
wp_reset_postdata();
При создании запросов WP_Query может получать предустановленные параметры, которые нужно учитывать. Например, запрос $query = new WP_Query( ‘post_type=func’ ); может вернуть только первые 10 записей типа func, а не все, как ожидается. Потому что предустановленный параметр posts_per_page=10, ограничивает количество получаемых записей до 10. Вот список параметров, которые могут быть предустановлены и которые могут мешать вашему запросу: post_type, posts_per_page, orderby, order, post_status, offset.
Параметры Категорий (рубрик)
Получает посты относящиеся к определенным категориям.
cat(число/строка/массив)
ID категории. Можно указать несколько ID в строке через запятую или в массиве. Чтобы исключить рубрики укажите минус (-) перед ID категории — это исключит и все вложенные рубрики. Чтобы не исключить вложенные, используйте параметр category__not_in.
category_name(строка)
Имя категории. Используйте слаг (альтернативное имя), а не само название категории.
category__and(массив)
Получить посты, которые входят одновременно в несколько категорий.
category__in(массив)
Получить посты, которые входят в одну из указанных категорий.
category__not_in(массив)
Получить посты, которые не входят в указанную категорию.
Этот параметр не учитывает вложенные рубрики. Чтобы исключить рубрику и вложенные, укажите ID рубрик через запятую со знаком минус в параметре cat: -25,-32.
Посты из одной категории
Вывод постов из одной категории (записи из дочерних категорий так же будут выбраны):
$query = new WP_Query(‘cat=4’);
вывод постов из одной категории по ярлыку (альтернативному названию категории):
$query = new WP_Query(‘category_name=staff’);
Выведем посты только из категории 4 (дочерние категории не затрагиваются):
$query = new WP_Query( ‘category__in=4’ );
Посты из нескольких категорий
Вывод постов из категорий по ID категорий:
$query = new WP_Query(‘cat=2,6,17,38’);
Выведем посты из категорий по слагу категорий:
$query = new WP_Query( ‘category_name=staff,news’ );
Исключим посты принадлежащие категориям
Выведем все посты, кроме постов из категорий 12,34,56:
$query = new WP_Query( ‘cat=-12,-34,-56’ );
Показать все посты, кроме тех, что принадлежать категории 3:
$query = new WP_Query(‘cat=-3’);
Нескольких категорий одновременно
Показать посты, которые находятся сразу в двух категориях:
$query = new WP_Query( array( ‘category__and’ => array(2,6) ) );
Показать посты которые находятся хотя бы в одной из категорий (дочерние категории не будут учитываться):
$query = new WP_Query(array(‘category__in’ => array(2,6)));
Можно исключить несколько категорий, таким образом:
$query = new WP_Query( array(‘category__not_in’ => array(2,6)) );
Параметры Меток
Получает посты относящиеся к определенным меткам.
tag(строка)
slug метки.
tag_id(число)
ID категорий.
tag__and(массив)
Посты одновременно из нескольких меток. Нужно указывать ID.
tag__in(массив)
Посты из хотя бы одной указанной метки. Нужно указывать ID.
tag__not_in(массив)
Посты не относящиеся к указанным меткам. Нужно указывать ID.
tag_slug__and(массив)
Тоже что и tag__and, только указываются альт. названия (slug) меток.
tag_slug__in(массив)
тоже что и tag__in, только указываются альт. названия меток.
Посты с одной меткой
Получить посты с меткой:
$query = new WP_Query(‘tag=cooking’);
Указывать нужно альтернативное название метки.
Получить посты, имеющие хотя бы одну указанную метку:
$query = new WP_Query(‘tag=bread,baking’);
Посты с несколькими метками
Получить посты имеющие любую из меток:
$query = new WP_Query( ‘tag=bread,baking’ );
Получить посты, имеющие сразу все указанные метки:
$query = new WP_Query(‘tag=bread+baking+recipe’);
Получить посты, имеющие сразу две метки (37 и 47):
$query = new WP_Query( array(‘tag__and’ => array(37,47)) );
Этот вариант более предпочтителен вышеприведенному из-за быстродействия.
Получить посты, имеющие хотя бы одно метку 37 или 47:
$query = new WP_Query( array(‘tag__in’ => array(37,47)) );
Этот вариант предпочтительнее т.к. указываются сразу ID.
Получить посты, НЕ связанные с метками 37 или 47:
$query = new WP_Query(array( ‘tag__not_in’=>array(37,47) ));
Параметры Таксономий
Выводит посты связанные с определенной таксономией.
{tax}(строка)
Использовался в версиях ниже 3.1 для которого нужно было указывать «название термина» ( array(‘taxonomy_name’=>’categoriya’) ). Запрещен с версии 3.1.
tax_query(массив)
С версий 3.1 и выше используется аргумент tax_query, который имеет ряд вложенных аргументов, это:
relation (строка)
Как выбирать записи из указанных таксономий. Может быть:
- AND — записи которые одновременно входят в указанные таксономии;
- OR — записи принадлежащие любой из указанных таксономий.
Указывается в первом массиве, а термины во вложенных массивах, которые могут иметь следующие параметры:
taxonomy (строка)
Название таксономии.
field (строка)
Поле которое будет указывать в параметре terms. Может быть:
- id или term_id — в terms указываем id терминов.
- name — в terms указываем заголовок термина.
- slug — в terms указываем ярлык термина.
По умолчанию: ‘term_id’
terms (число/строка/массив)
Термины таксономии, из которых нужно вывести записи.
operator (строка)
Оператор, указывающий как сравнивать указанные термины в параметре terms. Может быть:
- IN — записи из указанных терминов (по умолчанию);
- NOT IN — записи из всех терминов, кроме указанных;
- AND — записи одновременно принадлежащие всем указанным терминам;
- EXISTS — (с версии 4.1) существует;
- NOT EXISTS — (с версии 4.1) не существует.
По умолчанию: ‘IN’
include_children (логический)
Включать или нет посты из дочерних терминов (для древовидных таксономий). true -включить.
По умолчанию: true
tax_query это массив, элементами которого являются другие массивы, в каждом из которых указывается таксономия, ее термины и то как использовать эти термины. Оператор relation указывается в первом массиве tax_query и определяет как сравнивать вложенные массивы между собой. Такая конструкция позволяет создавать запрос одновременно к нескольким таксономиям.
Вывод записей из одной таксономии
Выведем записи из раздела (термина) bob, который является элементом таксономии people:
$query = new WP_Query( array( ‘people’ => ‘bob’ ) );
Выведем посты прикрепленные к термину bob из таксономии people:
$args = array(
‘post_type’ => ‘post’,
‘people’ => ‘bob’
);
$query = new WP_Query( $args );
Сделаем тоже самое что и в примере выше, только с использованием аргумента tax_query:
$query = new WP_Query( array(
‘tax_query’ => array(
array(
‘taxonomy’ => ‘people’,
‘field’ => ‘slug’,
‘terms’ => ‘bob’
)
)
) );
Вывод из нескольких таксономий
Выведем посты из нескольких произвольных таксономий:
$query = new WP_Query( array(
‘post_type’ => ‘post’,
‘people’ => ‘bob’,
‘language’ => ‘english’
) );
Аналог примера выше. Выведем записи, который одновременно относятся к нескольким произвольным таксономиям через tax_query:
$query = new WP_Query( array(
‘tax_query’ => array(
‘relation’ => ‘AND’,
array(
‘taxonomy’ => ‘movie_janner’,
‘field’ => ‘slug’,
‘terms’ => array( ‘action’, ‘comedy’ ),
),
array(
‘taxonomy’ => ‘actor’,
‘field’ => ‘id’,
‘terms’ => array( 103, 115, 206 ),
‘operator’ => ‘NOT IN’,
)
)
) );
Использование аргумента relation=OR
Выведем посты которые находятся в рубрике quotes или которые имеют формат quote (форматы введены в версии 3.1). Для этого используем аргумент relation:
$args = array(
‘post_type’ => ‘post’,
‘tax_query’ => array(
‘relation’ => ‘OR’,
array(
‘taxonomy’ => ‘category’,
‘field’ => ‘slug’,
‘terms’ => array( ‘quotes’ )
),
array(
‘taxonomy’ => ‘post_format’,
‘field’ => ‘slug’,
‘terms’ => array( ‘post-format-quote’ )
) ) );
$query = new WP_Query( $args );
Многоуровневый сложный запрос с использование оператора relation=OR
Допустим, нам нужно получить записи одной из групп элементов таксономии.
Например, надо получить автомобили марки ford черного цвета или автомобили марки bmw белого цвета:
$query = new WP_Query(
array(
‘tax_query’ => array(
‘relation’ => ‘OR’,
array(
‘relation’ => ‘AND’,
array(
‘taxonomy’ => ‘brand’,
‘field’ => ‘slug’,
‘terms’ => array( ‘ford’ )
),
array(
‘taxonomy’ => ‘color’,
‘field’ => ‘slug’,
‘terms’ => array( ‘black’ )
)
),
array(
‘relation’ => ‘AND’,
array(
‘taxonomy’ => ‘brand’,
‘field’ => ‘slug’,
‘terms’ => array( ‘bmw’ )
),
array(
‘taxonomy’ => ‘color’,
‘field’ => ‘slug’,
‘terms’ => array( ‘white’ )
) ) ) ) );
$query = new WP_Query( $args );
Тут первый оператор relation=OR влиял бы на все вложенные массивы, если бы во вложенных массивах он не перебивался дополнительным оператором relation=AND
Параметры авторов
Получает посты принадлежащие определенным авторам.
author(число)
ID автора.
author_name(строка)
Ник автора. Нужно указывать значение поля user_nicename.
author__in(массив)
Массив ID авторов, записи которых нужно получить.
author__not_in(массив)
Массив ID авторов, записи которых нужно исключить.
Выведем посты для одного автора
Посты по ID автора:
$query = new WP_Query( ‘author=123’ );
Посты по нику автора:
$query = new WP_Query( ‘author_name=rami’ );
Выведем посты нескольких авторов сразу
Посты четырех авторов по ID:
$query = new WP_Query( ‘author=2,6,17,38’ );
Исключим посты автора
Исключим посты автора 12 и покажем все посты, кроме его:
$query = new WP_Query( ‘author=-12’ );
Пример, показать все страницы автора 1 (author=1), отсортировать по заголовку (orderby=title) в алфавитном порядке (order=ASC) и не показывать прикрепленные посты вверху.
$query = new WP_Query(‘caller_get_posts=1&author=1&post_type=page&post_status=publish&orderby=title&order=ASC’);
Несколько авторов одновременно
Получим все записи авторов с ID 2 и 6:
$query = new WP_Query( array( ‘author__in’ => array( 2, 6 ) ) );
Получим записи всех авторов, кроме авторов с ID 2 и 6:
$query = new WP_Query( array( ‘author__not_in’ => array( 2, 6 ) ) );
Параметры Постов и Страниц
Получает отдельные страницы или посты.
p(число)
ID поста который нужно получить (p=27).
name(строка)
Альт. название поста (name=o-saite).
page_id(число)
ID постоянной страницы, которую нужно получить (page_id=27)
pagename(строка)
Альт. название постоянной страницы (pagename=o-saite)
post_parent(число)
Вернет только дочерние страницы.
post_parent__in(массив)
Выберет посты родители которых указанны в массиве.
post_parent__not_in(массив)
Выберет посты родители которых не указанны в массиве.
post__in(массив)
Укажите через запятую ID постов, которые нужно получить (post__in=5,12,2,14,7).
Заметка: если есть прилепленные записи, они будут включены автоматом. Отключить их можно параметром ignore_sticky_posts
post__not_in(массив)
Выведет все посты кроме указанных.
Параметры Произвольных полей (postmeta)
Основным параметром для работы с мета-данными в WP_Query является meta_query, который получает записи (посты) по существующим у них произвольным полям и их значениям. По принципу использования, meta_query похож на tax_query — массив, где каждый элемент в свою очередь является массивом с параметрами запроса, т.е. meta_query — это массив массивов:
$args = array(
‘meta_query’ => array(
‘relation’ => ‘OR’,
array(
‘key’ => ‘color’,
‘value’ => ‘blue’
),
array(
‘key’ => ‘price’,
‘value’ => 20
) ) );
Такая конструкция позволяет использовать множественные запросы. Первый параметр relation во «внешнем» массиве описывает логическую связь между запросами. Он может принимать значения AND (используется по умолчанию. Совпадение со всеми запросами) или OR (совпадение с любым из запросов).
Старые переменные запроса мета-данных: meta_key, meta_value, meta_value_num, meta_compare по прежнему поддерживаются и могут быть использованы для простых запросов связанных с произвольными полями.
Список всех параметров связанных с мета-данными:
meta_key(строка)
Ключ(название) произвольного поля.
meta_value(строка)
Значение произвольного поля.
meta_value_num(число)
Значение произвольного поля, число.
meta_compare(строка)
Оператор для проверки значения произвольного поля. Может быть: =, !=, >, >=, <, <=, LIKE, NOT LIKE, IN, NOT IN, BETWEEN, NOT BETWEEN, EXISTS (с версии 3.5), NOT EXISTS (3.5), REGEXP (3.7), NOT REGEXP (3.7) и RLIKE (3.7);
По умолчанию ‘=’
meta_query(массив)
Массив параметров мета-данных определяющих вывод (этот параметр включает в себя meta_key, meta_value и meta_compare и заменяет их). С версии 3.1.
В массиве можно указать следующие параметры:
relation (строка)
Этот параметр указывается как строка в главном массиве meta_query и указывает как сравнивать между собой несколько массивов с параметрами запроса, указанных в этом главном массиве.
Параметр может принимать два значение:
- OR — выбрать мета-поля подходящие хоты бы под один массив с параметрами запроса;
- AND (по умолчанию) — выбрать мета поля подходящие для всех массивов с параметрами запроса.
key (строка)
Ключ поля.
value (строка/массив)
Значение поля. Указывать не нужно, если при сравнении используется: ‘EXISTS’ или ‘NOT EXISTS’ (с версии 3.9).
compare (строка)
Как сравнивать указанное в value значение. Может быть:
- = — равно.
- != — не равно.
- > — больше.
- >= — больше или равно.
- < — меньше.
- <= — меньше или равно.
- LIKE — указанная в value подстрока имеется в строке. Как ‘%значение%’ в sql запросе.
- NOT LIKE — тоже что LIKE только наоборот.
- IN — в value указываются несколько значений в массиве и поиск идет хотя бы по одному из значений.
- NOT IN — любое значение, кроме тех что указанны в виде массива в value.
- BETWEEN — в value указываются 2 значения в массиве: большее и меньшее и поиск идет между этих значений. , например: ‘value’ => array(5, 25) — от 5 до 25 (включительно).
- NOT BETWEEN — любое значение, за пределами диапазона указанного в value, например: ‘value’ => array(5, 25) — меньше 5 и больше 25.
- EXISTS — выведет всё где существует указанный в ‘key’ ключ. ‘value’ не указывается в этом случае. (с версии 3.5)
- NOT EXISTS — выведет всё где указанный в ‘key’ ключ не существует. ‘value’ не указывается в этом случае. (с версии 3.5)
- REGEXP — в value указывается регулярное выражение для поиска, например: ‘value’ => ‘^bar’, (найдет строку: ‘bar is’). (с версии 3.7)
- NOT REGEXP — в value указывается регулярное выражение для поиска, найдет все что не входит в это выражение. (с версии 3.7)
- RLIKE — синоним REGEXP. (с версии 3.7)
По умолчанию ‘IN’, если value массив, ‘=’ в других случаях.
type (строка)
тип произвольного поля (если, например в поле указываются только числа то нужно использовать NUMERIC, чтобы числа не сравнивались как строки). Может быть:
- NUMERIC — целые числа
- DECIMAL — дробные числа
- SIGNED — целые числа, положительные и отрицательные
- UNSIGNED — целые числа, только положительные
- CHAR — строка не чувствительна к регистру
- BINARY — строка чувствительная к регистру
- DATETIME — дата и время
- DATE — только дата
- TIME — только время
По умолчанию: CHAR.
Тип DATE работает при сравнении BETWEEN только если дата указывается в формате YYYY-MM-DD и сравнивается с аналогичным форматом.
Параметры Типов постов
Показывает посты указанного типа.
post_type(строка/массив)
Записи какого типа нужно показывать. По умолчанию: post. Но если указан параметр tax_query, то по умолчанию ставиться any.
Может быть:
- any — включает все типы, кроме revision и типов у которых указан параметр exclude_from_search=true.
- attachment — по умолчанию WP_Query ставит статус ‘post_status’=>’publish’, а вложения имеют статус ‘post_status’=>’inherit’, поэтому чтобы вывести вложения нужно еще изменить параметр post_status на ‘inherit’ или ‘any’.
- page — страница.
- post — пост.
- revision — ревизия.
- custom_type — название (ярлык) произвольного типа записи.
- array(‘post’,’page’) — сразу несколько типов в массиве.
По умолчанию: post
Параметры Статусов
Получает посты с указанным статусом.
post_status(строка/массив)
Статус поста. По умолчанию «publish», а если пользователь авторизован добавляется еще и private. Если запрос запущен из админ части, добавляются еще и защищенные типы статусов, это: ‘future’, ‘draft’ и ‘pending’. Все типы статусов:
- publish — опубликованный пост;
- pending — пост на модерации;
- draft — черновик;
- auto-draft — черновик, сохраненный самим WordPress (авто-сохранение);
- future — запланированный пост;
- private — личный пост;
- inherit — ревизия;
- trash — удаленный пост (в корзине). С версии 2.9;
- any — все статусы, кроме типов постов с «exclude_from_search=true».
По умолчанию: ‘publish’
Параметры Даты (времени)
Выводит посты принадлежащие определенному периоду времени.
year(число)
4 цифры года (2013)
monthnum(число)
Номер месяцы (1 — 12)
w(число)
Неделя в году (с 0 до 53)
day(число)
День месяца (1 — 31)
hour(число)
Час (0 — 23)
minute(число)
Минута (0 — 60)
second(число)
Секунда (0 — 60)
m(число)
ГодМесяц (201306)
date_query(массив)
Работает на основе отдельного класса: WP_Date_Query.
column — поле в базе данных для запроса.
Может быть:
- post_date
- post_date_gmt
- post_modified
- post_modified_gmt
- comment_date
- comment_date_gmt
- user_registered
По умолчанию: post_date
compare — каким оператором производить сравнение. Может быть: =, !=, >, >=, <, <=, IN, NOT IN, BETWEEN, NOT BETWEEN.
relation — оператор, если указаны несколько массивов с датами: AND (учитывать одновременно все указанные массивы) или OR (если есть совпадения хотя бы с одним указанным массивом). По умолчанию — OR
- Эти параметры, которые должны использоваться во вложенном массиве. Они определяют сам запрос. Список параметров:
- before (строка/массив) — строка или массив с датой «до»
- after (строка/массив) — строка или массив с датой «после»
- column (строка) — см. выше, только для конкретной даты. По умолчанию значение верхнего массива
- compare (строка) — см. выше, только для конкретной даты. По умолчанию ‘=’
- inclusive (логический) — аргументы before и after обрабатываются включительно, если true
- year (число/массив) — год, например 2013
- month (число/массив) — месяц, 1-12
- week (число/массив) — неделя, 0-53
- day (число/массив) — день, 1-31
- dayofweek (число/массив) — день недели, 1-7
- hour (число/массив) — час, 0-23
- minute (число/массив) — минута, 0-60
- second (число/массив) — секунда, 0-60
Параметры Отступов
Можно установить отступ от первого поста в результатах запроса. Например, стандартно запрос возвращает 6 постов, а если в тот же запрос добавить параметр offset=1, то будут возвращены 5 постов (первый пост из запроса будет пропущен).
offset(число)
Сколько постов из результатов запроса пропустить.
Параметры Сортировки и порядка
Сортирует и устанавливает направление сортировки.
order(строка)
Направление сортировки по параметру orderby, может быть:
- ASC — по порядку, от меньшего к большему (1, 2, 3; a, b, c).
- DESC — в обратном порядке, от большего к меньшему (3, 2, 1; c, b, a) .
orderby(строка)
Поля по которым можно сортировать посты. Может быть
- none — не сортировать, выводить прям как находиться в БД. равносильно сортировке по ID. С версии 2.8.
- ID — сортировка по ID.
- author — сортировка по ID авторов.
- title — сортировка по заголовку.
- name — по названию поста (ярлык, слаг поста).
- date — сортировка по дате публикации.
- modified — сортировка по дате изменения.
- type — по типу поста (post_type). С версии 4.0
- parent — сортировка по значению поля parent.
- rand — случайный порядок.
- RAND(x) — в случайном порядке для числовых значений. Тут «x» — это целое число.
- comment_count — сортировка по количеству комментариев. С версии 2.9.
- menu_order — стандартно используется для страниц и вложений. Порядковый номер указывается на странице редактирования поста.
- meta_value — по значения произвольного поля.
Важно: параметр meta_key также должен быть определен. Заметка: сортировка будет алфавитной и будет не логична, если значения произвольных полей числа (будет, например, так 1, 3, 34, 4, 56, 6 и т.д., а не 1, 3, 4, 6, 34, 56).
- meta_value_num — сортировка по произвольным полям, значения которых являются числами. С версии 2.8.
- ключ массива из meta_query — в этом случае сортировка будет по значению произвольного поля указанного в массиве meta_query.
- post__in — учитывает порядок указанных ID в параметре post__in.
orderby = array()
С версии WordPress 4.0 в orderby можно указывать массив сочетающий в себе оба параметра: orderby и order. Сделано это для сортировки по нескольким колонкам одновременною Синтаксис такой:
‘orderby’ => array( ‘title’ => ‘DESC’, ‘menu_order’ => ‘ASC’ )
Параметры Пагинации
nopaging(логический)
Выключит пагинацию, выведет все посты на одной странице.
posts_per_page(число)
Количество постов на одной странице. Если выставить -1, то будут выведены все посты (без пагинации). С версии 2.1 заменяет параметр showposts. Установите параметр paged, если пагинация не работает, после использования этого параметра.Заметка: если запрос в feed части, WP перезаписывает этот параметр опцией posts_per_rss. Чтобы повлиять на вывод постов в фиде используйте фильтры post_limits или pre_option_posts_per_rss.
posts_per_archive_page(число)
Количество постов для страниц архивов: для страниц, которые удовлетворяют условиям is_archive() или is_search(). Этот параметр перезаписывает параметры «posts_per_page» и «showposts».
offset(число)
Сколько постов пропустить сверху выборки (верхний отступ).
Внимание: Установка этого параметра переписывает/игнорирует параметр «paged» и ломает пагинацию (решение проблемы).
paged(число)
Номер страницы пагинации. Показывает посты, которые в обычном режиме должны были быть показаны на странице пагинации Х. Переписывает параметр posts_per_page
page(число)
Номер для статической домашней страницы. Показывает записи, которые в обычном режиме должны были быть показаны на странице пагинации Х главной статической странице (front page).
ignore_sticky_posts(логический)
Игнорировать прилепленные посты или нет (true/false). С версии 3.1. Заменяет параметр caller_get_posts.
Прилепленные посты не будут показываться в начале списка, но они не исключаются и будут выводиться в обычном порядке.
Параметры Комментариев
В объект WP_Query добавляются данные комментариев записи, если это отдельная запись. В параметрах ниже, указывается как нужно получать комментарии в таких случаях.
comment_status(строка)
Статус комментария.
ping_status(число)
Статус пинга.
comments_per_page(число)
Число комментариев для получения на отдельной странице комментариев. По умолчанию опция: comments_per_page.
Параметры Поиска
s(строка)
поисковая фраза.
exact(логический)
true — искать по точной фразе указанной в параметре s.
По умолчанию: false
Посты найденные по поисковой фразе.
$query = new WP_Query( ‘s=keyword’ );
Параметры Доступа
Показывает посты если пользователь имеет достаточные права.
perm(строка)
Доступ пользователя.
Выведем опубликованные приватные посты, если у пользователя есть достаточные для просмотра права:
$query = new WP_Query(
array( ‘post_status’ => array( ‘publish’, ‘private’ ), ‘perm’ => ‘readable’ )
);
Параметры Кэширования
Не добавляет данные в кэш при выполнении запросов.
cache_results(логический)
Кэшировать ли информацию о посте.
update_post_meta_cache(логический)
Кэшировать ли информацию о мета данных поста.
update_post_term_cache(логический)
Кэшировать ли информацию о привязке поста к терминам и таксономиям.
Обычно эти функции использовать не нужно — кэш необходим! Однако, такой подход может пригодится в ряде случаев. Например, если нам нужно получить список заголовков постов и не нужна никакая другая информация о постах: ни о таксономиях ни о мета данных. Не загружая эту информацию мы может сохранить время на ненужных SQL запросах.
Заметка: если используется плагин постоянного кэширования, все эти флаги устанавливаются в false по умолчанию, так как нет необходимости обновлять кэш при каждой загрузке страницы.
Параметры Возвращаемых данных
Устанавливает какие данные должен возвращать запрос.
fields(строка/массив)
Какие данные возвращать. По умолчанию возвращаются все.
- ids — вернет массив с ID постов.
- id=>parent — вернет ассоциативный массив [ parent => ID, … ].
- Вставка любых других параметров, вернет все поля (по умолчанию) — массив объектов постов.
no_found_rows(логический)
true — не подсчитывать количество найденных строк. В некоторых случаях может ускорить запрос.
По умолчанию: false
Комбинирование параметров
Комбинирование в строке
Вы наверняка заметили, что параметры соединяются между собой символом амперсанд — &, именно этим символом параметры комбинируются (объединяются).
$query = new WP_Query(‘cat=3&year=2004’);
Комбинирование с переменными
Посты из категории 13 за текущий месяц на главной странице блога:
if (is_home()) {
$query = new WP_Query($query_string . ‘&cat=13&monthnum=’ . date(‘n’,current_time(‘timestamp’))); }
Комбинирование массивом
Вернет только 2 поста, из категории 1 и 3, отсортированные в обратном порядке по заголовку:
$query = new WP_Query( array(
‘category__and’=>array(1,3),
‘posts_per_page’=>2,
‘orderby’=>title,
‘order’=>DESC
));
Методы и свойства класса
Свойства класса WP_Query
$query
Хранит строку запроса.
$query_vars
Ассоциативные массив с данными запроса.
$tax_query
Запрос для таксономии, объект который передается в get_tax_sql().
$meta_query
Запрос для метаполей.
$date_query
Запрос для дат.
$queried_object
Применяется в запросах типа: рубрика, автор, пост или страница. Содержит информацию о категории, авторе, посте или странице.
$queried_object_id
Если запрос относится к рубрике, автору, посте или странице, содержит соответствующий ID.
$request
Полный SQL запрос, который был построен на основе переданных параметров запроса.
$posts
Заполняется данными постов полученными из Базы Данных.
$post_count
Количество постов выводимых на странице.
$current_post
Доступно во время цикла. Индекс текущего поста, которые выводиться.
$in_the_loop
Логическая переменная. Определяет начат ли циклы и находится ли вызываемый объект в цикле.
$post
Доступно во время цикла. Пост который выводится в текущий момент.
$comments
Список комментариев для текущего поста.
$comment_count
Количество комментариев для постов.
$current_comment
Текущий комментарий в цикле комментариев.
$comment
ID текущего комментария.
$found_posts
Количество всех найденных постов.
$max_num_pages
Количество страниц пагинации: $found_posts / $posts_per_page
$is_single, $is_page, $is_archive, $is_preview, $is_date, $is_year, $is_month, $is_time, $is_author, $is_category, $is_tag, $is_tax, $is_search, $is_feed, $is_comment_feed, $is_trackback, $is_home, $is_404, $is_comments_popup, $is_admin, $is_attachment, $is_singular, $is_robots, $is_posts_page, $is_paged
Логические значения. Определяют к какому из типа страницы относится текущий запрос.
$stopwords
Кэшированный список стопслов для поиска.
Методы класса WP_Query
Амперсанд (&) перед методом, вызывает его как ссылку.
Активирует объект, выставляет все значение свойств в null, 0 или false.
Получает параметры запроса, анализирует их и выставляет базовые свойства класса: $posts, $post_count, $post и $current_post.
Анализирует старый запрос заново.
Получает переменную запроса по имени.
Устанавливает переменную запроса. Указываются: название переменной и её значение.
Получает требуемые посты из БД. Также заполняет свойства $posts и $post_count.
Используется во время цикла. Переходит к следующему посту в массиве $posts. Устанавливает $current_post и $post. Метод не устанавливает глобальную переменную $post, а влияет на переменную внутри класса. Возвращает данные текущего поста (объект).
Используется во время цикла. Переходит к следующему посту и меняет глобальную переменную $post.
Используется прям перед циклом. Проверяет есть ли посты для вывода.
Сбрасывает переменные $current_post и $post.
Вызывает методы: parse_query() и get_posts(). Возвращает результат get_posts().
Заполняет переменную $queried_object, если она еще не заполнена и возвращает её.
Заполняет переменную $queried_object_id , если она еще не заполнена и возвращает её.
Конструктор класса. Если переданы данные запроса, вызывает метод query() и передает ему данные.
Заметки по фильтрам
Можно использовать следующие фильтры для внедрения непосредственно в сам SQL запрос.
Фильтры срабатывающие до установки запроса пагинации:
- posts_where — изменяет SQL ‘WHERE’
- posts_join — изменяет SQL ‘JOIN’
Фильтры срабатывающие после установки запроса пагинации:
- posts_where_paged — изменяет SQL ‘WHERE’ во время пагинации
- posts_groupby — изменяет SQL ‘GROUP BY’
- posts_join_paged — изменяет SQL ‘JOIN’ во время пагинации
- posts_orderby — изменяет SQL ‘ORDER BY’
- posts_distinct — изменяет SQL ‘DISTINCTROW’
- post_limits — изменяет SQL ‘LIMIT’
- posts_fields — изменяет получаемые поля таблицы
- posts_clauses — позволяет изменять все части одновременно, передает массив:
- Array (
[where] => AND 1 = 1 AND wp_posts.post_type = ‘post’ AND (wp_posts.post_status = ‘publish’ OR wp_posts.post_status = ‘private’)
[groupby] => wp_posts.ID
[join] => INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )
[orderby] => wp_posts.post_date DESC
[distinct] =>
[fields] => wp_posts.*
[limits] => LIMIT 0, 10 )


admin
— подключил front-page.php и страничку отображающую ошибку 404
— отобразил хедер, футер и сайдбар на front-page
— протестировал запрос $query->the_post()
— зарегистрировал register_nav_menu( ‘primary’, ‘Primary Menu’ ); и подключил wp_nav_menu($args);