posts_per_page нет ограничений

41

Я хочу вернуть ВСЕ сообщения с 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' => ?
    );
Banjer
источник
6
Я некоторое время гуглял и искал кодекс WP, но я просто не могу найти прямой ответ на этот простой вопрос. Я полагаю, что мой вопрос четко сформулирован с примером кода, и какова была моя попытка (установка высокого значения для аргумента). Я не эксперт WP, поэтому я пришел сюда, чтобы задать вопрос. Даже предоставление ответов на вопросы, которые кажутся вам тривиальными, полезно для развития сообществ Stack Exchange. Мне лично нравится видеть ссылку переполнения стека в моих результатах поиска, а не ссылку на дерьмовый форум.
Банжер
Также спасибо за ответ. Вы должны опубликовать это как ответ, а не комментарий, чтобы я мог принять это.
Банжер
Я понял вашу точку зрения и ценю ваши усилия по написанию вопроса. Я также согласен, что не экспертные вопросы могут оказаться ценными в этом сообществе. С другой стороны, слишком много таких вопросов может отговорить некоторых экспертов от участия здесь. Я думаю, это все о каком-то балансе. В любом случае, я большой сторонник, поэтому я с нетерпением жду ваших следующих вопросов :) Прекрасно проведите время здесь, на WPSE.
Михал Мау
PS: Вы также хотите заменить typeна post_type(или удалить эту строку в целом). Я отредактирую и ответ Рутвика, и ваш вопрос, чтобы кто-то не смог скопировать эту маленькую ошибку.
Михал Мау
@Maugly Спасибо за исправление человек ... просто сосредоточился на posts_per_page, поэтому скопировал опечатку! ;)
Rutwick Gangurde

Ответы:

83

-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
);

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

Рутвик Гангурде
источник
6
Важное предупреждение: это может привести к очень громкому запросу, который может привести к сбою сайта. Делайте это только в том случае, если вы уверены, что ваша база данных справится с этим. Не в публичных темах или плагинах.
fuxia
@toscho Добавление вашего комментария в качестве обновления к ответу.
Рутвик Гангурде
ты спас мне жизнь !!
Дарлан Дитрих
@DarlanDieterich Рад, что смог помочь! :)
Rutwick Gangurde
24

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

$args = array(
    'nopaging' => true
    // Your other args, etc..
);

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

Как я уже упоминал, они оба на самом деле достигнут одинакового.

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

t31os
источник
4

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

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' );
$query->set( 'cat', '22,47,67' );
$query->set( 'orderby', 'name' );
$query->set( 'order', 'ASC' );
$query->set( 'hide_empty', '1' );
$query->set( 'depth', '1' );

    }

}
Брэд Далтон
источник
2

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

static $paged;
$post_ids = [];
do {
    $paged++;
    $defaults = [
        'fields' => 'ids', // Only return the ID field to make this query faster.
        'post_type' => 'post',
        'posts_per_page' => 100,
        'no_found_rows' => false, // We need pagination & the count for all posts found.
        '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;

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

Остин Пасси
источник
Ницца! Спасибо, что поделился.
Рикардо Канелас
1

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

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

Если вы хотите получить количество постов на странице из настройки чтения в панели администрирования 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')
    );

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

Elkhouaja
источник
Это на самом деле хорошее дополнение!
Герберт Ван-Влит
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;
}
Рикардо Канелас
источник
2
Вы должны добавить контекст, чтобы объяснить ваш код, вашу идею, чтобы решить вопрос.
Bueltge