Sepertinya setengah tutorial di Codex dan sekitar penggunaan blogosphere query_posts()
dan setengah digunakan WP_Query
. Apa masalahnya?
Sepertinya setengah tutorial di Codex dan sekitar penggunaan blogosphere query_posts()
dan setengah digunakan WP_Query
. Apa masalahnya?
Jawaban:
query_posts()
terlalu sederhana dan cara bermasalah untuk memodifikasi kueri utama halaman dengan menggantinya dengan instance baru dari kueri. Itu tidak efisien (menjalankan kembali query SQL) dan akan langsung gagal dalam beberapa keadaan (terutama sering ketika berhadapan dengan posting pagination). Kode WP modern apa pun harus menggunakan metode yang lebih andal, seperti memanfaatkan pre_get_posts
hook, untuk tujuan ini. TL; DR tidak pernah menggunakan query_posts () .
get_posts()
sangat mirip dalam penggunaan dan menerima argumen yang sama (dengan beberapa nuansa, seperti standar yang berbeda), tetapi mengembalikan berbagai posting, tidak mengubah variabel global dan aman untuk digunakan di mana saja.
WP_Query
adalah kelas yang memberdayakan keduanya di belakang layar, tetapi Anda juga dapat membuat dan bekerja dengan instance Anda sendiri. Sedikit lebih rumit, batasan lebih sedikit, juga aman digunakan di mana saja.
query_posts()
adalah fungsi pembungkus kecil untuk WP_Query
, satu-satunya hal tambahan yang dilakukannya (sesuai flowchart) adalah menimpa global$wp_query
query_posts()
dengan tidak WP_Query
akan membuat perbedaan dalam kinerja, permintaan halaman asli masih akan berjalan karena itu adalah bagian dari beban inti. Kueri itu akan berjalan bahkan jika file template Anda tidak memiliki loop sama sekali.
query_posts
tidak memodifikasi loop utama sama sekali, itu menggantikan itu setelah itu sudah berjalan. Cara terbaik untuk memodifikasi loop utama adalah melalui pre_get_posts
filter. developer.wordpress.com/2012/05/14/…
query_posts
- Anda seharusnya tidak pernah menggunakannya query_posts
. Terlepas dari apa yang dikatakan @Rarst, masalah yang sangat besar query_posts
adalah, ia merusak objek permintaan utama (disimpan di $wp_query
). Banyak plugin dan kode khusus bergantung pada objek kueri utama, jadi dengan melanggar objek kueri utama berarti Anda melanggar fungsi plugins dan kode kustom. Hanya satu fungsi seperti itu yang merupakan fungsi pagination yang penting, jadi jika Anda memecah kueri utama, Anda memutuskan pagination.
Untuk membuktikan seberapa buruknya query_posts
, pada templat apa pun, lakukan yang berikut dan bandingkan hasilnya
var_dump( $wp_query );
query_posts( '&posts_per_page=-1' );
var_dump( $wp_query );
get_posts
dan WP_Query
merupakan cara yang benar untuk membuat kueri sekunder ( seperti pos terkait, bilah geser, konten unggulan, dan konten pada halaman depan statis ) dengan. Perlu dicatat, Anda tidak boleh menggunakan salah satu dari dua yang mendukung permintaan utama di halaman rumah, halaman tunggal atau jenis halaman arsip apa pun karena akan merusak fungsionalitas halaman. Jika Anda perlu memodifikasi permintaan utama, gunakan pre_get_posts
untuk melakukannya, dan bukan permintaan khusus. ( PEMBARUAN: Untuk halaman depan statis dan halaman sebenarnya, lihat Menggunakan pre_get_post pada halaman benar dan halaman depan statis *)
Intinya, WP_Query
digunakan oleh kueri utama dan juga digunakan oleh get_posts
, tetapi meskipun get_posts()
menggunakan WP_Query
, ada beberapa perbedaan
get_posts
lebih cepat dari WP_Query
. Margin tergantung pada jumlah posting total situs. Alasan untuk ini adalah, get_posts
lewat 'no_found_rows' => true
secara default WP_Query
yang melompati / mematahkan pagination secara legal. Dengan 'no_found_rows' => true
, WP_Query
dapatkan jumlah posting yang ditanyakan, kemudian ditebus, di mana secara default, pencarian lebih lanjut untuk semua posting yang cocok dengan kueri untuk menghitung pagination.
Untuk alasan ini, get_posts()
harus digunakan hanya untuk permintaan non paginasi. Paginating get_posts
benar-benar satu kekacauan besar. WP_Query
harus digunakan untuk semua permintaan paginasi
get_posts()
tidak dipengaruhi oleh posts_*
filter yang WP_Query
dipengaruhi oleh filter ini. Alasannya adalah bahwa get_posts
, secara default, beralih 'suppress_filters' => true
keWP_Query
get_posts
memiliki beberapa parameter tambahan seperti include
, exclude
, numberposts
dan category
. Parameter ini dapat diubah menjadi parameter yang valid untuk WP_Query
sebelum diteruskan ke WP_Query
. include
diubah menjadi post__in
, exclude
ke post__not_in
, category
ke cat
dan numberposts
ke posts_per_page
. Sebagai catatan, semua parameter yang dapat dilewati WP_Query
berfungsi dengan baik get_posts
, Anda dapat mengabaikan dan tidak menggunakan parameter defaultget_posts
get_posts
mengembalikan hanya $posts
properti WP_Query
sementara WP_Query
mengembalikan objek lengkap. Objek ini cukup berguna ketika datang ke conditional, pagination dan info berguna lainnya yang dapat digunakan di dalam loop.
get_posts
tidak menggunakan loop, tetapi foreach
loop untuk menampilkan posting. Juga, tidak ada tag templat yang tersedia secara default. setup_postdata( $post )
harus digunakan untuk membuat tag templat tersedia. WP_Query
menggunakan loop dan tag templat tersedia secara default
get_posts
beralih 'ignore_sticky_posts' => 1
ke WP_Query
, jadi get_posts
secara default mengabaikan posting yang lengket
Berdasarkan hal di atas, apakah akan menggunakan get_posts
atau WP_Query
terserah Anda dan apa yang sebenarnya Anda butuhkan dari permintaan. Di atas akan memandu Anda dalam pilihan Anda
Perbedaan mendasarnya adalah query_posts()
hanya benar-benar untuk memodifikasi Loop saat ini. Setelah Anda selesai, Anda perlu mengatur ulang loop dan mengirimkannya dengan selamat. Metode ini juga sedikit lebih mudah dimengerti, hanya karena "kueri" Anda pada dasarnya adalah string URL yang Anda berikan ke fungsi, seperti:
query_posts('meta_key=color&meta_value=blue');
Di sisi lain, WP_Query
lebih merupakan alat tujuan umum, dan lebih seperti menulis pertanyaan MySQL secara langsung query_posts()
. Anda juga dapat menggunakannya di mana saja (tidak hanya di Loop) dan tidak mengganggu kueri pos yang sedang berjalan.
Saya cenderung menggunakan WP_Query
lebih sering, karena itu terjadi. Sungguh, ini akan sampai pada kasus spesifik Anda.
Hanya tidak perlu digunakan query_posts()
. Semua yang dilakukannya adalah instantiate objek WP_Query baru dan menugaskan kembali objek baru itu global wp_query
.
Untuk referensi, berikut ini adalah query_posts()
fungsi sebenarnya .
function query_posts($query) {
$GLOBALS['wp_query'] = new WP_Query();
return $GLOBALS['wp_query']->query($query);
}
Instantiate objek WP_Query Anda sendiri jika Anda ingin membuat skrip kueri khusus yang mendalam. Atau gunakan get_posts()
jika yang perlu Anda lakukan hanyalah manipulasi cahaya di sana-sini.
Dalam kedua kasus itu, saya sangat menyarankan untuk melakukan kebaikan bagi diri Anda sendiri dan pergi ke wp_includes/query.php
dan meneliti WP_Query
kelas.
Pastikan Anda menggunakan wp_reset_query()
setelah menggunakan query_posts()
karena akan mempengaruhi hasil kueri lainnya juga.