Как ограничить количество сообщений, которые получает WP_Query?

25

Я исследовал Google и WPSE, и единственное, что я вижу неоднократно, - это использование showposts, которое устарело.

Я знаком с WP_Query, и я подумал, что если я установлю posts_per_pageсвой лимит (то есть 5), и nopagingдля true, это станет что-то вроде « Хорошо, я дам вам только 5 сообщений ». Но это не работает.

введите описание изображения здесь

Как я могу это сделать?

EliasNS
источник
Просто'posts_per_page=5'
Питер Гусен
Я использую это, но нашел все посты. Если я получаю доступ к found_postsсвойству, он говорит, что число больше 5. Я хочу, чтобы мой запрос содержал только 5 сообщений. Является ли это возможным? @PieterGoosen
EliasNS
Вы не должны устанавливать nopagingпараметр, установив его в true, чтобы получить все сообщения
Pieter Goosen
@PieterGoosen Если я не установлю nopagingпараметр, он получит значение по умолчанию, то есть falseна первой странице будет 5 сообщений, но запрос будет больше. Я добавляю изображение к вопросу.
EliasNS
Ваши комментарии сбивают с толку, вы попросили ограничить количество постов, отображаемых на странице, до 5, вот что вы получаете. Теперь вы говорите (перечитайте свой предыдущий комментарий :-)), запрос содержит больше. Пожалуйста, объясни. Вы не можете установить для posts_per_page, а затем использовать для no_paging значение true в том же запросе, либо для posts_per_page ИЛИ nopaging установлено значение true
Pieter Goosen

Ответы:

43

Я думаю, что теперь я понимаю, что вы пытаетесь сделать. Когда вы запускаете пользовательский запрос с помощью WP_Queryи устанавливаете лимит для получения только 5 сообщений на страницу, запрос будет получать только 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'в своем запросе ускорить процесс и сэкономить на растрате ресурсов.

Питер Гусен
источник
3

После разговора с @Pieter Goosen о комментариях к вопросу, я думаю, что смогу ответить на вопрос и объяснить свою ошибку.

Ключ в том, что found_postsменя смущало. Я думаю, что это число полученных сообщений, но это не так. Это количество постов, которые соответствуют критериям . Это похоже на WP_Queryдве части: одну для поиска (всех) сообщений и другую для извлечения контента, когда он проверяет paginationпараметры. Таким образом, у нас есть $post_countсвойство, которое представляет собой количество извлеченных постов (говорит Кодекс The number of posts being displayed), которое, конечно же, равно числу в posts_per_pageпараметре и количеству элементов в $postsсвойстве массива.

Так WP_Queryчто не делает никакой бесполезной работы, как я думал ^^

Надеюсь, что это помогает другим!

EliasNS
источник
Смотри мой ответ. Я думаю, я понимаю, что вы имеете в виду :-)
Питер Гусен
Да! Вы сделали это очень хорошо: D Наконец-то я получил способ сделать это, и я все понимаю = D Спасибо @PieterGoosen!
EliasNS
Выполнено! Это расширило мой собственный ответ ^^ @PieterGoosen
EliasNS
1

Хорошо, теперь у вас есть тип поста под названием 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

shuvroMithun
источник
Смотрите комментарии по вопросу, пожалуйста.
EliasNS
1

Я знаю, что @ user1750063 упомянул код, но попробуйте это

$args = array (
    'post_type'              => 'custom_post',
    'nopaging'               => false,
    'posts_per_page'         => '5',
    'order'                  => 'DESC',
    'orderby'                => 'ID',
);

$query = new WP_Query( $args );

if ( $query->have_posts() ) {
    while ( $query->have_posts() ) {
        $query->the_post();
        // display content
    }
} else {
    // display when no posts found
}

wp_reset_postdata();     // Restore original Post Data
Шрейо Ги
источник
idнедопустимо в качестве orderbyзначения и paginationявляется недопустимым параметром
Pieter Goosen
paginationне является допустимым параметром. Вы имеете в виду 'nopaging' => true? Если да, то я получу ВСЕ сообщения. Это не то, что я хочу. @PieterGoosen Я думаю, он имеет в виду ID.
EliasNS
orderby для отображения заказа, верно? Это не вредит значению / параметру nopaging. @PieterGoosen, почему ID & orderby недействительны? Можете ли вы уточнить смысл?
Шрейо Ги
Должно быть ID, нетid
Питер Гусен