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

18 мар. 2015 г., 12:52:15
Просмотры: 247K
Голосов: 48

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

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

Пример кода WP_Query с настройками ограничения постов

Как мне это сделать?

7
Комментарии

Просто 'posts_per_page=5'

Pieter Goosen Pieter Goosen
18 мар. 2015 г. 12:56:47

Я использую это, но оно находит все записи. Если я обращаюсь к свойству found_posts, оно показывает число больше 5. Я хочу, чтобы мой запрос содержал только 5 записей. Возможно ли это? @PieterGoosen

Elías Gómez Elías Gómez
18 мар. 2015 г. 13:03:05

Вам не следует устанавливать параметр nopaging, установка его в true означает получение всех записей

Pieter Goosen Pieter Goosen
18 мар. 2015 г. 13:05:14

@PieterGoosen Если я не устанавливаю параметр nopaging, он получает значение по умолчанию false, поэтому на главной странице отображается 5 записей, но запрос содержит больше. Я добавляю изображение к вопросу.

Elías Gómez Elías Gómez
18 мар. 2015 г. 13:09:37

Ваши комментарии сбивают с толку, вы просили ограничить количество записей, показываемых на странице, до 5, это то, что вы получаете. Теперь вы говорите (перечитайте свой предыдущий комментарий :-)), что запрос содержит больше. Пожалуйста, объясните. Вы не можете установить posts_per_page и затем использовать no_paging со значением true в одном запросе, это должно быть либо posts_per_page, ЛИБО nopaging установленный в true

Pieter Goosen Pieter Goosen
18 мар. 2015 г. 13:14:11

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

Elías Gómez Elías Gómez
18 мар. 2015 г. 13:19:43

Запрос не будет содержать больше записей, чем вы запросили. Если вы запрашиваете 5, будет получено 5 записей, если существует более 5 записей, соответствующих требованиям. Сделайте var_dump() вашего запроса, например, если ваша переменная запроса - $query, выполните var_dump( $query->posts ). Вы увидите только те 5 записей, которые запросили

Pieter Goosen Pieter Goosen
18 мар. 2015 г. 13:26:28
Показать остальные 2 комментариев
Все ответы на вопрос 4
0
79

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

18 мар. 2015 г. 14:22:12
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

18 мар. 2015 г. 13:07:02
Комментарии

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

Elías Gómez Elías Gómez
18 мар. 2015 г. 13:14:16
4

Я знаю, что @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();     // Восстановление исходных данных записи
18 мар. 2015 г. 13:50:22
Комментарии

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

Pieter Goosen Pieter Goosen
18 мар. 2015 г. 13:58:09

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

Elías Gómez Elías Gómez
18 мар. 2015 г. 14:00:29

orderby предназначен для отображения порядка, верно? Это не влияет на значение/параметр nopaging.

@PieterGoosen почему ID и orderby недопустимы? Можете пояснить этот момент?

Shreyo Gi Shreyo Gi
18 мар. 2015 г. 14:22:21

Должно быть ID, а не id

Pieter Goosen Pieter Goosen
18 мар. 2015 г. 14:25:11
3

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

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

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

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

18 мар. 2015 г. 14:16:53
Комментарии

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

Pieter Goosen Pieter Goosen
18 мар. 2015 г. 14:23:23

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

Elías Gómez Elías Gómez
19 мар. 2015 г. 02:17:48

Готово! Я расширил свой собственный ответ ^^ @PieterGoosen

Elías Gómez Elías Gómez
19 мар. 2015 г. 16:25:22