Як обмежити кількість публікацій, які отримує WP_Query?


25

Я займався дослідженнями в Google і WPSE, і єдине, що я неодноразово бачу, - це використання showposts, тобто застаріле.

Я знайомий з WP_Query, і я подумав , що якщо я ставлю posts_per_pageна мій межа (тобто .. 5), і nopagingв trueце стало б чим - щось на зразок « Добре, я дам вам тільки 5 повідомлень ». Але це не працює.

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

Як я можу це зробити?


Просто'posts_per_page=5'
Пітер Гузен

Я використовую це, але це знайшло всі пости. Якщо я отримую доступ до found_postsресурсу, він говорить про більшу кількість, ніж 5. Я хочу, щоб мій запит містив лише 5 повідомлень. Це можливо? @PieterGoosen
EliasNS

Не слід встановлювати nopagingпараметр, встановивши, що це істина, означає отримати всі повідомлення
Пітер Гусен

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

Ваші коментарі заплутані, ви попросили обмежити кількість публікацій, показаних на сторінці, до 5, саме це ви отримаєте. Тепер ви кажете (перечитайте свій попередній коментар :-)) запит має більше. Будь ласка, поясніть. Ви не можете встановити posts_per_page, а потім використовувати параметр no_paging на істинному в тому самому запиті, це або 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_Query2 частини: одна для пошуку (усіх) публікацій, а інша для отримання вмісту, коли він перевіряє paginationпараметри. Таким чином, у нас є $post_countвластивість - це кількість отриманих публікацій (Codex говорить The number of posts being displayed), що, звичайно, дорівнює числу за posts_per_pageпараметром та кількості елементів у $postsвластивості масиву.

Тож WP_Queryне роби ніякої марної роботи, як я думав ^^

Сподіваюся, це допомагає іншим!


Дивіться мою відповідь. Я думаю, я розумію, що ви маєте на увазі :-)
Пітер Гусен

Так! Ви зробили це дуже добре: 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


Дивіться коментарі до питання, будь ласка.
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 - це показ замовлення, правда? Це не завдає шкоди значенню / параметру нопайгування. @PieterGoosen, чому ID та orderby недійсні? Чи можете ви уточнити суть?
Шрейо Гі

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