posts_per_page bez limitu

41

Chcę zwrócić WSZYSTKIE posty z query_posts. Próbowałem ustawić posts_per_pagenaprawdę wysoką liczbę, ale query_postswariuje i nie zwraca żadnych postów. Jaki jest prawidłowy sposób wyszukiwania postów bez ograniczeń?

$args = array(
    'post_type'      => 'post',
    'cat'            => '22,47,67',
    'orderby'        => 'name',
    'order'          => 'ASC',
    'hide_empty'     => 1,
    'depth'          => 1,
    'posts_per_page' => ?
    );
Banjer
źródło
6
Od jakiegoś czasu szukam w Google i przeszukuję kodeks WP, ale po prostu nie mogę znaleźć bezpośredniej odpowiedzi na to proste pytanie. Uważam, że moje pytanie jest sformułowane jasno w przykładowym kodzie i jaka była moja próba (ustawienie wysokiej wartości argumentu). Nie jestem ekspertem od WP, ​​dlatego przybyłem tutaj, aby zadać pytanie. Nawet udzielenie odpowiedzi na pytania, które wydają się trywialne, jest pomocne w rozwoju tych społeczności Stack Exchange. Osobiście uwielbiam widzieć link Przepełnienie stosu w moich wynikach wyszukiwania, w przeciwieństwie do linku do kiepskiego forum.
Banjer
Dziękuję również za odpowiedź. Powinieneś opublikować to jako odpowiedź, a nie komentarz, więc mogę to zaakceptować.
Banjer,
Mam twój punkt widzenia i doceniam twój wysiłek w napisaniu pytania. Zgadzam się również, że pytania niezwiązane z ekspertami mogą okazać się cenne w tej społeczności. Z drugiej strony zbyt wiele takich pytań może zniechęcić niektórych ekspertów do angażowania się tutaj. Chyba chodzi o jakąś równowagę. W każdym razie jestem wielkim głosującym, więc nie mogę się doczekać kolejnych pytań :) Baw się dobrze na WPSE.
Michał Mau,
PS: chcemy także zastąpić typena post_type(lub usunąć tę linię łącznie). Przeredaguję zarówno odpowiedź Rutwicka, jak i twoje pytanie, aby uniemożliwić komuś skopiowanie tego małego błędu.
Michał Mau,
@ Maugly Dzięki za korektę człowieka ... właśnie skupiłem się na post_per_page, dlatego skopiowałem literówkę! ;)
Rutwick Gangurde,

Odpowiedzi:

82

-1 to twoja odpowiedź! Poszukaj posts_per_page tutaj .

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

Ważne zastrzeżenie : może to spowodować bardzo duże zapytanie, które może sprowadzić stronę na dół. Zrób to tylko wtedy, gdy masz pewność, że Twoja baza danych może to obsłużyć. Nie w publicznych tematach ani wtyczkach.

Rutwick Gangurde
źródło
6
Ważne zastrzeżenie: może to spowodować bardzo duże zapytanie, które może sprowadzić stronę na dół. Zrób to tylko wtedy, gdy masz pewność, że Twoja baza danych może to obsłużyć. Nie w publicznych tematach ani wtyczkach.
fuxia
@toscho Dodanie komentarza jako aktualizacji odpowiedzi.
Rutwick Gangurde
ratujesz mi życie !!
Darlan Dieterich
@DarlanDieterich Cieszę się, że mogłem pomóc! :)
Rutwick Gangurde
23

Lub możesz przekazać WP_Query(który query_postsużywa) nopagingargument, który zasadniczo robi to samo.

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

Zrobi dokładnie to samo, ale jeśli będziesz musiał spojrzeć na to później i nie pamiętam, co robiłeś, osobiście uważam, że będzie dla ciebie bardziej jasne, co zamierzałeś z tym parametrem wewnątrz argumentów szyk.

Jak już wspomniałem, oba osiągną to samo.

Nie może zaszkodzić mieć więcej niż jedno podejście i zawsze miło jest podzielić się tym, co wiesz, wystarczy powiedzieć, że to jest powód mojej odpowiedzi, mimo że masz już wystarczające ...;)

t31os
źródło
3

Z pliku funkcji motywów potomnych:

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

    }

}
Brad Dalton
źródło
1

Właściwą odpowiedzią na Twój problem jest to, 'posts_per_page' => -1że -1zwróci nieograniczoną liczbę postów na stronę, tak jak inni użytkownicy.

Chcę tylko dodać dodatek do tego pytania / odpowiedzi,

Jeśli chcesz uzyskać liczbę postów na stronę z ustawienia czytania w Panelu administracyjnym WordPress, musisz wywołać get_option()funkcję i przekazać ją posts_per_pagejako ciąg znaków.

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

Mam nadzieję, że ta odpowiedź pomoże komuś, ponieważ pomoże mi. Zadowoleni użytkownicy Stackexchange do kodowania

Elkhouaja
źródło
To naprawdę fajny dodatek!
Herbert Van-Vliet,
1

Lub..

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;
}
Ricardo Canelas
źródło
2
Powinieneś dodać kontekst, aby wyjaśnić swój kod, swój pomysł na rozwiązanie pytania.
bueltge
1

Używanie Ricardo z pewnymi modyfikacjami:

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;

Znacząco wydłuży to czas zapytania, wysyłając zapytanie tylko do wiersza identyfikatora i unikając aktualizacji terminu i meta cache.

Austin Passy
źródło
Miły! dzięki za udostępnienie.
Ricardo Canelas