it-swarm-id.com

Kapan saja Anda menggunakan WP_Query vs query_posts () vs get_posts ()?

Sepertinya setengah tutorial di Codex dan sekitar penggunaan blogosphere query_posts() dan setengah gunakan WP_Query . Apa masalahnya?

412
Dan Gayle
  • query_posts() terlalu sederhana dan merupakan cara bermasalah untuk memodifikasi kueri utama suatu halaman dengan menggantinya dengan instance kueri yang baru. Itu tidak efisien (menjalankan kembali query SQL) dan akan langsung gagal dalam beberapa keadaan (terutama sering ketika berhadapan dengan posting pagination). Setiap kode WP modern harus menggunakan metode yang lebih andal, seperti memanfaatkan pre_get_posts hook, untuk tujuan ini. TL; DR jangan gunakan query_posts () ever .

  • get_posts() sangat mirip dalam penggunaan dan menerima argumen yang sama (dengan beberapa nuansa, seperti standar berbeda), tetapi mengembalikan array posting, tidak mengubah variabel global dan aman untuk digunakan di mana saja.

  • WP_Query adalah kelas yang memberi kekuatan pada 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.

  

658
Rarst

query_posts - Anda seharusnya tidak pernah menggunakan query_posts. Terlepas dari apa yang dikatakan @Rarst, masalah yang sangat besar dengan query_posts adalah, ia merusak objek kueri utama (disimpan dalam $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 buruk query_posts, pada template 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 adalah cara yang benar untuk membangun sekunder kueri (seperti tulisan terkait, bilah geser, konten unggulan dan konten di 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. (UPDATE:Untuk halaman depan statis dan halaman sebenarnya, lihat Menggunakan pre_get_posts pada halaman benar dan halaman depan statis *)

Pada dasarnya, WP_Query digunakan oleh permintaan 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. Alasannya adalah, get_posts meneruskan 'no_found_rows' => true secara default ke WP_Query yang melompati/secara hukum memecah pagination. Dengan 'no_found_rows' => true, WP_Query mendapatkan jumlah posting yang dipertanyakan, kemudian keluar, di mana secara default, pencarian lebih lanjut untuk semua posting yang cocok dengan kueri untuk menghitung pagination.

    Karena alasan ini, get_posts() harus digunakan hanya untuk permintaan non-halaman. Memotong get_posts benar-benar satu kekacauan besar. WP_Query harus digunakan untuk semua permintaan paginasi

  • get_posts() tidak dipengaruhi oleh filter posts_* di mana WP_Query dipengaruhi oleh filter ini. Alasannya adalah bahwa get_posts, secara default, meneruskan 'suppress_filters' => true ke WP_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 menjadi post__not_in, category menjadi cat dan numberposts menjadi posts_per_page. Hanya sebuah catatan, semua dari parameter yang dapat diteruskan ke WP_Query berfungsi dengan get_posts, Anda bisa abaikan dan tidak menggunakan parameter default get_posts

  • get_posts mengembalikan hanya properti $posts dari WP_Query sementara WP_Query mengembalikan objek yang 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 loop foreach 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 meneruskan 'ignore_sticky_posts' => 1 ke WP_Query, jadi get_posts secara default mengabaikan posting yang lengket

Berdasarkan hal di atas, apakah menggunakan get_posts atau WP_Query terserah Anda dan apa yang sebenarnya Anda butuhkan dari permintaan. Di atas akan memandu Anda dalam pilihan Anda

60
Pieter Goosen

Perbedaan mendasar adalah bahwa query_posts() benar-benar hanya untuk memodifikasi Loop saat ini. Setelah Anda selesai, Anda perlu mengatur ulang loop dan mengirimkannya dengan selamat. Metode ini juga sedikit lebih mudah dipahami, 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 langsung menulis permintaan MySQL daripada 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, seperti yang terjadi. Sungguh, itu akan sampai pada kasus spesifik Anda.

31
nickmjones

Sama sekali tidak perlu menggunakan query_posts(). Yang dilakukan adalah instantiate objek WP_Query baru dan menugaskan kembali objek baru itu ke global wp_query.

Untuk referensi, berikut ini adalah fungsi query_posts() aktual.

 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 ringan di sana-sini.

Dalam kedua kasus tersebut, saya sangat menyarankan untuk melakukan kebaikan bagi diri Anda sendiri dan pergi ke wp_includes/query.php dan membaca kelas WP_Query.

15
RebelPhoenix

Pastikan Anda menggunakan wp_reset_query() setelah menggunakan query_posts() karena akan mempengaruhi hasil kueri lainnya juga.

14

Jika saya ingat pernah membaca dengan benar, pada dasarnya "loop" melakukan WP_Query dalam file inti, tetapi dengan cara yang lebih mudah dimengerti.

10
tw2113
  • query_posts () : dapat digunakan dalam satu-satunya kasus jika Anda perlu mengubah kueri utama. Ini menetapkan banyak variabel global;
  • get_posts () : sangat mirip dalam mekanika dan menerima argumen yang sama, tetapi mengembalikan array posting
  • WP_Query : Anda dapat membuat dan bekerja dengan objek sendiri. Agak lebih rumit, lebih sedikit pembatasan, aman digunakan di mana saja.
6
dalveer