Bagaimana cara membatasi jumlah posting yang didapat WP_Query?

25

Saya telah meneliti di Google dan WPSE dan satu-satunya hal yang saya lihat berulang kali adalah menggunakan showposts, itu sudah usang.

Saya kenal WP_Query, dan saya berpikir bahwa jika saya menetapkan posts_per_pagebatas saya (mis. 5), dan nopaginguntuk true, itu akan menjadi sesuatu seperti " Oke, saya hanya akan memberi Anda 5 posting ". Tetapi ini tidak berhasil.

masukkan deskripsi gambar di sini

Bagaimana saya bisa melakukan ini?

EliasNS
sumber
Just'posts_per_page=5'
Pieter Goosen
Saya menggunakan itu, tetapi yang menemukan semua posting. Jika saya akses ke found_postsproperti, ia mengatakan angka lebih tinggi dari 5. Saya ingin permintaan saya hanya menampung 5 posting. Apa itu mungkin? @PieterGoosen
EliasNS
Anda tidak boleh mengatur nopagingparameter, menetapkan itu ke true berarti untuk mendapatkan semua posting
Pieter Goosen
@PieterGoosen Jika saya tidak mengatur nopagingparameter, maka parameternya adalah default false, jadi frontpage menampilkan 5 posting, tetapi kueri lebih banyak. Saya menambahkan gambar ke pertanyaan.
EliasNS
Komentar Anda membingungkan, Anda diminta membatasi jumlah posting yang ditampilkan pada halaman ke 5, itulah yang Anda dapatkan. Sekarang, Anda mengatakan (baca kembali komentar Anda sebelumnya :-)) kueri lebih banyak. Tolong jelaskan. Anda tidak dapat mengatur posts_per_page dan kemudian menggunakan no_paging atur ke true dalam kueri yang sama, itu adalah posts_per_page ATAU nopaging disetel ke true
Pieter Goosen

Jawaban:

43

Saya pikir sekarang saya mengerti apa yang Anda coba lakukan. Ketika Anda menjalankan kueri khusus dengan WP_Querydan menetapkan batas untuk hanya mendapatkan 5 posting per halaman, hanya 5 posting yang akan diambil oleh kueri dan permintaan itu hanya akan menampung 5 posting, TAPI demi pagination, WP_Querymasih berjalan melalui seluruh database dan menghitung semua pos yang cocok dengan kriteria kueri.

Itu bisa dilihat saat Anda melihat $found_postsdan $max_num_pagesproperti kueri. Mari kita ambil contoh:

Anda memiliki 20 pos yang termasuk dalam jenis pos standar post. Anda hanya perlu 5 posting terbaru tanpa pagination. Kueri Anda terlihat seperti ini

$q = new WP_Query( 'posts_per_page=5' );
  • var_dump( $q->posts ) akan memberi Anda 5 posting terbaru seperti yang diharapkan
  • echo $q->found_posts akan memberimu 20
  • echo $q->max_num_pages akan memberimu 4

Dampak dari pekerjaan ekstra ini sangat kecil di situs dengan hanya beberapa posting, tetapi ini bisa mahal jika Anda menjalankan situs dengan ratusan atau ribuan posting. Ini adalah pemborosan sumber daya jika Anda hanya akan membutuhkan 5 posting terbaru

Ada parameter tidak berdokumen yang disebut no_found_rowsyang menggunakan nilai boolean yang dapat Anda gunakan untuk membuat jaminan permintaan Anda setelah ditemukan 5 posting yang Anda butuhkan. Ini akan memaksa WP_Queryuntuk tidak mencari lagi posting yang menghitung kriteria setelah telah mengambil jumlah posting yang ditanyakan. Parameter ini sudah dibangun ke dalam get_posts, itu sebabnya get_postssedikit lebih cepat daripada menggunakan WP_Querymeskipunget_postsWP_Query

Kesimpulan

Sebagai kesimpulan, jika Anda tidak akan menggunakan pagination pada sebuah query, selalu bijaksana untuk melakukan 'no_found_rows=true'query untuk mempercepat dan menghemat sumber daya yang terbuang.

Pieter Goosen
sumber
3

Setelah percakapan dengan @Pieter Goosen pada komentar pertanyaan, saya pikir saya bisa menjawab pertanyaan dan menjelaskan kesalahan saya.

Kuncinya adalah found_postsitu membingungkan saya. Saya pikir itu, nomor itu adalah pos yang diambil tetapi tidak. Ini adalah jumlah posting yang sesuai dengan kriteria . Ini seperti WP_Querymemiliki 2 bagian: satu untuk menemukan (semua) posting, dan lainnya untuk mengambil konten, ketika memeriksa paginationparameter. Jadi kita memiliki $post_countproperti yang merupakan jumlah posting yang diambil (kata Codex The number of posts being displayed), yang tentu saja sama dengan jumlah pada posts_per_pageparameter, dan jumlah item pada $postsproperti array.

Jadi WP_Querytidak melakukan pekerjaan yang tidak berguna, seperti yang saya pikirkan ^^

Semoga ini bisa membantu orang lain!

EliasNS
sumber
Lihat jawaban saya. Saya rasa saya mengerti apa yang Anda maksud :-)
Pieter Goosen
Iya nih! Anda melakukannya dengan sangat baik: D Akhirnya saya mendapatkan cara untuk melakukannya, dan saya mengerti semua = D Terima kasih @PieterGoosen!
EliasNS
Selesai! Itu memperpanjang jawaban saya sendiri ^^ @PieterGoosen
EliasNS
1

Ok, memungkinkan Anda memiliki jenis posting yang disebut 'blog_posts', dan Anda ingin mengambil 5 posting dari jenis posting itu. Inilah yang perlu Anda lakukan

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


$query = new WP_Query($args);

Kueri di atas akan menghasilkan 5 posting bertipe 'blog_posts', jika ini bukan tipe posting khusus, maka ganti saja seperti ini 'post_type' => 'posts',jika Anda ingin mengambil semua posting lalu ganti seperti ini 'posts_per_page' => '-1',, untuk lebih jelasnya WP Query

shuvroMithun
sumber
Silakan lihat komentar di pertanyaan.
EliasNS
1

Saya tahu bahwa @ user1750063 telah menyebutkan kode tetapi coba ini

$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
Shreyo Gi
sumber
idtidak valid sebagai orderbynilai dan paginationmerupakan parameter tidak valid
Pieter Goosen
paginationbukan parameter yang valid. Maksudmu 'nopaging' => true? Jika ya, maka saya akan mendapatkan SEMUA posting. Bukan itu yang saya inginkan. @PieterGoosen Saya pikir maksudnya ID.
EliasNS
Orderby untuk menampilkan pesanan, kan? Itu tidak merusak nilai / parameter nopaging. @PieterGoosen mengapa ID & orderby tidak valid? Bisakah Anda menjelaskan maksudnya?
Shreyo Gi
Seharusnya ID, tidakid
Pieter Goosen