Arasındaki fark nedir $GLOBALS['wp_the_query']
ve global $wp_query
?
Neden birini diğerine tercih ediyorsunuz?
Arasındaki fark nedir $GLOBALS['wp_the_query']
ve global $wp_query
?
Neden birini diğerine tercih ediyorsunuz?
Yanıtlar:
Birini kaçırdın $GLOBALS['wp_query']
. Tüm amaçlar için $GLOBALS['wp_query'] === $wp_query
. $GLOBALS['wp_query']
ancak okunabilirlik açısından daha iyidir ve $wp_query
kişisel tercih olarak kalan AMA yerine kullanılmalıdır.
Şimdi, tek boynuzlu atların dünyayı yönettiği mükemmel bir dünyada $GLOBALS['wp_the_query'] === $GLOBALS['wp_query'] === $wp_query
. Varsayılan olarak, bu doğru olmalıdır. Bu globallerin nerede ayarlandığına bakarsak ( wp-settings.php
), ana sorgu nesnesinin saklandığını $GLOBALS['wp_the_query']
ve $GLOBALS['wp_query']
yalnızca$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'];
Bu şekilde yapmanın nedeni, WordPress'in query_posts
1.5 sürümünde gelişini görmesidir.
function query_posts($query) {
$GLOBALS['wp_query'] = new WP_Query();
return $GLOBALS['wp_query']->query($query);
}
Gördüğün gibi, query_posts
, ana sorgu nesnesini geçerli özel sorgu beign çalıştırmasına ayarlar. Bu, yanlış veri veren ana sorgu nesnesinin bütünlüğünü bozar, böylece ana sorgu nesnesine dayanan her şey yanlış veriler nedeniyle bozulur.
Buna karşı koymanın bir yolu, ana sorgu nesnesini saklamak için $GLOBALS['wp_the_query']
2.0.0 sürümünde tanıtılan başka bir genel oluşturmaktı . Bu yeni global ana sorgu nesnesini ve $GLOBALS['wp_query']
sadece bir kopyasını tutar. Sayesinde wp_reset_query()
, artık sıfırlamak olabilir $GLOBALS['wp_query']
bütünlüğünü geri orijinal ana sorgu nesnesine geri.
Ama bu mükemmel bir dünya değil ve query_posts
şeytanın kendisidir. Binlerce uyarı olmasına rağmen, insanlar hala kullanıyor query_posts
. Ana sorguyu kırmanın yanı sıra, ana sorguyu yeniden çalıştırır ve normal bir özel sorgu olarak çok daha yavaş hale getirir WP_Query
. Birçok kişi de yapıldığında query_posts
sorguyu sıfırlamaz wp_reset_query()
, bu query_posts
da daha da kötülük yapar .
Bu konuda hiçbir şey yapamadığımız ve eklentilerin ve temaların kullanılmasını durduramadığımız ve query_posts
bir query_posts
sorgunun sıfırlanıp sıfırlanmadığını asla bilemeyeceğimiz için wp_reset_query()
, bize% 99.99999 güvenilir, doğru vereceğimizi bildiğimiz ana sorgu nesnesinin daha güvenilir bir kopyasına ihtiyacımız var. veri. İşte bu noktada $GLOBALS['wp_the_query']
hiçbir WordPress ilgili kodu ( 's değerini değiştirebilir olarak yararlıdır iç filtre ve eylemleriyle hariç WP_Query
kendisi ).
Hızlı kanıt, aşağıdakileri çalıştırın
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'] );
ve sonuçları kontrol edin. $GLOBALS['wp_the_query']
değişmedi ve değişti $GLOBALS['wp_query']
. Peki hangisi daha güvenilir?
Son Not, $GLOBALS['wp_the_query']
olduğu DEĞİL yerini wp_reset_query()
. wp_reset_query()
should hep birlikte kullanılabilir query_posts
ve query_posts
gerektiği asla kullanılamaz.
Neredeyse her zaman asla başarısız olmayacak güvenilir bir koda ihtiyacınız varsa, kullanın $GLOBALS['wp_the_query']
, eklentilere ve tema koduna güvenir ve inanırsanız ve hiç kimsenin query_posts
doğru kullanmadığına $GLOBALS['wp_query']
veya doğru kullanmadığına inanıyorsanız , kullanın veya$wp_query
Bu sitede birkaç yıl boyunca soruları cevaplarken, birçok kullanıcının $wp_query
yerel bir değişken olarak kullandığını gördüm ve bu da ana sorgu nesnesini kırdı. Bu, güvenlik açığını daha da artırır $wp_query
.
Örneğin, bazı insanlar buna
$wp_query = new WP_Query( $args );
özünde ne query_posts
yaptığımızla aynı
$wp_the_query
ilişkin en önemli yönlerinden biri olduğuna inandığımda sadece özetliyordum (TL; eğer yapacaksanız DR) WP_Query::is_main_query()
: D
is_main_query()
bir sarıcıdır . Bu, eylemleri yürüttüğünüzde ve sadece ana sorguyu hedeflemek istediğinizde oldukça önemlidir ;-)WP_Query::is_main_query()
$GLOBALS['wp_the_query']
pre_get_posts
is_main_query
* ÖNEMLİ DÜZENLEME bölümüne işlevden bahsedebilir misiniz ? pre_get_posts
Bugün kullanıyordum ve baktığımdan beri bu işlevi kullanmanın tamamen yararlı olduğunu gördüm $wp_query
.
Temel olarak biri diğerinin kopyasıdır. Kontrol wp-settings.php
, 292-305 satırları:
$GLOBALS['wp_the_query'] = new WP_Query();
$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
Global anahtar kelime değişkeni yerel kapsama alırken, $ GLOBALS sadece değişkene erişmenizi sağlar.
Ayrıntılı olarak kullanmak için, global kelimesini tekrar global kelimesini global $wp_the_query;
kullanmadan kullanabilirsiniz $wp_the_query
. Yani temelde global $wp_the_query
karşılaştırılabilir$wp_the_query = $GLOBALS['wp_the_query']
DÜZENLE
Wp_the_query için wp_query yanlış okudum, bu yüzden cevabım soruya tam bir cevap değil ama yine de global $variable
ve arasındaki fark hakkında genel bilgi sağlar$GLOBALS['variable']
global $wp_query
Sorunuzu bir satırda cevaplamayı söyleyebilirim !