В этой части серии статей, посвященных изучению класса WP_Query, мы рассмотрим еще ряд аргументов, которые можно использовать в работе с данным классом, а именно:

  • Статус
  • Сортировка
  • Пагинация

Эти аргументы позволяют извлекать из базы данных запланированные записи, запрашивать интересующие вас вложения, изменять способ сортировки записей, определять количество выводимых записей и многое другое.

Параметры статуса записей

Все мы прекрасно знаем, что WordPress присваивает каждой записи соответствующий статус (наверняка, вы сталкивались с этим при конвертации записей из черновика в опубликованные, либо когда отправляли какую-либо запись в корзину).

Для того чтобы найти записи с одним или несколькими статусами, нужно использовать параметр post_status.

Здесь доступны следующие аргументы:

  • publish: опубликованная запись или страница.
  • pending: запись на модерации.
  • draft: черновик.
  • auto-draft: автоматическое сохранение новой записи без какого-либо контента.
  • future: запланированная запись (которая будет опубликована в будущем).
  • private: личная запись, не доступна незарегистрированным пользователям.
  • inherit: ревизия.
  • trash: удаленная запись (в корзине).
  • any: все статусы, кроме типов записи с параметром ‘exclude_from_search‘ со значением true (т.е. trash или auto-draft).
  • Если в аргументах вы не указываете предварительно статус записи, то WordPress по умолчанию задает статус publish;
  • если текущий пользователь зарегистрирован, то в запрос будут включены записи со статусом private
  • Если выполняется запрос к админ-страницам, то в него будут включены и записи с защитным статусом: по умолчанию это futuredraft или pending.

Предположим, вы работаете с сайтом-афишей и для определенного события используете пользовательский тип записи, в этом случае дата публикации записи будет считаться датой начала события. По умолчанию WordPress не выводит события, которые еще не произошли, но так как это запланированные события и их дата относится к будущему времени, соответственно они имеют статус – future.

В этом случае нужно использовать такие аргументы:

$args = array(
    'post_type' => 'event',
    'post_status' => 'future'
);

Здесь мы выводим только те события, которые еще не произошли. Но если вы хотите вывести еще и события, которые уже произошли, можно включить в массив несколько статусов записи:

$args = array(
    'post_type' => 'event',
    'post_status' => array(
        'future',
        'publish'
    )
);

Параметр post_status используется и для поиска вложений, которые имеют статус inherit. Для того чтобы получить все вложения, используйте следующий код:

$args = array(
    'post_type' => 'attachment',
    'post_status' => 'inherit'
);

В качестве альтернативного варианта можно заменить inherit на any, результат будет аналогичным.

Параметры сортировки

Для сортировки полученных в результате запроса записей используется два параметра: order и orderby. Первый определяет порядок вывода записей в цикле, а второй определяет поля в базе данных, по которым можно сортировать записи.

Сначала рассмотрим аргументы для статуса order.

Параметр order

Здесь доступны два аргумента:

  •  ASC: в порядке возрастания, от меньшего к большему (1, 2, 3; a, b, c).
  • DESC: в порядке убывания, от большего к меньшему (3, 2, 1; c, b, a).

Здесь все просто: если вы не включаете аргумент для order, WordPress по умолчанию будет использовать DESC.

Параметр orderby

Сортировать записи можно по ряду полей:
none: не сортировать (доступно с версии 2.8).
ID: сортировать по id записи. Обратите внимание на заглавные буквы.
author: сортировать по автору.
title: сортировать по заголовку.
name: сортировать по слагу записи.
type: сортировать по типу записи.
date: сортировать по дате.
mоdified: сортировать по последней дате изменения.
parent: сортировать по id родительской записи/страницы.
rand: сортировать в случайном порядке.
comment_count: сортировать по количеству комментариев.
menu_order: сортировать по порядку страниц. Используется в основном для страниц (со значением, которое вы добавляете в метабокс на странице редактирования) и для вложений (с числовыми полями, добавленными в окно загрузчика медиа галереи). Этот же аргумент можно использовать для любого типа записи.
meta_value: сортировка по значению мета ключа (или произвольного поля). Работает в комплекте с параметром meta_key. Мета значения сортируются в алфавитном порядке, а не числовом (т.е. сначала будет 34, а затем 4).
meta_value_num: сортировка по числовым мета значениям. Здесь также в запрос можно включить параметр meta_key.
post_in: учитывает порядок указанных ID в массиве post_in.

По умолчанию используется аргумент date, т.е. дата публикации записи.
Например, если вы хотите сортировать записи по заголовку в порядке возрастания, используйте следующий фрагмент:

$args = array(
    'orderby' => 'title',
    'order' => 'ASC'
);

Сортировка по нескольким полям

Сортировку записей необязательно выполнять только по одному полю. Для сортировки по нескольким полям нужно использовать массив с параметром orderby и при необходимости с параметром order, если вы хотите сортировать каждое из полей в разном порядке.

Предположим, у вас есть произвольное поле «Рейтинги», которые вы хотите использовать для сортировки на сайте интернет-магазина. Для сортировки по рейтингу, а затем по заголовку, в обоих случаях в порядке возрастания, воспользуйтесь фрагментом, представленным ниже:

$args = array(
    'orderby' => array(
        'meta_value_num',
        'title'
    ),
    'order' => 'ASC',
    'meta_key' => 'rating'
);

