Знакомство с WP_Query
для разбиения контента на страницы.
Вывод текущей страницы пагинации на статической главной странице:
$paged = (get_query_var('page')) ? get_query_var('page') : 1;$query = new WP_Query( array( 'paged' => $paged ) );
Прилепленные посты
Выведем все прилепленные посты:
$sticky = get_option( 'sticky_posts' );$query = new WP_Query( ('post__in'=>$sticky );
Выведем только первый прилепленный пост:
$sticky = get_option( 'sticky_posts' );$query = new WP_Query( 'p=' . $sticky[0] );
Выведем первый прилепленный пост, если такого поста нет, то последний опубликованный:
$args = array( 'posts_per_page' => 1, 'post__in' => get_option( 'sticky_posts' ), 'ignore_sticky_posts' => 1);$query = new WP_Query( $args );
Выведем первый прилепленный пост, если такого поста нет, то ничего не выводим:
$sticky = get_option( 'sticky_posts' );$args = array( 'posts_per_page' => 1, 'post__in' => $sticky, 'ignore_sticky_posts' => 1);$query = new WP_Query( $args );if ( $sticky[0] ) { // формируем вывод...}
Скрытие прилепленных постов
Исключим все прилепленные посты из запроса:
$query = new WP_Query( array( 'post__not_in' => get_option( 'sticky_posts' ) ) );
Исключим прилепленные посты из категории. Вернет все посты рубрики, но прилепленные посты не будут сверху, они будут выводится как обычные посты (по дате):
$query = new WP_Query( array( 'ignore_sticky_posts' => 1, 'posts_per_page' => 3, 'cat' => 6 );
Исключим прилепленные посты из категории. Вернет все посты рубрики, но прилепленные посты будут полностью исключены. Также добавим сюда правило для правильной пагинации:
$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;$sticky = get_option( 'sticky_posts' );$args = array( 'cat' => 3, 'ignore_sticky_posts' => 1, 'post__not_in' => $sticky, 'paged' => $paged);$query = new WP_Query( $args );
Параметры Комментариев
В объект 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(логический)
- Кэшировать ли информацию о привязке поста к терминам и таксономиям.
#1 Выведем 50 постов, но не будет добавлять информацию о постах в кэш:
$query = new WP_Query( array( 'posts_per_page' => 50, 'cache_results' => false ) );
#2 Выведем 50 постов, но не будем добавлять мета данные поста в кэш
$query = new WP_Query( array( 'posts_per_page' => 50, 'update_post_meta_cache' => false ) );
#3 Выведем 50 постов, но не будем добавлять в кэш информацию о терминах постов
$query = new WP_Query( array( 'posts_per_page' => 50, 'update_post_term_cache' => false ) );
Обычно эти функции использовать не нужно — кэш необходим! Однако, такой подход может пригодится в ряде случаев. Например, если нам нужно получить список заголовков постов и не нужна никакая другая информация о постах: ни о таксономиях ни о мета данных. Не загружая эту информацию мы может сохранить время на ненужных SQL запросах.
Заметка: если используется плагин постоянного кэширования, все эти флаги устанавливаются в false по умолчанию, так как нет необходимости обновлять кэш при каждой загрузке страницы.
Параметры Возвращаемых данных
Устанавливает какие данные должен возвращать запрос.
- fields(строка/массив)
- Какие данные возвращать. По умолчанию возвращаются все.
- ids — вернет массив с ID постов.
- id=>parent — вернет ассоциативный массив [ parent => ID, … ].
- Вставка любых других параметров, вернет все поля (по умолчанию) — массив объектов постов.
- no_found_rows(логический)
- true — не подсчитывать количество найденных строк. В некоторых случаях может ускорить запрос.
По умолчанию: false
Комбинирование параметров
#1. Комбинирование в строке
Вы наверняка заметили, что параметры соединяются между собой символом амперсанд — &, именно этим символом параметры комбинируются (объединяются).
$query = new WP_Query('cat=3&year=2004');
#2. Комбинирование с переменными
Посты из категории 13 за текущий месяц на главной странице блога:
if (is_home()) {$query = new WP_Query($query_string . '&cat=13&monthnum=' . date('n',current_time('timestamp')));}
#3. Комбинирование массивом
Вернет только 2 поста, из категории 1 и 3, отсортированные в обратном порядке по заголовку:
$query = new WP_Query( array( 'category__and'=>array(1,3), 'posts_per_page'=>2, 'orderby'=>title, 'order'=>DESC ));
#4. Записи из категории и с меткой
Вывести все посты из категории 1, имеющие метку apples:
$query = new WP_Query('cat=1&tag=apples');
Примеры
#1. Чтобы на главной странице блога исключить посты, которые находятся в категории 3, нужно вставить следующий код в файл index.php перед началом Цикла WordPress:
#1.2. Можно добавить еще несколько категорий к исключению:
#2. Получим определенный пост (пост с ID = 5):
#3. Если нужно использовать функцию «читать дальше» (read more) с новым запросом, то нужно переключить глобальную переменную $more на 0:
#4. Получаем определенную страницу (страницу 7):
или
#4.1. Для дочерних страниц нужно указывать имя родительской страницы и самой дочерней страницы. Имена разделяются слэшем (/). Пример:
Вставка переменных в параметры запроса
Можно создавать динамические параметры запроса, если нужно, чтобы запрос менялся в зависимости он каких либо обстоятельств, для этого значение параметра нужно записать в переменную, а затем переменную передать в параметры запроса, сделать это можно несколькими способами:
#1. Сборка запроса с использованием одинарных кавычек ‘ ‘:
#2. Сборка запроса с использованием двойных кавычек » «
Переменные внутри двойных кавычек интерпретируются PHP как переменные, а не как простой текст):
#3. Использование глобальной переменной $query_string
Которая содержит в себе базовый запрос для функции query_posts. Если нам нужно не нарушать стандартный вывод постов WordPress (например, на странице категорий), но при этом убрать пагинацию (вывести все посты на одной странице), то мы может дополнить базовый запрос функции query_posts, параметром posts_per_page=-1:
}?-->
Можно измерить значение posts_per_page на конкретное число необходимых нам постов на одной странице. Например, posts_per_page=10 выведет только 10 постов, а если при этом в конце цикла поставить тег шаблона [posts_nav_link()](/functions/posts_nav_link ), то под циклом появится ссылка для перехода к следующим 10-ти постам (ссылка пагинации).
#4. Параметры также можно передать в виде массива
Так они будут более наглядны и читаемы. Например, пример 2 можно записать так:
$query = new WP_Query(array( 'cat' => 22, 'year' => $current_year, 'monthnum' => $current_month, 'order' => 'ASC',));
Как видите тут можно поставить каждую переменную на отдельную строку, а это более понятно и читаемо.
Добавление параметров в запрос
Сохранение базового запроса текущей страницы и добавление в него своих параметров
функция query_posts полностью переписывает запрос, если например, мы напишемquery_posts (‘cat=1’), то другие параметры запроса, которые используются для текущей страницы (например, сортировка, пагинация и т.д.), будут потеряны и будут выведены посты категории 1 с остальными параметрами по умолчанию. Чтобы сохранить базовые параметры запроса и дополнить/заменить их своими нужно использовать PHP функцию array_merge(объединяет 2 массива в один):
global $wp_query;$query = new WP_Query( array_merge( array('cat' => 1), // это параметр который добавили мы $wp_query->query // это массив базового запроса текущей страницы ));
Этот пример по сути тоже самое что и пример 3 (Использование глобальной переменной$query_string), только с использованием массивов.
Методы и свойства класса
Свойства класса 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
Амперсанд (&) перед методом, вызывает его как ссылку.
- init()
- Активирует объект, выставляет все значение свойств в null, 0 или false.
- parse_query( $query )
- Получает параметры запроса, анализирует их и выставляет базовые свойства класса:
$posts
,$post_count
,$post
и$current_post
. - parse_query_vars()
- Анализирует старый запрос заново.
- get( $query_var )
- Получает переменную запроса по имени.
- set( $query_var, $value )
- Устанавливает переменную запроса. Указываются: название переменной и её значение.
- &get_posts()
- Получает требуемые посты из БД. Также заполняет свойства
$posts
и$post_count
. - next_post()
- Используется во время цикла. Переходит к следующему посту в массиве
$posts
. Устанавливает$current_post
и$post
. Метод не устанавливает глобальную переменную$post
, а влияет на переменную внутри класса. Возвращает данные текущего поста (объект). - the_post()
- Используется во время цикла. Переходит к следующему посту и меняет глобальную переменную
$post
. - have_posts()
- Используется прям перед циклом. Проверяет есть ли посты для вывода.
- rewind_posts()
- Сбрасывает переменные
$current_post
и$post
. - &query(
$query
) - Вызывает методы:
parse_query()
иget_posts()
. Возвращает результатget_posts()
. - get_queried_object()
- Заполняет переменную
$queried_object
, если она еще не заполнена и возвращает её. - get_queried_object_id()
- Заполняет переменную
$queried_object_id
, если она еще не заполнена и возвращает её. - WP_Query(
$query
= » ){} - Конструктор класса. Если переданы данные запроса, вызывает метод
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)
Код WP_Query{} смотрите на странице файла /wp-includes/query.php
WP 4.6
Связанные Функции
Из метки: query запрос
- esc_sql()
- get_boundary_post()
- get_children()
- get_page_by_title()
- get_pages()
- get_posts()
- get_queried_object()