it-swarm.asia

Ne zaman WP_Query vs query_posts () vs get_posts () kullanmalısınız?

Codex içindeki blogların yarısı gibi görünüyor ve blogosfer kullanımı query_posts() ve yarı kullanımı WP_Query . Anlaşma ne?

412
Dan Gayle
  • query_posts() / aşırı basit ve 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 mesajların sayfalandırılmasıyla uğraşırken bile) tamamen başarısız olur. Herhangi bir modern WP kodu, bu amaç için pre_get_posts hook kullanımı gibi daha güvenilir yöntemler kullanmalıdır. TL; DR Hiç query_posts () kullanmayın .

  • get_posts() / kullanımda çok benzerdir ve aynı argümanları kabul eder (farklı varsayılanlar gibi bazı nüanslar ile) 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 bir 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.

  

658
Rarst

query_posts - Asla query_posts kullanmamalısınız. @Rarst'ın söylediklerinin dışında, query_posts ile ilgili gerçekten büyük sorun, ana sorgu nesnesini ($wp_query içinde depolanan) 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 dosyasının ne kadar kötü olduğunu ispatlamak için herhangi bir şablonda 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 WP_Query ikincil sorguları oluşturmanın doğru yoludur (ilgili yazılar, kaydırıcılar, özellikli içerik gibi) ve statik ön sayfalardaki içerik ) ile. Unutulmamalıdır ki, ana sayfa, 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 pre_get_posts kullanın ve özel bir sorgu kullanın. (UPDATE:Statik ön sayfalar ve gerçek sayfalar için bkz. Gerçek sayfalarda ve statik ön sayfalarda pre_get_posts kullanma *)

Temelde, WP_Query ana sorgu tarafından kullanılır ve ayrıca get_posts tarafından da kullanılır, ancak get_posts()WP_Query kullanmasına rağmen, birkaç fark vardır.

  • get_posts, WP_Query öğesinden daha hızlıdır. Marj, sitenin toplam yayın miktarına bağlıdır. Bunun nedeni, get_posts varsayılan olarak 'no_found_rows' => true'yu geçer; bu, sayfalamayı atlayan/yasal olarak kesen WP_Query öğesine geçirir. 'no_found_rows' => true ile, WP_Query sorgulanan gönderilerin miktarını alır, ardından varsayılan olarak sayfa numaralandırmayı 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. Paginating get_posts gerçekten büyük bir karışıklık. Tüm sayfalandırılmış sorgular için WP_Query kullanılmalıdır

  • get_posts(), posts_*'nun bu filtrelerden etkilendiği WP_Query filtrelerinden etkilenmez. Bunun nedeni, get_posts öğesinin varsayılan olarak 'suppress_filters' => true öğesini WP_Query değerine geçirmesidir.

  • get_posts, include, exclude, numberposts ve category gibi birkaç ekstra parametreye sahiptir. Bu parametreler, WP_Query 'a iletilmeden önce WP_Query için geçerli parametrelere dönüşür. includepost__in, exclude, post__not_in, category, cat ve numberposts, posts_per_page içine dönüştürülür. Sadece bir not, hepsi WP_Query 'a iletilebilecek parametrelerin get_posts ile birlikte çalıştığını belirtirseniz, can yoksay ve varsayılan get_posts parametrelerini kullanmazsınız.

  • get_posts, $posts öğesinin sadece WP_Query özelliğini döndürür, WP_Query ise tüm nesneyi döndürür. Bu nesne, şartnamelere, sayfalama ve döngünün içinde kullanılabilecek diğer yararlı bilgiler söz konusu olduğunda oldukça kullanışlıdır.

  • get_posts, döngüyü kullanmaz, ancak yayınları görüntülemek için bir foreach döngüsü kullanır. Ayrıca, varsayılan olarak hiçbir şablon etiketi yoktur. Şablon etiketlerini kullanılabilir hale getirmek için setup_postdata( $post ) kullanılmalıdır. WP_Query döngü kullanır ve şablon etiketleri varsayılan olarak kullanılabilir

  • get_posts'ignore_sticky_posts' => 1WP_Query 'a geçer, bu nedenle get_posts varsayılan olarak yapışkan mesajları yok sayar.

Yukarıdakilere göre, get_posts veya WP_Query kullanıp kullanmamanız size bağlıdır ve sorgudan gerçekten neye ihtiyacınız vardır. Yukarıdakiler seçiminizde size rehberlik etmelidir

60
Pieter Goosen

Temel fark şudur: 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 fazladır ve query_posts() öğesinden çok doğrudan MySQL sorguları yazmak gibidir. Ayrıca, herhangi bir yerde de kullanabilirsiniz (yalnızca Döngüde değil) ve şu anda çalışan hiçbir gönderi sorgusuyla karışmaz.

Olduğu gibi, WP_Query 'u daha sık kullanma eğilimindeyim. Gerçekten, kendi davanıza gelecek.

31
nickmjones

query_posts() işlevini kullanmaya gerek yoktur. Tek yaptığı, yeni bir WP_Query nesnesini başlatır ve bu yeni nesneyi global wp_query 'a yeniden atar.

Başvuru için aşağıdaki gerçek query_posts() işlevidir.

 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 da, yapmanız gereken tek şey burada ve orada hafif bir manipülasyon yapmaksa get_posts() işlevini kullanın.

Her iki durumda da, kendinize bir iyilik yapmanızı ve wp_includes/query.php 'ya gitmeyi ve WP_Query sınıfını incelemenizi tavsiye ederim.

15
RebelPhoenix

wp_reset_query() işlevini kullandıktan sonra query_posts() öğesini kullandığınızdan emin olun çünkü diğer sorgu sonuçlarını da etkileyecektir.

14

Doğru okumayı hatırlıyorsam, esasen "loop" çekirdek dosyalarda WP_Query yapıyor, ama anlaşılması daha kolay.

10
tw2113
  • query_posts () : bir ve sadece ana sorguyu değiştirmeniz gerektiğinde kullanılabilir. Birçok küresel değişken ayarlar;
  • get_posts () : mekanikte çok benzer ve aynı argümanları kabul eder, ancak yazı dizisini döndürür
  • WP_Query : kendi nesnesini yaratıp çalıştırabilirsin. Biraz daha karmaşık, daha az kısıtlama, her yerde kullanmak güvenlidir.
6
dalveer