Как ограничить количество записей, получаемых WP_Query?
Я искал в Google и WPSE, и единственное, что я постоянно вижу - это использование showposts
, который является устаревшим.
Я знаком с WP_Query
и думал, что если установить posts_per_page
в нужное мне ограничение (например, 5), и nopaging
в значение true
, это будет работать как "Хорошо, я дам тебе только 5 записей". Но это не работает.
Как мне это сделать?
Я думаю, что теперь я понимаю, что вы пытаетесь сделать. Когда вы выполняете пользовательский запрос с помощью WP_Query
и устанавливаете лимит на получение только 5 записей на страницу, будут получены только 5 записей, НО для целей пагинации WP_Query
всё равно проходит через всю базу данных и подсчитывает все записи, соответствующие критериям запроса.
Это можно увидеть, если посмотреть на свойства $found_posts
и $max_num_pages
запроса. Давайте рассмотрим пример:
У вас есть 20 записей, принадлежащих к стандартному типу записи post
. Вам нужны только последние 5 записей без пагинации. Ваш запрос выглядит так:
$q = new WP_Query( 'posts_per_page=5' );
var_dump( $q->posts )
выдаст вам последние 5 записей, как и ожидалосьecho $q->found_posts
выдаст вам20
echo $q->max_num_pages
выдаст вам4
Влияние этой дополнительной работы минимально на сайтах с небольшим количеством записей, но это может стать затратным, если вы управляете сайтом с сотнями или тысячами записей. Это пустая трата ресурсов, если вам нужны только 5 последних записей.
Существует недокументированный параметр под названием no_found_rows
, который использует логические значения и может быть использован, чтобы заставить запрос прекратить работу после того, как он найдет 5 нужных вам записей. Это заставит WP_Query
не искать больше записей, соответствующих критериям, после того как он получил запрошенное количество записей. Этот параметр уже встроен в get_posts
, поэтому get_posts
работает немного быстрее, чем WP_Query
, хотя get_posts
использует WP_Query
.
Заключение
В заключение, если вы не собираетесь использовать пагинацию в запросе, всегда разумно добавлять 'no_found_rows=true'
в ваш запрос, чтобы ускорить работу и сэкономить ресурсы.

Хорошо, допустим у вас есть тип записи под названием 'blog_posts', и вы хотите получить 5 записей этого типа. Вот что нужно сделать
$args = array(
'post_type' => 'blog_posts',
'posts_per_page' => '5',
);
$query = new WP_Query($args);
Этот запрос вернет 5 записей типа 'blog_posts'. Если это не пользовательский тип записи, тогда просто замените на 'post_type' => 'posts',
. Если вы хотите получить все записи, тогда замените на 'posts_per_page' => '-1',
. Для получения более подробной информации смотрите WP Query

Я знаю, что @user1750063 упомянул код, но попробуйте это
$args = array (
'post_type' => 'custom_post', // тип записи
'nopaging' => false, // включить пагинацию
'posts_per_page' => '5', // количество записей на странице
'order' => 'DESC', // порядок сортировки по убыванию
'orderby' => 'ID', // сортировка по ID
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
// вывод содержимого
}
} else {
// вывод когда записи не найдены
}
wp_reset_postdata(); // Восстановление исходных данных записи

id
недопустим как значение для orderby
, а pagination
является недопустимым параметром

pagination
не является допустимым параметром. Вы имеете в виду 'nopaging' => true
? Если да, то я получу ВСЕ записи. Это не то, что мне нужно. @PieterGoosen Я думаю, он имеет в виду ID
.

orderby предназначен для отображения порядка, верно? Это не влияет на значение/параметр nopaging.
@PieterGoosen почему ID и orderby недопустимы? Можете пояснить этот момент?

После беседы с @Pieter Goosen в комментариях к вопросу, я думаю, что могу ответить на вопрос и объяснить свою ошибку.
Ключевым моментом является то, что found_posts
меня сбивало с толку. Я думал, что это число отражает количество полученных записей, но это не так. Это количество записей, которые соответствуют критериям. Это как если бы WP_Query
состоял из двух частей: одна для поиска (всех) записей, а другая для получения содержимого, когда он проверяет параметры pagination
. Таким образом, у нас есть свойство $post_count
, которое отображает количество полученных записей (в Codex говорится Количество отображаемых записей
), которое, конечно же, равно числу в параметре posts_per_page
, и количеству элементов в массиве свойства $posts
.
Так что WP_Query
не выполняет никакой бесполезной работы, как я думал ^^
Надеюсь, это поможет другим!

Посмотрите мой ответ. Думаю, я понимаю, что вы имеете в виду :-)

Да! Вы сделали это очень хорошо :D Наконец-то я нашел способ сделать это, и я все понимаю =D Спасибо @PieterGoosen!
