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


Yanıtlar:


667
  • 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_QueryHer 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.


8
@jjeaton 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
Rarst

7
Değiştirme @jjeaton query_posts()ile WP_Queryperformansı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.
Rarst

116
Bunun WPSE'deki en cömert ve lekeli yazı olduğu hissinden kurtulamam. Codex'te de olmalı.
kaiser

8
Sadece "query_posts ()" performansının en net açıklamasını ekleyeceğim: Bir şablon dosyasında query_posts () veya WP_Query kullanmak aynı performans maliyetine sahip olacaktır: az önce yaptığınız sorgu. Kodeksi makalesinde tartışılan sorun, sorguyu gerçekten değiştirmek istiyorsanız, orijinal query_posts () 'parse_query' filtresiyle filtrelemelisiniz. Bu şekilde beceriksizce değiştirmek için ikinci bir sorgu yapmak yerine, yalnızca bir, orijinal, istenen sorgunuz olur. query_posts () ASLA YOLDA DEĞİL !! ASLA!
jerclarke

22
Developer.wordpress.com blogunda John James Jacoby tarafından yazılan tüm bu cevapları sudan alan bir soru. Ana nokta: query_postsgelmez 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_postsfiltreden geçer. developer.wordpress.com/2012/05/14/…
Dan Gayle

65

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_postsHerhangi 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_postsve 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_Queryana 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_postsdaha hızlı WP_Query. Marj, sitenin toplam yayın miktarına bağlıdır. Bunun nedeni, bir get_postsgeçer 'no_found_rows' => truevarsayılan olarak WP_Queryatlar hangi / yasal pagination kırar. İle 'no_found_rows' => true, WP_Querysorgulanan 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_postsgerçekten büyük bir karmaşa. WP_Querytüm sayfalandırılmış sorgular için kullanılmalıdır

  • get_posts()etkilenmez posts_*filtreler WP_QueryBu filtreler etkilenir alır. Bunun nedeni ise get_postsvarsayılan olarak, geçer, 'suppress_filters' => truehiçWP_Query

  • get_postsgibi ekstra parametrelerin bir çift var include, exclude, numberpostsve category. Bu parametreler WP_Querygeçilmeden önce geçerli parametrelere dönüşür WP_Query. includedönüştü alır post__in, excludeiçine post__not_in, categoryiçine catve numberpostsiçine posts_per_page. Sadece bir nota bütün geçirilebilir parametrelerin WP_Queryile eserler get_posts, sen yapabilirsiniz görmezden ve varsayılan parametrelerini kullanmayınget_posts

  • get_postsSadece döner $postsmalı WP_Querysüre WP_Querytam 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_postsdöngüyü kullanmaz, ancak foreachmesajları 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_Querydöngü kullanır ve şablon etiketleri varsayılan olarak bulunur.

  • get_postsgeçer 'ignore_sticky_posts' => 1için WP_Queryböylece, get_postsvarsayılan yapışkan mesajları görmezden tarafından

Yukarıdakilere dayanarak, kullanılıp kullanılmayacağınız get_postsya WP_Queryda size kalmış ve sorgudan gerçekten neye ihtiyacınız var. Yukarıdakiler seçiminizde size rehberlik etmelidir


1
Keşke en sevdiğim cevapları yapabilseydim. Bu çok açıklar.
Patrik Alienus

1
Büyük Açıklama! "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şadır. WP_Query tüm sayfalandırılmış sorgular için kullanılmalıdır" Temel olarak tüm insanların imoyu bilmesi gerekir.
Bullyen

32

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_Querygenel 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_Querygibi daha sık kullanma eğilimindeyim . Gerçekten, kendi davanıza gelecek.


15

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.phpve WP_Querysınıfa gidip dersi incelemenizi şiddetle tavsiye ederim .


14

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


10

Doğru okumayı hatırlıyorsam, esasen "döngü" WP_Queryçekirdek dosyalarda, ancak anlaşılması daha kolay bir şekilde yapıyor.


6
  • query_posts () : Ana sorguyu değiştirmeniz gerekirse, yalnızca bir durumda 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

get_posts()Eklentide kullanmadığını söyleyebilirim . Bazı durumlarda çok kısıtlayıcı filtreleri ( 's ayarlamak getirir suppress_filters, ignore_sticky_postsvs.) ve bir şey hızlı yapılması istediğinizde muhtemelen sadece bir temada kullanılmalıdır.

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.