Обратите внимание, что здесь мы применяем аргумент meta_key для того, чтобы сообщить WordPress какое именно поле мы используем. Так необходимо делать в связи с тем, что WordPress сохраняет метаданные записи не в таблице wp_posts, а в таблице wp_postmeta.

Если же вы хотите, к примеру, сортировать записи по рейтингу в порядке убывания, а по заголовку в порядке возрастания, нужно использовать другой массив:

$args = array(
    'orderby' => array(
        'meta_value_num',
        'title'
    ),
    'order' => array(
        'DESC',
        'ASC'
    ),
    'meta_key' => 'rating'
);

Сортировку по нескольким полям можно выполнять, не используя при этом метаданные записи, например, для сортировки по типу записи, а затем по дате:

$args = array(
    'orderby' => array(
        'type',
        'date'
    ),
    'order' => array(
        'ASC',
        'DESC'
    )
);

Здесь сортировка выполняется по типу записи в порядке возрастания, а затем в каждом типе записи по дате, в порядке убывания.

Параметры пагинации

Следующий ряд параметров используется для пагинации. Эти параметры позволяют определить количество получаемых записей и тип пагинации при их выводе.

  • nopaging (логический): вывести все записи или использовать пагинацию. По умолчанию – ‘false‘, т.е. использовать пагинацию.
  • posts_per_page (число): количество записей, выведенное на каждой странице.
  • posts_per_archive_page (число): количество записей, выведенное на странице архива.
  • offset (число): количество записей, которое нужно сместить или пропустить/
  • paged (число): страница архива, с которой выводятся записи.
  • page (число): количество страниц для статической главной страницы. Выводит записи, которые в обычном режиме должны были быть показаны на странице пагинации Х главной статической страницы.
  • ignore_sticky_posts (логический): игнорировать прикрепленные записи. По умолчанию – false.

Посмотрим как все это работает на практике.

Количество записей и отступы сверху

Например, выводим последние пять записей:

$args = array(
    'posts_per_page' => '5'
);

Обратите внимание, несмотря на то, что вы получаете записи из последних шести в базе данных, в коде вы указываете пять – ‘posts_per_page’ => ‘5’, поскольку это количество записей, которое впоследствии будет выведено.

Идем дальше. Теперь создадим два запроса: один для вывода самой последней записи, а второй для вывода последующих десяти, за исключением записи из первого запроса:

$args = array(
    'posts_per_page' => '1'
);
 
// Query and loop go here as well as resetting posts.
 
$args = array(
    'posts_per_page' => '10',
    'offset' => '1'
);
 
// Second query, loop, and resetting go here.

Для вывода всех записей можно использовать аргумент posts_per_page.

$args = array(
    'posts_per_page' => '-1'
);

Прикрепленные записи

Обычно ваши прикрепленные записи выводятся в первую очередь в любом запросе. Если вы хотите это изменить, воспользуйтесь параметром ignore_sticky_posts.

$args = array(
    'posts_per_page' => '5',
    'ignore_sticky_posts' => true
);

Здесь мы возвращаем последние пять записей, вне зависимости от того, прикреплённые они или нет.

Если же вы хотите вывести только прикрепленные записи, тогда используйте функцию get_option() и аргумент post__in:

$sticky = get_option( 'sticky_posts' );
 
$args = array(
    'posts_per_page' => '5',
    'post__in' => $sticky
);

Здесь мы выводим последние пять прикрепленных записей: если их меньше, чем пять (напр. три), то в результате вы получите только эти три записи.

Пагинация в архивах

Кроме определения количества получаемых страниц из базы данных, параметры пагинации можно использовать и для того, чтобы определить, как именно будут пронумерованы записи на страницах архива и поиска.

Например, следующий фрагмент кода можно использовать для вывода 20 записей на каждой странице архива:

$args = array(
    'posts_per_archive_page' => '20'
);

Обратите внимание: аргумент posts_per_archive_page переопределяет аргумент posts_per_page.

Вы можете также вывести только те записи, которые относятся к указанной странице среди пронумерованных страниц. Например, давайте выведем 20 записей (код выше) с третьей страницы:

$args = array(
    'posts_per_archive_page' => '20',
    'paged' => '3'
);

Эти же записи можно получить с помощью аргумента offset:

$args = array(
    'posts_per_page' => '20',
    'offset' => '40'
);

Здесь мы пропускаем первые 40 записей (они будут на первых двух страницах архива) и получаем следующие 20 записей (которые будут на третьей странице архива). WordPress как раз и хорош тем, что для достижения одной и той же цели, в ваше распоряжение предоставляется несколько альтернативных вариантов.

Пагинацию можно и вовсе отключить, при этом на одной странице будут выведены все записи:

$args = array(
    'nopaging' => true
);

Заключение

Класс WP_Query предоставляет максимум гибкости при определении количества получаемых записей в результате запроса, порядка их отображения и статуса.

Некоторые из рассмотренных аргументов необходимы для поиска конкретных типов записи (напр. ‘post_status’ => ‘inherited’ для вложений), в то время как другие аргументы скорее способствуют корректному выполнению того или иного вида запроса.

С помощью всех этих параметров можно создавать пользовательские запросы, при использовании которых можно достичь гораздо больших результатов, чем простой вывод последних опубликованных записей.

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.