$ GLOBALS ['wp_the_query'] ile global $ wp_query karşılaştırması


16

Arasındaki fark nedir $GLOBALS['wp_the_query']ve global $wp_query?

Neden birini diğerine tercih ediyorsunuz?


2
global $wp_querySorunuzu bir satırda cevaplamayı söyleyebilirim !
Sumit

Fark ne?
Nathan Powell

Yanıtlar:


27

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_querykiş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_posts1.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_postssorguyu sıfırlamaz wp_reset_query(), bu query_postsda 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_postsbir query_postssorgunun 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_Querykendisi ).

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_postsve query_postsgerektiği asla kullanılamaz.

DAHİL OLMAK İÇİN

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_postsdoğru kullanmadığına $GLOBALS['wp_query']veya doğru kullanmadığına inanıyorsanız , kullanın veya$wp_query

ÖNEMLİ DÜZENLEME

Bu sitede birkaç yıl boyunca soruları cevaplarken, birçok kullanıcının $wp_queryyerel 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_postsyaptığımızla aynı


1
query_posts () değişir global $wp_query. ana sorguyaglobal $wp_the_query referans tutar
Evan Mattson

Yorumum bir düzeltme olarak tasarlanmadı, bu yüzden özür dilerim. Bahsettiğim yönteme $wp_the_queryilişkin en önemli yönlerinden biri olduğuna inandığımda sadece özetliyordum (TL; eğer yapacaksanız DR) WP_Query::is_main_query(): D
Evan Mattson

@EvanMattson Özür dilerim, ilk yorumunuzu yanlış anladım ;-). Evet, geçerli sorgu nesnesini kaydedilmiş ana sorgu nesnesine karşı kontrol eden 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
Pieter Goosen

Çok iyi cevap! @EvanMattson Bu bir düzenleme olmalıydı .
kaiser

is_main_query* ÖNEMLİ DÜZENLEME bölümüne işlevden bahsedebilir misiniz ? pre_get_postsBugün kullanıyordum ve baktığımdan beri bu işlevi kullanmanın tamamen yararlı olduğunu gördüm $wp_query.
Nathan Powell

2

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'];

2

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_querykarşı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 $variableve arasındaki fark hakkında genel bilgi sağlar$GLOBALS['variable']


Lütfen, asıl sorunun cevabı olmadığı için bir düzenleme dosyası gönderin. Sadece FYI , değişkeni de geçersiz kılmaya veya ayarlamaya $GLOBALS['foo']izin verir . Yani burada tarif ettiğinizden biraz daha fazla.
kaiser
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.