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' => ?
    );

6
Я деякий час гугла в пошуках коду WP, але просто не можу знайти прямої відповіді на це просте запитання. Я вважаю, що моє запитання чітко сформульовано з прикладом коду та якою була моя спроба (встановлення високого значення аргументу). Я не експерт з WP, тому я прийшов сюди, щоб задати питання. Навіть надання відповідей на запитання, які здаються вам тривіальними, є корисним у зростанні цих спільнот Exchange Stack. Я особисто люблю бачити посилання Stack Overflow в результатах пошуку, на відміну від посилань на шалений форум.
Банджер

Також дякую за відповідь. Ви повинні розмістити його як відповідь, а не коментар, щоб я міг прийняти його.
Банджер

Я зрозумів, і я ціную ваші зусилля щодо написання запитання. Я також погоджуюся, що неекспертні питання можуть виявити себе цінними у цій спільноті. З іншого боку, занадто багато таких питань можуть перешкодити деяким експертам брати участь тут. Я думаю, це все про якийсь баланс. У будь-якому випадку я великий виборець, тому я з нетерпінням чекаю ваших наступних питань :) Приємно провести час тут, на WPSE.
Міхал Мау

PS: Ви також хочете замінити typeна post_type(або видалити цей рядок в цілому). Я відредагую відповідь Рутвіка і ваше запитання, щоб не допустити, щоб хтось скопіював цю маленьку помилку.
Міхал Мау

@Maugly Дякую за людину виправлення ... просто зосередився на posts_per_page, отже скопіював друкарську помилку! ;)
Рутвік Ґангурде

Відповіді:


82

-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

23

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

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

Це зробить точно так само, але якщо вам доведеться оглянути це пізніше і не можу згадати, що ви робили, я особисто вважаю, що вам буде зрозуміліше, що це ви мали намір із цим параметром всередині арг масив.

Як я вже згадував, оба вони дійсно досягають того ж.

Не завадить мати більше одного підходу, і завжди приємно поділитися тим, що знаєш, досить сказати, що це причина моєї відповіді, незважаючи на те, що ти вже маєш достатній ..;)


3

З файлу функцій теми для дітей:

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

    }

}

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


Це насправді приємне доповнення!
Герберт Ван-Вліет

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
Вам слід додати контекст, щоб пояснити свій код, вашу ідею вирішити питання.
Бульдж

1

Використання Рікардо з деякою модифікацією:

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;

Це різко збільшить час запиту, використовуючи лише запити до рядка ID та уникаючи оновлення терміна та мета кешу.


Приємно! Дякую, що поділились.
Рікардо Канелас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.