Sepertinya setengah tutorial di Codex dan sekitar penggunaan blogosphere query_posts()
dan setengah digunakan WP_Query
. Apa masalahnya?
wp-query
query-posts
query
get-posts
Dan Gayle
sumber
sumber
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 memanfaatkanpre_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.sumber
query_posts()
adalah fungsi pembungkus kecil untukWP_Query
, satu-satunya hal tambahan yang dilakukannya (sesuai flowchart) adalah menimpa global$wp_query
query_posts()
dengan tidakWP_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 melaluipre_get_posts
filter. developer.wordpress.com/2012/05/14/…query_posts
- Anda seharusnya tidak pernah menggunakannyaquery_posts
. Terlepas dari apa yang dikatakan @Rarst, masalah yang sangat besarquery_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 hasilnyaget_posts
danWP_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, gunakanpre_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 olehget_posts
, tetapi meskipunget_posts()
menggunakanWP_Query
, ada beberapa perbedaanget_posts
lebih cepat dariWP_Query
. Margin tergantung pada jumlah posting total situs. Alasan untuk ini adalah,get_posts
lewat'no_found_rows' => true
secara defaultWP_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. Paginatingget_posts
benar-benar satu kekacauan besar.WP_Query
harus digunakan untuk semua permintaan paginasiget_posts()
tidak dipengaruhi olehposts_*
filter yangWP_Query
dipengaruhi oleh filter ini. Alasannya adalah bahwaget_posts
, secara default, beralih'suppress_filters' => true
keWP_Query
get_posts
memiliki beberapa parameter tambahan sepertiinclude
,exclude
,numberposts
dancategory
. Parameter ini dapat diubah menjadi parameter yang valid untukWP_Query
sebelum diteruskan keWP_Query
.include
diubah menjadipost__in
,exclude
kepost__not_in
,category
kecat
dannumberposts
keposts_per_page
. Sebagai catatan, semua parameter yang dapat dilewatiWP_Query
berfungsi dengan baikget_posts
, Anda dapat mengabaikan dan tidak menggunakan parameter defaultget_posts
get_posts
mengembalikan hanya$posts
propertiWP_Query
sementaraWP_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, tetapiforeach
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 defaultget_posts
beralih'ignore_sticky_posts' => 1
keWP_Query
, jadiget_posts
secara default mengabaikan posting yang lengketBerdasarkan hal di atas, apakah akan menggunakan
get_posts
atauWP_Query
terserah Anda dan apa yang sebenarnya Anda butuhkan dari permintaan. Di atas akan memandu Anda dalam pilihan Andasumber
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:Di sisi lain,
WP_Query
lebih merupakan alat tujuan umum, dan lebih seperti menulis pertanyaan MySQL secara langsungquery_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.sumber
Hanya tidak perlu digunakan
query_posts()
. Semua yang dilakukannya adalah instantiate objek WP_Query baru dan menugaskan kembali objek baru ituglobal wp_query
.Untuk referensi, berikut ini adalah
query_posts()
fungsi sebenarnya .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 menelitiWP_Query
kelas.sumber
Pastikan Anda menggunakan
wp_reset_query()
setelah menggunakanquery_posts()
karena akan mempengaruhi hasil kueri lainnya juga.sumber
Jika saya ingat pernah membaca dengan benar, pada dasarnya "loop" melakukan
WP_Query
di file inti, tetapi dengan cara yang lebih mudah dimengerti.sumber
sumber
Saya akan mengatakan jangan gunakan
get_posts()
dalam plugin. Memaksakan filter yang sangat ketat dalam beberapa kasus (set inisuppress_filters
,ignore_sticky_posts
, dll) dan harus mungkin hanya digunakan dalam tema ketika Anda ingin sesuatu dilakukan cepat.sumber