fbpx

В этой части серии статей, посвященных изучению класса 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’ для вложений), в то время как другие аргументы скорее способствуют корректному выполнению того или иного вида запроса.

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Написать комментарий

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

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: