Как ограничить количество записей, получаемых 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выдаст вам20echo $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 является недопустимым параметром
Pieter Goosen
pagination не является допустимым параметром. Вы имеете в виду 'nopaging' => true? Если да, то я получу ВСЕ записи. Это не то, что мне нужно. @PieterGoosen Я думаю, он имеет в виду ID.
Elías Gómez
orderby предназначен для отображения порядка, верно? Это не влияет на значение/параметр nopaging.
@PieterGoosen почему ID и orderby недопустимы? Можете пояснить этот момент?
Shreyo Gi
После беседы с @Pieter Goosen в комментариях к вопросу, я думаю, что могу ответить на вопрос и объяснить свою ошибку.
Ключевым моментом является то, что found_posts меня сбивало с толку. Я думал, что это число отражает количество полученных записей, но это не так. Это количество записей, которые соответствуют критериям. Это как если бы WP_Query состоял из двух частей: одна для поиска (всех) записей, а другая для получения содержимого, когда он проверяет параметры pagination. Таким образом, у нас есть свойство $post_count, которое отображает количество полученных записей (в Codex говорится Количество отображаемых записей), которое, конечно же, равно числу в параметре posts_per_page, и количеству элементов в массиве свойства $posts.
Так что WP_Query не выполняет никакой бесполезной работы, как я думал ^^
Надеюсь, это поможет другим!
Посмотрите мой ответ. Думаю, я понимаю, что вы имеете в виду :-)
Pieter Goosen
Да! Вы сделали это очень хорошо :D Наконец-то я нашел способ сделать это, и я все понимаю =D Спасибо @PieterGoosen!
Elías Gómez