posts_per_page limitsiz


41

TÜM gönderileri ile birlikte iade etmek istiyorum query_posts. Çok posts_per_pageyüksek bir sayıya ayarlamaya çalıştım , ama query_postsçıldırdı ve hiçbir mesaj döndürmedi. Sınırsız yayın sorgulamak için doğru yol nedir?

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

6
Bir süredir Googling'im ve WP kodeksini araştırıyorum, ancak bu basit soruya doğrudan bir cevap bulamıyorum. Sorumun açıkça örnek kodla ifade edildiğine ve girişimin ne olduğuna (argüman için yüksek bir değer koyarak) inanıyorum. Ben bir WP uzmanı değilim, bu yüzden soruyu sormak için buraya geldim. Sizin için önemsiz görünen sorulara cevap vermek bile bu Stack Exchange topluluklarını büyütmede yardımcı olur. Şahsen, berbat bir forumun bağlantısının aksine, arama sonuçlarımda Yığın Taşması bağlantısını görmeyi seviyorum.
Banjer

Ayrıca, cevap için teşekkürler. Bir cevap değil bir yorum olarak göndermelisin, ben de kabul edebilirim.
Banjer

Amacın var ve soruyu yazmadaki gayretini takdir ediyorum . Ayrıca uzman olmayan soruların kendilerini bu toplulukta değerli bulduklarını kabul ediyorum. Öte yandan, bu tür soruların pek çoğu bazı uzmanların burada yer almalarını engelliyor. Her şey sanırım bir tür denge hakkında. Her neyse ben büyük bir seçmenim bu yüzden sonraki sorularınızı bekliyorum :) Burada WPSE'de iyi vakit geçirin.
Michal Mau

PS: Ayrıca değiştirmek istiyor typeiçin post_type(veya tamamen bu satırı kaldırmak). Hem Rutwick'in cevabını hem de birisinin bu küçük hatayı kopyalayıp yapıştırmasını önlemek için sorunuzu düzenleyeceğim.
Michal Mau

@ Maugly Düzeltme için teşekkürler adam ... sadece posts_per_page üzerinde duruldu bu yüzden yazım hatası kopyaladı! ;)
Rutwick Gangurde

Yanıtlar:


81

-1 cevabınız! posts_per_page Buraya bak .

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

Önemli uyarı : Bu, siteyi yıkayabilecek çok büyük bir sorguya neden olabilir. Bunu, veritabanınızın işleyebileceğinden eminseniz yapın. Genel temalarda veya eklentilerde değil.


6
Önemli uyarı: Bu, siteyi yıkayabilecek çok büyük bir sorguya neden olabilir. Bunu , veritabanınızın işleyebileceğinden eminseniz yapın. Genel temalarda veya eklentilerde değil.
fuxia

@toscho Yorumunuzu cevabın bir güncellemesi olarak eklemek.
Rutwick Gangurde

hayatımı kurtardın!!
Darlan Dieterich

@DarlanDieterich Yardım edebildiğime sevindim! :)
Rutwick Gangurde

23

Veya alternatif olarak , temelde aynı şeyi yapan argümanı WP_Query(hangisini query_postskullanırsa) geçebilirsiniz nopaging..

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

Tamamen aynısını yapacak, ama daha sonra tekrar bakmak zorunda kalırsan ve ne yaptığını hatırlayamazsan, şahsen senin için daha net olacağını, argümanların içindeki bu parametre ile ne planladığını düşündüm. dizi.

Ancak bahsettiğim gibi ikisi de aynı şeyi başaracak.

Birden fazla yaklaşıma sahip olmaktan zarar göremem, ve bildiğiniz şeyleri paylaşmak her zaman güzeldir, yeterli bir yanıt almanıza rağmen cevabımın sebebinin bu olduğunu söylemek yeterlidir.


3

Çocuğunuzdan temalar fonksiyonları dosyası:

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

Sorununuz için doğru cevaptır 'posts_per_page' => -1çünkü -1diğerleri kullanıcıların cevap olarak sayfa başına sınırsız mesajları dönecektir.

Sadece bu Q / A’ya bir eklenti eklemek istiyorum.

Sayfa başına düşen yazı sayısını, WordPress Yönetim Paneli'ndeki okuma ayarından almak istiyorsanız, get_option()işlevi çağırmanız ve posts_per_pagebir dize olarak geçirmeniz gerekir.

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

Umarım bu cevap bana yardım ettiği gibi birine yardım eder. Mutlu Kodlama Stackexchange Kullanıcıları


Bu aslında güzel bir ek!
Herbert Van-Vliet,

1

Veya..

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
Kodunuzu açıklamak için bağlam eklemelisiniz, soruyu çözme fikriniz.
bueltge,

1

Ricardo'nun bazı değişikliklerle kullanılması:

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;

Bu, yalnızca Kimlik satırına karşı sorgulama yaparak ve terim ve meta önbelleğini güncelleme işleminden kaçınarak sorgu süresini önemli ölçüde artıracaktır.


Güzel! paylaşım için teşekkürler.
Ricardo Canelas
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.