posts_per_page без ограничений

11 дек. 2011 г., 17:50:13
Просмотры: 269K
Голосов: 56

Я хочу вернуть ВСЕ записи с query_posts. Я пытался установить posts_per_page на очень большое число, но query_posts глючит и не возвращает никаких записей. Какой правильный способ запросить записи без ограничений?

$args = array(
    'post_type'      => 'post',
    'cat'            => '22,47,67',
    'orderby'        => 'name',
    'order'          => 'ASC',
    'hide_empty'     => 1,
    'depth'          => 1,
    'posts_per_page' => ?
    );
5
Комментарии

Я уже некоторое время ищу в Google и в документации WP, но не могу найти прямого ответа на этот простой вопрос. Я считаю, что мой вопрос сформулирован ясно, с примером кода и описанием моей попытки (установка высокого значения для аргумента). Я не эксперт в WP, поэтому я пришел сюда задать вопрос. Даже ответы на вопросы, которые кажутся вам тривиальными, помогают развивать сообщества Stack Exchange. Лично я очень рад видеть ссылку на Stack Overflow в результатах поиска, а не ссылку на какой-то паршивый форум.

Banjer Banjer
11 дек. 2011 г. 19:50:05

Также, спасибо за ответ. Вам следует опубликовать его как ответ, а не как комментарий, чтобы я мог его принять.

Banjer Banjer
11 дек. 2011 г. 19:51:24

Я понял вашу точку зрения и ценю ваши усилия в написании вопроса. Я также согласен, что вопросы не-экспертов могут оказаться ценными для этого сообщества. С другой стороны, слишком много таких вопросов может отпугнуть некоторых экспертов от участия здесь. Думаю, всё дело в некотором балансе. В любом случае, я обычно много голосую "за", так что с нетерпением жду ваших следующих вопросов :) Желаю вам отличного времяпровождения здесь на WPSE.

Michal Mau Michal Mau
11 дек. 2011 г. 20:15:32

PS: вы также хотите заменить type на post_type (или полностью удалить эту строку). Я отредактирую как ответ Rutwick'а, так и ваш вопрос, чтобы никто не скопировал эту маленькую ошибку.

Michal Mau Michal Mau
11 дек. 2011 г. 20:20:34

@Maugly Спасибо за исправление... просто сосредоточился на posts_per_page и поэтому скопировал опечатку! ;)

Rutwick Gangurde Rutwick Gangurde
11 дек. 2011 г. 21:06:07
Все ответы на вопрос 6
4
113

-1 - вот ваш ответ! Ищите posts_per_page здесь.

$args = array(
'post_type'      => 'post',
'cat'            => '22,47,67',
'orderby'        => 'name',
'order'          => 'ASC',
'hide_empty'     => 1,
'depth'          => 1,
'posts_per_page' => -1
);

Важное предостережение: Это может привести к очень большому запросу, который способен вызвать падение сайта. Делайте это только если вы уверены, что ваша база данных справится с нагрузкой. Не используйте в публичных темах или плагинах.

11 дек. 2011 г. 19:48:59
Комментарии

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

fuxia fuxia
11 авг. 2016 г. 20:25:08

@toscho Добавляю ваш комментарий как обновление к ответу.

Rutwick Gangurde Rutwick Gangurde
23 нояб. 2016 г. 08:25:37

вы спасли мне жизнь!!

Darlan Dieterich Darlan Dieterich
11 окт. 2019 г. 05:14:14

@DarlanDieterich Рад был помочь! :)

Rutwick Gangurde Rutwick Gangurde
14 окт. 2019 г. 10:19:49
0
33

Или, в качестве альтернативы, вы можете передать WP_Query (который используется в query_posts) аргумент nopaging, который по сути делает то же самое.

$args = array(
    'nopaging' => true
    // Ваши другие аргументы и т.д.
);

Это будет делать точно то же самое, но если вам придется вернуться к коду позже и вы не сможете вспомнить, что делали, лично я считаю, что вам будет яснее, что вы намеревались делать с этим параметром внутри массива аргументов.

