it-swarm-eu.dev

Jak omezit počet příspěvků, které WP_Query dostane?

Byl jsem výzkum na Google a WPSE a jediná věc, kterou vidím opakovaně, je použití showposts, které je zastaralé.

Jsem obeznámen s WP_Query a myslel jsem, že pokud nastavím posts_per_page na můj limit (tj. 5) a nopaging na true, stane se něco jako " Ok, dám vám jen 5 příspěvků " . Ale to nefunguje.

enter image description here

Jak to mohu udělat?

23
EliasNS

Myslím, že teď chápu, co se snažíte udělat. Když spustíte vlastní dotaz s WP_Query a nastavíte limit pro získání pouze 5 příspěvků na stránku, dotazem bude načteno pouze 5 příspěvků a tento dotaz bude obsahovat pouze 5 příspěvků,ALEpro účely stránkování , WP_Query stále běží přes celou databázi a počítá všechny příspěvky, které odpovídají kritériím dotazu.

To lze vidět, když se podíváte na vlastnosti $found_posts a $max_num_pages dotazu. Příklad:

Máte 20 příspěvků, které patří do výchozího typu příspěvku post. Vy pouze potřebujete nejnovější 5 příspěvků bez stránkování. Váš dotaz vypadá takto

$q = new WP_Query( 'posts_per_page=5' );
  • var_dump( $q->posts ) vám poskytne posledních 5 příspěvků podle očekávání
  • echo $q->found_posts vám dá 20
  • echo $q->max_num_pages vám dá 4

Dopad této dodatečné práce je minimální na stránkách, které mají pouze několik příspěvků, ale může to být drahé, pokud používáte web se stovkami nebo tisíci příspěvky. Je to plýtvání zdroji, pokud budete potřebovat pouze 5 nejnovějších příspěvků

Existuje nezdokumentovaný parametr nazvaný no_found_rows, který používá boolean hodnoty, které můžete použít, aby se vaše dotaz kauci poté, co našel 5 příspěvků, které potřebujete. To bude nutit WP_Query nehledat žádné další příspěvky, které by odpovídaly kritériím poté, co získá počet příspěvků dotazovaných. Tento parametr je již vytvořen v get_posts, což je důvod, proč get_posts je o něco rychlejší než WP_Query, i když get_posts používá WP_Query

Závěrem, pokud nebudete používat dotazování na dotaz, je vždy moudré 'no_found_rows=true' v dotazu urychlit věci a ušetřit na plýtvání zdroji.

38
Pieter Goosen

Vím, že @ user1750063 zmínil kód, ale zkuste to

$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
2
Shreyo Gi

Po rozhovoru s @Pieter Goosen o komentářích k otázce, myslím, že mohu odpovědět na otázku a vysvětlit svou chybu.

Klíčem je, že mě found_posts zmatilo. I thougth, že číslo je příspěvky načteny, ale není. Je to počet příspěvků, které odpovídají kritériím . Je to jako WP_Query měl 2 části: jednu pro nalezení (všechny) příspěvky a další pro načítání obsahu, když zkontroluje parametry pagination. Takže máme vlastnost $post_count, která je počet načtených příspěvků (Codex říká The number of posts being displayed), který je samozřejmě roven číslu v parametru posts_per_page a počtu položek na vlastnosti pole $posts.

Takže WP_Query nedělá žádnou zbytečnou práci, jak jsem si myslel

Doufám, že to pomůže ostatním!

2
EliasNS

Ok, umožňuje mít typ příspěvku nazvaný 'blog_posts' a chcete načíst 5 příspěvků tohoto typu příspěvku. Zde je to, co musíte udělat

$args = array(
        'post_type' => 'blog_posts',
        'posts_per_page' => '5',
);


$query = new WP_Query($args);

Výše uvedený dotaz vrátí 5 příspěvků typu „blog_posts“, pokud se nejedná o vlastní typ příspěvku, pak stačí nahradit tento 'post_type' => 'posts',, chcete-li načíst všechny příspěvky a nahradit je takto 'posts_per_page' => '-1',, pro více informací WP Dotaz

1
shuvroMithun