Знакомство с 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 запрос

Остальные из раздела Классы

14

Страницы: 1 2

Страницы: 1 2