$ GLOBALS ['wp_the_query'] vs global $ wp_query

16

Apa perbedaan antara $GLOBALS['wp_the_query']dan global $wp_query?

Mengapa memilih satu di atas yang lain?

Nathan Powell
sumber
2
Saya akan mengatakan global $wp_queryhanya untuk menjawab pertanyaan Anda dalam satu baris!
Sumit
Apa bedanya?
Nathan Powell

Jawaban:

27

Anda melewatkan satu $GLOBALS['wp_query'],. Untuk semua tujuan $GLOBALS['wp_query'] === $wp_query,. $GLOBALS['wp_query']Namun lebih baik untuk keterbacaan dan harus digunakan daripada $wp_query, TETAPI, yang tetap preferensi pribadi

Sekarang, di dunia yang sempurna tempat unicorn memerintah dunia $GLOBALS['wp_the_query'] === $GLOBALS['wp_query'] === $wp_query,. Secara default, ini harus benar. Jika kita melihat di mana global ini diatur ( wp-settings.php), Anda akan melihat objek permintaan utama disimpan $GLOBALS['wp_the_query']dan $GLOBALS['wp_query']hanya salinan duplikat dari$GLOBALS['wp_the_query']

/**
 * WordPress Query object
 * @global WP_Query $wp_the_query
 * @since 2.0.0
 */
$GLOBALS['wp_the_query'] = new WP_Query();
/**
 * Holds the reference to @see $wp_the_query
 * Use this global for WordPress queries
 * @global WP_Query $wp_query
 * @since 1.5.0
 */
$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];

Alasan untuk melakukannya dengan cara ini, adalah karena WordPress melihat kedatangan query_postsdi versi 1.5.

function query_posts($query) {
    $GLOBALS['wp_query'] = new WP_Query();
    return $GLOBALS['wp_query']->query($query);
}

Seperti yang Anda lihat, query_postssetel objek kueri utama ke run beign kueri kustom saat ini. Ini memecah integritas objek permintaan utama, yang memberi Anda data yang salah, sehingga segala sesuatu yang bergantung pada objek permintaan utama rusak karena data yang salah.

Cara untuk mengatasi ini adalah dengan membuat global lain untuk menyimpan objek permintaan utama, $GLOBALS['wp_the_query']yang diperkenalkan di versi 2.0.0. Global baru ini menampung objek permintaan utama dan $GLOBALS['wp_query']hanya salinan. Melalui wp_reset_query(), kita sekarang dapat mengatur ulang $GLOBALS['wp_query']kembali ke objek permintaan utama asli untuk mengembalikan integritasnya.

Tetapi ini bukan dunia yang sempurna, dan itu query_postsadalah iblis itu sendiri. Meski ribuan peringatan, orang tetap menggunakan query_posts. Selain memecah kueri utama, ia mengulangi kueri utama, membuatnya jauh lebih lambat sebagai kueri kustom biasa WP_Query. Banyak orang juga tidak menyetel ulang query_postskueri dengan wp_reset_query()saat selesai, yang membuat query_postslebih jahat.

Karena kami tidak dapat melakukan apa-apa tentang itu, dan tidak dapat menghentikan penggunaan plugin dan tema query_postsdan kami tidak pernah tahu jika query_postskueri diatur ulang wp_reset_query(), kami memerlukan salinan yang lebih dapat diandalkan dari objek permintaan utama yang kami tahu akan memberi kami 99,99999% andal, benar, benar data. Itu adalah di mana $GLOBALS['wp_the_query']berguna karena tidak ada kode WordPress terkait dapat mengubah nilai itu ( kecuali melalui filter dan tindakan dalam WP_Querydirinya sendiri ).

Bukti cepat, jalankan yang berikut ini

var_dump( $GLOBALS['wp_the_query'] );
var_dump( $GLOBALS['wp_query'] );

query_posts( 's=crap' );


var_dump( $GLOBALS['wp_the_query'] );
var_dump( $GLOBALS['wp_query'] );

