WP_Query'nin aldığı gönderilerin sayısı nasıl sınırlanır?


25

Google ve WPSE’de araştırmalar yapıyorum ve tekrar tekrar gördüğüm tek şey showposts, kullanımdan kaldırılmış olmak.

Ben tanıyorum WP_Queryve ben ayarlarsanız düşündüm posts_per_pagebenim sınırı (yani. 5) ve karşı nopagingüzere true, bu "gibi bir şeye olacaktı Tamam, sana vereceğim sadece 5 mesajların ". Fakat bu işe yaramıyor.

görüntü tanımını buraya girin

Bunu nasıl yapabilirim?


Sadece'posts_per_page=5'
Pieter Goosen

Bunu kullanıyorum, ama bu bütün mesajları buldu. Özelliğe erişebilirsem found_posts, 5'ten büyük bir sayı yazıyor. Sorgumun yalnızca 5 gönderide bulunmasını istiyorum. Mümkün mü? @PieterGoosen
EliasNS

Sen set olmamalı nopaginggerçek araçlarına almak için o ayarı, parametre tüm mesajları
Pieter Goosen'ın

@PieterGoosen nopagingParametreyi ayarlamazsam varsayılan değeri alır false, bu yüzden ön sayfa 5 gönderi gösterir, ancak sorgu daha fazla tutar. Soruya bir resim ekliyorum.
EliasNS

Yorumlarınız kafa karıştırıcı, bir sayfada gösterilen yazı sayısını 5 olarak sınırlamanız istendi. Şimdi, sorguyu daha çok tuttuğunu söyleyin (önceki yorumunuzu tekrar okuyun :-)). Lütfen açıkla. Posts_per_page'i ayarlayamaz ve aynı sorguda true olarak ayarlanmış no_paging setini kullanamazsınız, posts_per_page VEYA nopaging true olarak ayarlanmıştır
Pieter Goosen

Yanıtlar:


43

Sanırım şimdi ne yapmaya çalıştığını anladım. Eğer ile özel bir sorgu çalıştırdığınızda WP_Queryve sayfa başına sadece 5 mesajları almak için sınırı ayarlamak, sadece 5 mesaj sorgu tarafından alınır ve bu sorgunun sadece 5 mesajları yapacak, ANCAK pagination uğruna, WP_Queryhâlâ tüm veritabanı geçiyor ve sorgunun ölçütlerine uyan tüm gönderileri sayar.

Sorgu $found_postsve $max_num_pagesözellikleri baktığınızda görülebilir . Bir örnek verelim:

Varsayılan gönderi türüne ait 20 gönderiniz var post. Sen sadece pagination olmadan son 5 Mesajları gerekir. Sorgunuz buna benziyor

$q = new WP_Query( 'posts_per_page=5' );
  • var_dump( $q->posts ) beklendiği gibi size son 5 yazı verecek
  • echo $q->found_posts sana vereceğim 20
  • echo $q->max_num_pages sana vereceğim 4

Bu fazladan çalışmanın etkisi, yalnızca birkaç yayın içeren siteler üzerinde çok az olmakla birlikte, yüzlerce veya binlerce yayın içeren bir siteyi çalıştırıyorsanız, bu pahalı olabilir. Bu sadece en son 5 gönderiye ihtiyacınız olacaksa, bu bir kaynak israfıdır.

no_found_rowsİhtiyacınız olan 5 gönderiyi bulduktan sonra, kefaletinizi geri almak için kullanabileceğiniz boolean değerlerini kullanan belgelenmemiş bir parametre var . Bu, WP_Querysorgulanan gönderilerin miktarını aldıktan sonra ölçütlere uyan başka gönderiler aramaya zorlayacaktır. Zaten içine inşa edilir Bu parametre get_postsneden olduğu, get_postsbiraz daha hızlı daha WP_Queryrağmen get_postskullanımlarWP_Query

Sonuç

Sonuç olarak, bir sorguda sayfalandırma kullanmayacaksanız, 'no_found_rows=true'işleri hızlandırmak ve kaynak israfından tasarruf etmek her zaman sorgunuzda olacaktır.


3

@Pieter Goosen ile konunun yorumlarına değindikten sonra, soruyu cevaplayabildiğimi ve hatamı açıklayabileceğimi düşünüyorum.

Anahtar, found_postsbeni şaşırtmaktı. Ben bu sayı alınan mesajlar olduğunu, ancak olmadığını düşünüyorum. Kriterlere uyan mesaj sayısıdır . Sanki WP_Query, içerik getirirken için (tümü) bulmak için bir tane yayınlarının ve diğer zaman için kontroller: 2 parça vardı paginationparametreler. Bu nedenle $post_count, getirilen gönderi sayısı olan (Codex'in söylediği The number of posts being displayed), elbette ki bu posts_per_pageparametre üzerindeki sayıya ve $postsdizi özelliğindeki öğe sayısına eşittir .

Öyleyse WP_Querydüşündüğüm gibi işe yaramaz bir iş yapmıyor.

Umarım bu başkalarına yardımcı olur!


Cevabımı gör. Sanırım ne demek istediğini anlıyorum :-)
Pieter Goosen

Evet! Çok iyi yaptın: D Sonunda bunu yapma yolunu buldum ve hepsini anladım = D Thanks @PieterGoosen!
EliasNS

Bitti! Bu benim kendi cevap ^^ @PieterGoosen uzatıldı
EliasNS

1

Tamam, 'blog_posts' adlı yazı türüne sahip olmanıza izin verir ve bu yazı türünden 5 yazı almak istersiniz. İşte yapmanız gerekenler

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


$query = new WP_Query($args);

Yukarıdaki sorgu, eğer özel bir yazı tipi değilse, 'blog_posts' tipindeki 5 yazıyı döndürür, daha sonra 'post_type' => 'posts',tüm 'posts_per_page' => '-1',detayları almak ve ardından bunun gibi değiştirmek için sadece bu şekilde değiştirilir , WP Sorgu


Lütfen soru hakkındaki yorumları görün.
EliasNS

1

@ User1750063 kodundan bahsettiğini biliyorum ama şunu deneyin

$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

idorderbydeğer olarak geçersiz ve paginationgeçersiz bir parametredir
Pieter Goosen

paginationgeçerli bir parametre değil. Demek 'nopaging' => trueistiyorsun Eğer evet ise, TÜM mesajları alacağım. İstediğim bu değil. @ PieterGoosen Bence demek istiyor ID.
EliasNS

orderby, sırayı görüntülemek için değil mi? Giriş değerine / parametresine zarar vermez. @ PieterGoosen neden kimlik numarası ve sipariş geçersiz? Bu konuyu açıklayabilir misiniz?
Shreyo Gi

O olmalı ID, değilid
Pieter Goosen'ın
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.