Функция "query_posts" возвращает список записей, создаёт Цикл WordPress. По своему назначению эта функция - синоним "WP_Query", который мы рассматривали в статье "Класс WP_Query в WordPress". Но она сделаны для служебных нужд WordPress и её использование может привести к сбоям в системе. Опишем их чуть подробнее.
WordPress формирует запрос к базе данных, основываясь на адрес URL страницы, настрочки ЧПУ (человеко понятный URL - типа транслитерации: "/eda/salat/cesar") и другие параметры. Таким образом система формирует особый запрос для выборки нужной записи или рубрики. Если же странице вызвать функцию "query_posts" вручную, то результаты её работы перезапишут результаты этого внутреннего запроса от системы. Из-за чего WordPress не сможет определить на какой странице находится, сколько записей выводить и т.п.
В отличии от класса "WP_Query" функция "query_posts" изменяет глобальную переменную "$wp_query". Если Вам пришлось использовать функцию "query_posts" в своём коде, то обязательно после неё вызывайте "wp_reset_query", чтобы установить значения глобальный переменных в начальное состояние.
Использование функции "query_posts"
Функция "query_posts" практически ничем не отличается в использовании от класса "WP_Query". То есть это функция, которая позволяет получить публикации из базы данных с самыми разными критериями. К примеру, можно получить публикации за определённое время, из определённых категории или с указанием значений произвольных полей. Единственная разница в том, что "query_posts" записывает результат прямо в глобальные переменные.Рассмотрим запрос, сделанный с помощью этой функции:
<?php
query_posts( [ 'category_name' => 'food' ] );
while(have_posts()){
the_post();
echo '<h2>' . get_the_title() . '</h2>';
echo get_the_content();
}
wp_reset_query();
С помощью такого кода в глобальную переменную будут записаны публикации из базы данных, которые находятся в рубрике "food" (еда). Далее по коду мы использовали функции цикла WordPress, с помощью которых выводим заголовок и содержание каждой полученной публикации.
Функция "query_posts" должна находиться в коде до вызова Цикла WordPress, потому что она создаёт новый объект "$wp_query", который будет использоваться в цикле. После неё WordPress не учитывает параметры, полученные в URL. Если хотите сохранить параметры оригинального запроса, то можете взять параметры текущего в глобальной переменной "$query_string".
Как можно заметить, первым аргументом в функцию "query_posts" передаётся массив. Этот массив содержит параметры фильтра. Давайте попробуем вынести его в отдельную переменную и добавить условий:
<?php
$filter = array(
'category_name' => 'food', // фильтр по категории
'posts_per_page' => 5, // ограничение количества результатов на странице
'orderby' => 'comment_count' // сортировка по убыванию количества комментариев
);
query_posts( $filter );
...
Перечислим возможные ключи фильтрации выборки и описания к ним:
Ключ | Тип | Описание |
---|---|---|
attachment_id | число | ID вложения. Используется если в "post_type" указано значение "attachment" . |
author | число/строка | ID автора публикаций или разделённые запятыми ID авторов. |
author_name | строка | Имя автора. |
author__in | массив | Массив из ID авторов (логика "ИЛИ"). |
author__not_in | массив | Массив из ID авторов, от которых не выводить публикации (логика "НЕ"). |
cache_results | true/false | Кешировать ли полученную информацию публикации. По умолчанию: true |
cat | число/строка | ID категории или строка из ID, разделённых запятыми (логика "ИЛИ") |
category__and | массив | Массив из ID категорий, в которых должна быть публикация (логика "И") |
category__in | массив | Массив из ID категорий, в которых может быть публикация (логика "ИЛИ") |
category__not_in | массив | Массив из ID категорий, в которых не должно быть публикации (логика "НЕ") |
category_name | строка | Ярлык категории (не тег) |
comment_count | массив/число | Фильтрует результат по количеству комментариев. Если указано число, то покажет записи именно с таким количеством комментариев. Можно указать массив с ключами 'value' и 'compare', чтобы получилось так: array('value' => 5, 'compare' => '<') // меньше 5 комментариев В значении 'compare' можно использовать операторы сравнения: '=', '!=', '>', '>=', '<', '<=' . |
comment_status | строка | Статус комментариев, нужно которые получить. |
comments_per_page | число | Количество комментариев, которое нужно отобразить. По умолчанию: 'comments_per_page' |
date_query | массив | Ассоциативный массив аргументов WP_Date_Query |
day | число | Число (день месяца) в диапазоне от 1 до 31. По умолчанию: '' |
exact | true/false | Делать ли поиск по точному совпадению со словом. По умолчанию: false |
fields | строка | Возвращаемые данные. Принимает значения: '' - возвращает объект "WP_Post". 'ids' - возвращает массив из ID публикаций. 'id => parent' - возвращает массив из ID родительских записей По умолчанию: '' |
hour | число | Час (значение от 0 до 23). По умолчанию: '' |
ignore_sticky_posts | true/false | Не включать в выборку прикреплённые публикации. Если указано "false", то исключает прикреплённые публикации из "post__in". По умолчанию: false |
m | число | Комбинация из года и месяца (4 цифры года и 2 цифры месяца). К примеру, "202010". По умолчанию: '' |
meta_compare | строка | Оператор для сравнения со значением 'meta_value'. |
meta_compare_key | строка | Оператор для сравнения со значением 'meta_key'. |
meta_key | строка | Ключ (название) произвольного поля. |
meta_query | массив | Ассоциативный массив из аргументов WP_Meta_Query. |
meta_value | строка | Значение произвольного поля. |
meta_value_num | число | Цифровое значение произвольного поля. |
meta_type_key | строка | Тип значения поля 'meta_key'. Смотрите подробнее "WP_Meta_Query" |
menu_order | число | Порядковый номер в списке меню. |
monthnum | число | Месяца публикации (от 1 до 12). По умолчанию: '' |
name | строка | Ярлык публикации. |
nopaging | true/false | Отключить постраничную навигацию, выводить все публикации без разбиения на страницы. По умолчанию: false |
no_found_rows | true/false | Не считать количество полученных записей. Включение улучшает производительность. По умолчанию: false |
offset | число | Количество публикаций, которые надо пропустить с начала выборки. |
order | строка | Направление сортировки выборки. Возвращает 'ASC' или 'DESC'. По умолчанию: 'DESC' |
orderby | строка/массив | Сортируем полученные публикации по параметру. Можно передать несколько опций массивом. Если нужно использовать сортировку по "meta_value" или "meta_value_num", то "meta_key=keyname" должно быть задано. Принимает слудющие значения: 'none', 'name', 'author', 'date', 'title', 'modified', 'menu_order', 'parent', 'ID', 'rand', 'relevance', 'comment_count', 'meta_value', 'meta_value_num', 'post__in', 'post_name__in', 'post_parent__in' По умолчанию сортировка идёт по дате ('date') |
p | число | ID публикации. |
page | число | Номер для статической домашней страницы. Показывает записи, которые в обычном режиме должны были быть показаны на странице пагинации Х главной статической странице. |
paged | число | Порядковый номер страницы. |
page_id | число | ID страницы. |
pagename | строка | Ярлык страницы. |
perm | строка | Права доступа для публикаций. |
ping_status | строка | Статус пинга. |
post__in | массив | Массив ID публикаций, которые необходимо включить в выборку. Прикреплённые публикации тоже будут включены. |
post__not_in | массив | Массив ID публикаций, которые не надо получать (логика "НЕ И"). |
post_mime_type | строка | MIME тип публикаций. Используется, если в "post_type" указано щначение "attachment". |
post_name__in | массив | Массив ярылоков публикаций (логика "ИЛИ"). |
post_parent | число | ID родительских публикаций. В значении "0" возвращает все публикации корневого уровня. |
post_parent__in | массив | Массив родительских публикаций, из которых брать записи (логика "ИЛИ"). |
post_parent__not_in | массив | Массив родительских публикаций, из которых нельзя брать записи (логика "НЕ"). |
post_type | строка/массив | Ярлык типа публикации или массив из них. По умолчанию: 'any' |
post_status | строка/массив | Статус публикации (или массив из статусов). |
posts_per_page | число | Количество публикаций на странице. В значении "-1" возвращает все публикации. |
posts_per_archive_page | число | Количество публикаций на странице архива. Перезаписывает ключ "posts_per_page", если "is_archive" или "is_search" находятся в положении "true". |
s | строка | Фраза для поиска. Если поставить перед словом дефис, будут исключены сообщения, включающие это слово. К примеру, "сыр - мышь" вернёт публикации, которые содержат слово "сыр", но не содержат слово "мышь". Знак исключения (тире) может быть изменён на другой, используя фильтр 'wp_query_search_exclusion_prefix'. |
second | число | Секунды публикации (цифра от 0 до 60). По умолчанию: '' |
sentence | true/false | Поиск по фразе. По умолчанию: false |
suppress_filters | true/false | Не учитывать фильтры. По умолчанию: false (учитывать) |
tag | строка | Ярлыки тегов, разделённые запятыми. |
tag__and | массив | Массив ID тегов (логика: "И") |
tag__in | массив | Массив ID тегов (логика: "ИЛИ") |
tag__not_in | массив | Массив ID тегов (логика: "НЕ") |
tag_id | число | ID тегов или список ID тегов через запятую. |
tag_slug__and | массив | Массив тегов или ярлыков тегов (логика: И) |
tag_slug__in | массив | Массив тегов или ярлыков тегов (логика: ИЛИ). Работает если 'ignore_sticky_posts' включен в "true". Указываются именно теги. Указание ID тегов работать не будет. |
tax_query | массив | Ассоциативный массив из аргументов функции WP_Tax_Query. |
title | строка | Заголовок публикации. |
update_post_meta_cache | true/false | Обновлять или нет кеш публикации. По умолчанию: true |
update_post_term_cache | true/false | Обновлять или нет кеш мета информации. По умолчанию: true |
lazy_load_term_meta | true/false | Загружать ли мета информацию из кеша. Положение "false" отключает кеш запроса для мета информации. Поэтому каждый вызов функции "get_term_meta" начинает делать запрос к базе данных. По умолчанию: значение из переменной $update_post_term_cache |
w | число | Номер недели (цифра от 0 до 53). По умолчанию: '' |
year | число | Год публикации (4 символа). По умолчанию: '' |