Kodeks'teki öğreticilerin yarısı ve blogosfer kullanımı query_posts()
ve yarı kullanımı gibi görünüyor WP_Query
. Anlaşma ne?
Kodeks'teki öğreticilerin yarısı ve blogosfer kullanımı query_posts()
ve yarı kullanımı gibi görünüyor WP_Query
. Anlaşma ne?
Yanıtlar:
query_posts()
aşırı basit ve bir sayfanın ana sorgusunu, sorgunun yeni örneği ile değiştirerek değiştirmenin sorunlu bir yoludur. Verimsizdir (SQL sorgularını yeniden çalıştırır) ve bazı durumlarda (özellikle de mesajların sayfalandırılmasıyla uğraşırken) tamamen başarısız olur. Herhangi bir modern WP kodu pre_get_posts
, bu amaç için kancanın kullanılması gibi daha güvenilir yöntemler kullanmalıdır . TL; DR hiç query_posts () kullanmaz .
get_posts()
kullanımda çok benzerdir ve aynı argümanları (farklı varsayılanlar gibi bazı nüanslarla) kabul eder, ancak bir mesaj dizisi döndürür, genel değişkenleri değiştirmez ve her yerde kullanmak güvenlidir.
WP_Query
Her iki sahnenin arkasına da güç veren sınıftır, ancak kendi örneğinizle de oluşturabilir ve çalışabilirsiniz. Biraz daha karmaşık, daha az kısıtlama, aynı zamanda her yerde kullanımı güvenli.
query_posts()
için minik sarıcı fonksiyonudur WP_Query
, küresel üzerine.Yapıyor o (akış şeması uyarınca) yaptığı tek ekstra şey$wp_query
query_posts()
ile WP_Query
performansında hiçbir fark yaratacağına çekirdek yükünün parçası olduğu için, orijinal sayfanın sorgu hala çalışır. Bu sorgular, şablon dosyanız hiç döngü olmasa bile çalışacaktır.
query_posts
gelmez değiştirmek hiç de ana döngü, bu değiştirir onu sonra zaten tükendi. Ana döngüyü değiştirmenin en iyi yolu bir pre_get_posts
filtreden geçer. developer.wordpress.com/2012/05/14/…
query_posts
- Hiç kullanmamalısın query_posts
. @Rarst'ın söylediğinin yanı sıra, asıl büyük sorun query_posts
, ana sorgu nesnesini (depolanmış $wp_query
) kırmasıdır . Birçok eklenti ve özel kod ana sorgu nesnesine dayanır, bu nedenle ana sorgu nesnesini kırmak, eklentilerin ve özel kodun işlevlerini kırdığınız anlamına gelir. Bu fonksiyonlardan sadece bir tanesi tüm önemli sayfalama fonksiyonudur, bu yüzden ana sorguyu kırarsanız, sayfalamayı kırın.
query_posts
Herhangi bir şablonda ne kadar kötü olduğunu kanıtlamak için aşağıdakileri yapın ve sonuçları karşılaştırın
var_dump( $wp_query );
query_posts( '&posts_per_page=-1' );
var_dump( $wp_query );
get_posts
ve ikincil sorguları ( ilgili yazılar, kaydırıcılar, öne çıkan içerik ve statik ön sayfalardaki içerik gibi)WP_Query
oluşturmanın doğru yoludur . Unutulmamalıdır ki, ana sayfa, ana sayfa veya tek sayfa veya herhangi bir tür arşiv sayfasını, sayfa işlevselliğini kıracağı için ana sorgu lehine kullanmamalısınız. Ana sorguyu değiştirmeniz gerekirse, bunu yapmak için kullanın ve özel bir sorgu kullanın. ( GÜNCELLEME: Statik ön sayfalar ve gerçek sayfalar için bkz . Gerçek sayfalarda ve statik ön sayfalarda pre_get_posts kullanma *)pre_get_posts
Özünde, WP_Query
ana sorgu tarafından kullanılır ve aynı zamanda tarafından da kullanılır get_posts
, ancak get_posts()
kullanımlarına rağmen WP_Query
, birkaç fark vardır
get_posts
daha hızlı WP_Query
. Marj, sitenin toplam yayın miktarına bağlıdır. Bunun nedeni, bir get_posts
geçer 'no_found_rows' => true
varsayılan olarak WP_Query
atlar hangi / yasal pagination kırar. İle 'no_found_rows' => true
, WP_Query
sorgulanan gönderilerin miktarını alır, sonra geri alır, burada varsayılan olarak sayfalandırma işlemini hesaplamak için sorguyla eşleşen tüm gönderileri arar.
Bu nedenle, get_posts()
yalnızca sayfalandırılmamış sorgular için kullanılmalıdır. Sayfalandırma get_posts
gerçekten büyük bir karmaşa. WP_Query
tüm sayfalandırılmış sorgular için kullanılmalıdır
get_posts()
etkilenmez posts_*
filtreler WP_Query
Bu filtreler etkilenir alır. Bunun nedeni ise get_posts
varsayılan olarak, geçer, 'suppress_filters' => true
hiçWP_Query
get_posts
gibi ekstra parametrelerin bir çift var include
, exclude
, numberposts
ve category
. Bu parametreler WP_Query
geçilmeden önce geçerli parametrelere dönüşür WP_Query
. include
dönüştü alır post__in
, exclude
içine post__not_in
, category
içine cat
ve numberposts
içine posts_per_page
. Sadece bir nota bütün geçirilebilir parametrelerin WP_Query
ile eserler get_posts
, sen yapabilirsiniz görmezden ve varsayılan parametrelerini kullanmayınget_posts
get_posts
Sadece döner $posts
malı WP_Query
süre WP_Query
tam nesne döndürür. Bu nesne, şartnamelere, sayfa numaralandırmasına ve döngü içinde kullanılabilecek diğer faydalı bilgiler söz konusu olduğunda oldukça kullanışlıdır.
get_posts
döngüyü kullanmaz, ancak foreach
mesajları görüntülemek için bir döngü kullanır. Ayrıca, varsayılan olarak hiçbir şablon etiketi yoktur. setup_postdata( $post )
şablon etiketlerini kullanılabilir hale getirmek için kullanılmalıdır. WP_Query
döngü kullanır ve şablon etiketleri varsayılan olarak bulunur.
get_posts
geçer 'ignore_sticky_posts' => 1
için WP_Query
böylece, get_posts
varsayılan yapışkan mesajları görmezden tarafından
Yukarıdakilere dayanarak, kullanılıp kullanılmayacağınız get_posts
ya WP_Query
da size kalmış ve sorgudan gerçekten neye ihtiyacınız var. Yukarıdakiler seçiminizde size rehberlik etmelidir
Temel fark, query_posts()
gerçekten sadece mevcut Döngüyü değiştirmek içindir. İşiniz bittiğinde, döngüyü sıfırlamak ve mutlu bir şekilde göndermek gerekir. Bu yöntemin anlaşılması biraz daha kolaydır, çünkü "sorgunuz" temel olarak işleve ilettiğiniz bir URL dizesidir:
query_posts('meta_key=color&meta_value=blue');
Öte yandan, WP_Query
genel amaçlı bir araçtan daha fazlasıdır ve doğrudan MySQL sorgularını yazmaktan çok yazmaya benzer query_posts()
. Ayrıca, herhangi bir yerde de kullanabilirsiniz (yalnızca Loop'ta değil) ve şu anda çalışan herhangi bir sorguyu engellemiyor.
Olduğu WP_Query
gibi daha sık kullanma eğilimindeyim . Gerçekten, kendi davanıza gelecek.
Kullanmaya gerek yok query_posts()
. Tek yaptığı yeni bir WP_Query nesnesini başlatır ve bu yeni nesneyi yeniden atar global wp_query
.
Başvuru için, aşağıdaki gerçek query_posts()
işlevdir.
function query_posts($query) {
$GLOBALS['wp_query'] = new WP_Query();
return $GLOBALS['wp_query']->query($query);
}
Derinlemesine bir özel sorgu betiği oluşturmak istiyorsanız kendi WP_Query nesnesini oluşturun. Ya get_posts()
da tek yapmanız gereken burada ve orada hafif bir manipülasyon yapmaksa kullanın.
Her iki durumda da, kendinize bir iyilik yapmayı wp_includes/query.php
ve WP_Query
sınıfa gidip dersi incelemenizi şiddetle tavsiye ederim .
Kullandıktan wp_reset_query()
sonra kullandığınızdan emin olun query_posts()
çünkü diğer sorgu sonuçlarını da etkileyecektir.