dan periksa hasilnya. $GLOBALS['wp_the_query']tidak berubah, dan $GLOBALS['wp_query']telah. Jadi mana yang lebih bisa diandalkan?

Catatan akhir, $GLOBALS['wp_the_query']adalah TIDAK pengganti wp_reset_query(). wp_reset_query()harus selalu digunakan dengan query_posts, dan query_postsharus tidak pernah digunakan.

UNTUK MENYIMPULKAN

Jika Anda membutuhkan kode yang dapat diandalkan yang hampir selalu tidak pernah gagal, gunakan $GLOBALS['wp_the_query'], jika Anda percaya dan percaya plugin dan kode tema dan percaya tidak ada yang menggunakan query_postsatau menggunakannya dengan benar, gunakan $GLOBALS['wp_query']atau$wp_query

EDIT PENTING

Menjadi menjawab pertanyaan di situs ini sekarang selama beberapa tahun, saya melihat banyak pengguna menggunakan $wp_querysebagai variabel lokal, yang pada gilirannya juga memecah objek permintaan utama. Ini lebih lanjut meningkatkan kerentanan $wp_query.

Sebagai contoh, beberapa orang mengalami hal ini

$wp_query = new WP_Query( $args );

yang pada dasarnya sama persis dengan apa yang query_postssedang dilakukan

Pieter Goosen
sumber
1
query_posts () berubah global $wp_query. global $wp_the_querymemegang referensi ke permintaan utama
Evan Mattson
Komentar saya tidak dimaksudkan sebagai koreksi, jadi saya minta maaf jika benar. Saya hanya meringkas (TL; DR jika Anda mau) sambil menunjukkan apa yang saya percaya adalah salah satu aspek yang paling signifikan $wp_the_querykarena berkaitan dengan WP_Query::is_main_query()metode, yang tidak disebutkan: D
Evan Mattson
@EvanMattson Maaf, saya salah mengerti komentar pertama Anda ;-). Ya,, is_main_query()yang merupakan pembungkus WP_Query::is_main_query()yang memeriksa objek permintaan saat ini terhadap objek permintaan utama yang disimpan di $GLOBALS['wp_the_query']. Ini cukup penting ketika Anda menjalankan pre_get_poststindakan dan hanya ingin menargetkan permintaan utama ;-)
Pieter Goosen
Jawabannya cukup bagus! @EvanMattson Itu seharusnya sudah diedit .
kaiser
Bisakah Anda memasukkan penyebutan is_main_queryfungsi di bagian * EDIT PENTING? Saya menggunakan pre_get_postshari ini dan merasa sangat berguna untuk menggunakan fungsi itu sejak saya melihatnya $wp_query.
Nathan Powell
2

Pada dasarnya satu adalah salinan yang lain. Lihat wp-settings.php, baris 292-305:

$GLOBALS['wp_the_query'] = new WP_Query();

$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
denis.stoyanov
sumber
2

Kata kunci global mengimpor variabel ke dalam cakupan lokal, sementara $ GLOBALS hanya memberi Anda akses ke variabel tersebut.

Untuk menguraikan, jika Anda menggunakan, global $wp_the_query; Anda dapat menggunakan $wp_the_querydi dalam lingkup lokal tanpa menggunakan kata global lagi. Jadi pada dasarnya global $wp_the_querybisa dibandingkan dengan$wp_the_query = $GLOBALS['wp_the_query']

EDIT

Saya salah membaca wp_query untuk wp_the_query sehingga jawaban saya bukan jawaban yang lengkap untuk pertanyaan tersebut tetapi masih memberikan informasi umum tentang perbedaan antara global $variabledan$GLOBALS['variable']

Jeffrey von Grumbkow
sumber
Tolong, ajukan suntingan karena ini sebenarnya bukan jawaban untuk pertanyaan awal. Just FYI $GLOBALS['foo']memungkinkan overriding atau unsetting variabel juga. Jadi sedikit lebih dari apa yang Anda gambarkan di sini.
kaiser