Как я уже упоминал, оба подхода фактически дают одинаковый результат.

Не помешает иметь более одного подхода, и всегда приятно делиться тем, что вы знаете. Достаточно сказать, что это и есть причина моего ответа, несмотря на то, что у вас уже есть достаточный ответ... ;)

12 дек. 2011 г. 19:16:58
0

Из файла функций вашей дочерней темы:

add_action( 'pre_get_posts', 'wpsites_no_limit_posts' );

function wpsites_no_limit_posts( $query ) {

if( $query->is_main_query() && !is_admin() && is_home() ) {

$query->set( 'posts_per_page', '-1' ); // установить бесконечное количество записей на странице
$query->set( 'order', 'ASC' ); // установить порядок сортировки по возрастанию
$query->set( 'post_type', 'post' ); // установить тип записи как 'post'
$query->set( 'cat', '22,47,67' ); // установить категории с ID 22, 47 и 67
$query->set( 'orderby', 'name' ); // сортировать по имени
$query->set( 'order', 'ASC' ); // повторная установка сортировки по возрастанию
$query->set( 'hide_empty', '1' ); // скрыть пустые категории
$query->set( 'depth', '1' ); // установить глубину вложенности 1

    }

}
23 февр. 2014 г. 05:19:11
1

Используя решение Рикардо с некоторыми модификациями:

static $paged;
$post_ids = [];
do {
    $paged++;
    $defaults = [
        'fields' => 'ids', // Возвращаем только поле ID, чтобы ускорить запрос.
        'post_type' => 'post',
        'posts_per_page' => 100,
        'no_found_rows' => false, // Нам нужна пагинация и общее количество найденных записей.
        'paged' => $paged,
        'update_post_term_cache' => false,
        'update_post_meta_cache' => false,
    ];
    $query = new WP_Query($defaults);
    if ($query->have_posts()) {
        foreach ($query->posts as $id) {
            $post_ids[] = $id;
        }
    }
} while ($query->max_num_pages > $paged);

return $post_ids;

Это значительно уменьшит время выполнения запроса, так как будет запрашиваться только поле ID и не будет обновляться кэш терминов и метаданных.

18 окт. 2019 г. 00:18:06
Комментарии

Отлично! спасибо за публикацию.

Ricardo Canelas Ricardo Canelas
19 окт. 2019 г. 01:25:29
1

Правильный ответ на ваш вопрос - это 'posts_per_page' => -1, потому что -1 вернет неограниченное количество записей на странице, как указали другие пользователи.

Я хочу добавить дополнение к этому вопросу и ответу,

Если вы хотите получить количество записей на странице из настроек чтения в панели администрирования WordPress, вам нужно вызвать функцию get_option() и передать ей строку posts_per_page.

$args = array(
    'post_type'      => 'post',
    'cat'            => '22,47,67',
    'orderby'        => 'name',
    'order'          => 'ASC',
    'hide_empty'     => 1,
    'depth'          => 1,
    'posts_per_page' => get_option('posts_per_page')
    );

Надеюсь, этот ответ поможет кому-нибудь, как он помог мне. Счастливого кодинга, пользователи Stackexchange

11 авг. 2016 г. 19:29:45
Комментарии

Это действительно хорошее дополнение!

Herbert Van-Vliet Herbert Van-Vliet
29 дек. 2017 г. 02:59:12
1

Или...

function getAll($arg, $posts_per_page = 50)
{
    $data = array();
    $page = 1;

    do{
        $arg['paged'] = $page;
        $arg['posts_per_page'] = $posts_per_page;

        $query = new WP_Query($arg);

        foreach ($query->posts as $post){
            $data[] = $post;
        }

        $page++;

    }while(count($query->posts) === $posts_per_page);

    return $data;
}
22 февр. 2017 г. 12:43:43
Комментарии

Вам следует добавить контекст, чтобы объяснить ваш код, вашу идею решения вопроса.

bueltge bueltge
22 февр. 2017 г. 14:25:02