Apa perbedaan antara $GLOBALS['wp_the_query']
dan global $wp_query
?
Mengapa memilih satu di atas yang lain?
Apa perbedaan antara $GLOBALS['wp_the_query']
dan global $wp_query
?
Mengapa memilih satu di atas yang lain?
Jawaban:
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_posts
di versi 1.5.
function query_posts($query) {
$GLOBALS['wp_query'] = new WP_Query();
return $GLOBALS['wp_query']->query($query);
}
Seperti yang Anda lihat, query_posts
setel 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_posts
adalah 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_posts
kueri dengan wp_reset_query()
saat selesai, yang membuat query_posts
lebih jahat.
Karena kami tidak dapat melakukan apa-apa tentang itu, dan tidak dapat menghentikan penggunaan plugin dan tema query_posts
dan kami tidak pernah tahu jika query_posts
kueri 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_Query
dirinya 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_posts
harus tidak pernah digunakan.
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_posts
atau menggunakannya dengan benar, gunakan $GLOBALS['wp_query']
atau$wp_query
Menjadi menjawab pertanyaan di situs ini sekarang selama beberapa tahun, saya melihat banyak pengguna menggunakan $wp_query
sebagai 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_posts
sedang dilakukan
$wp_the_query
karena berkaitan dengan WP_Query::is_main_query()
metode, yang tidak disebutkan: D
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_posts
tindakan dan hanya ingin menargetkan permintaan utama ;-)
is_main_query
fungsi di bagian * EDIT PENTING? Saya menggunakan pre_get_posts
hari ini dan merasa sangat berguna untuk menggunakan fungsi itu sejak saya melihatnya $wp_query
.
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'];
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_query
di dalam lingkup lokal tanpa menggunakan kata global lagi. Jadi pada dasarnya global $wp_the_query
bisa 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 $variable
dan$GLOBALS['variable']
global $wp_query
hanya untuk menjawab pertanyaan Anda dalam satu baris!