Gelişmiş Gönderi Sorguları – WordPress WP_Query nesnesini anlama
Son zamanlarda, WordPress Meta Veri API'si kullanılarak depolanan değerlere dayalı olarak özel bir gönderi türünün bazı filtrelenmesini gerektiren bir projeyle görevlendirildim. Gönderiler (ve özel gönderi türleri) için ek veri depolamak için meta verileri kullanmanın ne kadar popüler olduğu nedeniyle, bu meta verilerde filtrelemenin nasıl çalışacağına dair bazı ayrıntıları paylaşmanın yararlı olacağını düşündüm.
Bu yazıda, çoğunlukla gönderilere atıfta bulunacağım, ancak teori özel gönderi türleri için de geçerli.
Meta verilere kısa bir giriş
Bir WordPress ortamında, meta veriler, ek tablolar kaydetmeye gerek kalmadan belirli bir WordPress nesnesindeki ek bilgileri depolamanın ve almanın bir yoludur. Bunun en basit örneği, bir WordPress gönderisine Özel Alanlar ekleme yeteneğidir.
Oluşturulduğunda, bu özel alanlar, (wp_ öğesinin varsayılan bir tablo öneki olduğu varsayılarak) wp_postmeta tablosunda depolanan meta veri sonrası tablosunda depolanır. WordPress eklenti geliştiricileri, çalışması için veritabanında herhangi bir değişiklik yapılmasını gerektirmediğinden, özel alan değerlerini depolamak için genellikle meta verileri kullanır.
WP_Query nesnesi: nedir ve onunla ne yapabilirsiniz?
Meta verilere göre filtreleme yapabilmek için önce WP_Query nesnesini karşılamanız gerekir.
WP_Query nesnesi, bir WordPress web sitesine yapılan varlık isteklerinin incelikleriyle ilgilenir. Aslında, WP_Query ile karşılaşabileceğiniz ve onunla etkileşime girebileceğiniz en yaygın yer, bir gönderi veya sayfa listesi görüntülerken The Loop içindedir.
WP_Query'nin yaptığı, ne tür bir sorguyla uğraştığını belirlemek ve istenen gönderileri getirmektir. İyi örnekler olarak bir kategori arşivi, tarihli arşiv, besleme veya arama düşünün.
Ayrıca, istek hakkında daha sonra örneğin sayfalandırma oluştururken çekilebilecek birçok bilgiyi de tutar.
WP_Query nesnesini kullanmak, belirli bir dizi argümana dayalı olarak özel filtrelenmiş bir gönderi koleksiyonu oluşturmanıza ve erişmenize olanak tanır. Bu nedenle, bu gönderileri ve bunlarla ilişkili verileri istediğiniz şekilde görüntülemenize olanak tanır.
WordPress içindeki tüm varsayılan varlık verileri gönderilere (sayfalar, ürünler, herhangi bir özel gönderi türü) dayandığından, WP_Query nesnesi muhtemelen bir WordPress web sitesinin tamamında en çok kullanılan sınıftır.
WP_Query'yi çalışırken göreceğiniz en yaygın sayfa blog sayfanızda olacaktır. Orada bir gönderi listesi alıyor, kaç tanesinin görüntüleneceğini sınırlıyor (genellikle 10 ile) ve toplam gönderi sayısını döndürüyor, böylece sayfalandırma işlevi hangi sayfalama bağlantılarının görüntüleneceğini belirleyebiliyor.
Bir sonraki WordPress projeniz için yardıma mı ihtiyacınız var? Jonathan Bossenger'ı işe alın ve hemen onunla çalışmaya başlayın!
Post/post_type sonuçlarınızı filtrelemek için Post Parameters ve WP_Query kullanma
Gönderilerinizi veya gönderi türlerinizi parametrelerine göre nasıl filtreleyebileceğinize dair bazı basit WP_Query örneklerine bakalım.
[code lang='php'] $args = dizi( 'posts_per_page' => 10 ); $the_query = new WP_Query( $args); [/kod]
Bu, yalnızca 'posts_per_page' bağımsız değişkenini içeren bir dizi bağımsız değişkeni ileten oldukça basit bir sorgudur. Bu sorgu tüm gönderileri almalı, ancak gönderi sayısını 10 ile sınırlandırmalıdır.
Şimdi bu sorgu için gerçek SQL sorgusunun nasıl görüneceğine bakalım.
[code lang='sql'] SQL_CALC_FOUND_ROWS wp_posts.ID'yi wp_posts'TAN SEÇİN 1=1 VE wp_posts.post_type = 'post' VE (wp_posts.post_status = 'yayınla' VEYA wp_posts.post_status = 'süresi dolmuş' = 'wpstatus'tan wp_posts.post_type = 'post' VEYA wp_posts. gelecek' YA DA wp_posts.post_status = 'taslak' YA DA wp_posts.post_status = 'beklemede' VEYA wp_posts.post_status = 'süresi doldu' VEYA wp_posts.post_status = 'özel') wp_posts.post_date TARİHİNE GÖRE SİPARİŞ TANIM [/LIMIT] 0,
Gerçek SQL sorgusunun daha büyük ayrıntıları biraz teknik olsa da, WP_Query'nin varsayılan olarak yaptığı her şeyi görmek oldukça güzel ( SQL_CALC_FOUND_ROWS kullanarak, post_status gibi şeyleri kontrol ederek, post_date ile sipariş vererek)
Öyleyse WP_Query argümanlarımızı biraz daha genişletelim.
[code lang='php'] $args = array( 'posts_per_page' => 10, 'orderby' => 'title', 'order' => 'ASC' ); [/kod]
Şimdi sorgu sonuçlarının başlık alanına göre ve artan sırada sıralanmasını bekleriz.
Tabii ki, SQL sorgusu güncellendi:
[code lang='sql'] SQL_CALC_FOUND_ROWS wp_posts.ID'yi wp_posts'TAN SEÇİN 1=1 VE wp_posts.post_type = 'post' VE (wp_posts.post_status = 'yayınla' VEYA wp_posts.post_status = 'süresi dolmuş' = 'wpstatus'tan wp_posts.post_type = 'post' VEYA wp_posts. gelecek' VEYA wp_posts.post_status = 'taslak' VEYA wp_posts.post_status = 'beklemede' VEYA wp_posts.post_status = 'süresi doldu' VEYA wp_posts.post_status = 'özel') wp_posts.post_title TARAFINDAN SİPARİŞ ASC SINIR 0, 10
Oldukça standart şeyler, ancak sadece birkaç sorgu argümanı uygulayarak WP_Query'nin gücünün nasıl olduğunu görmek ilginç.
WordPress Kodeksindeki WP_Query belgeleri, mevcut tüm farklı sorgu parametreleri türlerini içerir. Oldukça kapsamlı ve okunması çok faydalı bir belge.
Post/post_type sonuçlarınızı post meta anahtarına/değerlerine göre filtrelemek için Özel Alan Parametrelerini kullanma
Şimdiye kadar, wp_posts tablosundaki alanları temsil ettikleri için doğrudan gönderilere bağlı parametrelere odaklandım. Şimdi biraz daha derine bakmamız ve gönderileri meta verilere göre nasıl filtreleyeceğimizi anlamamız gerekiyor.
Basit bir örnekle başlayalım.
Ürün adında özel bir gönderi türünüz var (bir parça 'ürün' var) ve o ürün için tek bir kelime renk dizesini (örneğin beyaz, sarı, mavi) sakladığınız 'renk' adlı özel bir alanı var. Artık rengin mavi olduğu tüm Ürünleri almak istiyorsunuz.
Sorguyu WP_Query argümanlarınızın üzerine genişletmek şimdi şöyle görünür:
[code lang='php'] $args = array( 'post_type' => 'product', 'posts_per_page' => 10, 'orderby' => 'title', 'order' => 'ASC', 'meta_key' => 'renk', 'meta_değer' => 'mavi' ); [/kod]
Dikkat edilmesi gereken ilk şey, yalnızca Ürün gönderi türlerini filtrelememiz için bir 'post_type' argümanını nasıl eklediğimizdir. Eklediğimiz ikinci şey meta_key ve meta_value argümanlarıdır. Artık sorgunun yalnızca ürünlere göre filtrelenecek şekilde güncellendiğini ve meta verilerin depolandığı meta veri tablosuna bir birleştirme ve meta_key 'color' tarafından bir filtre eklenmesini beklerdim:
[code lang='sql'] SQL_CALC_FOUND_ROWS wp_posts.ID'NİN wp_posts INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) WHERE 1=1 AND ( ( wp_postmeta.meta_key = 'postcolorta'.'.wp_) SEÇ ) ) VE wp_posts.post_type = 'product' VE (wp_posts.post_status = 'yayınla' VEYA wp_posts.post_status = 'süresi doldu' VEYA wp_posts.post_status = 'gelecek' VEYA wp_posts.post_status = 'taslak'.VEYA wp_status' ' VEYA wp_posts.post_status = 'süresi doldu' VEYA wp_posts.post_status = 'özel') wp_posts.ID'YE GÖRE GRUP SİPARİŞ BY wp_posts.post_title ASC LIMIT 0, 10 [/code]
Elbette, işte orada.
Öyleyse biraz daha ileri gidelim. Ürünlerinizde 'available_from_date' ve 'available_to_date' meta anahtarlarının ayarlandığını varsayalım. Kullanıcıların bu tarihlerde 'mevcut' olan Ürünleri arayabilecekleri bir arama formu oluşturmak istediniz. Kullanıcı başlangıç ve tarih alanlarını seçecek ve siz bu alanlara göre gönderilerinizi filtrelemek isteyeceksiniz. Sorgu bağımsız değişkenlerinde meta_key ve meta_value alanlarınızı basitçe güncelleyemezsiniz, sorgunuzu daha da özelleştirmek için bir meta_query bağımsız değişken dizisi kullanmanız gerekir.
[code lang='php'] $args = array( 'post_type' => 'product', 'posts_per_page' => 10, 'orderby' => 'title', 'order' => 'ASC', 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'available_from_date', 'value' => array( $from_date, $to_date ), 'compare' => 'BETWEEN', 'type' => 'DATE', ), array( 'key' => 'available_to_date', 'value' => array( $from_date, $to_date ), 'compare' => 'BETWEEN', 'type' => 'DATE' , ), ) ); [/kod]
(Yukarıdaki örnekte $from_date ve $to_date değişkenlerinin kullanıcının form gönderiminden önceden ayrıştırılmış olması gerektiğine dikkat edin)
SQL düzeyinde neler olduğunu görelim.
[code lang='sql'] SQL_CALC_FOUND_ROWS wp_posts.ID'yi wp_posts'tan SEÇİN INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) INNER JOIN wp_postmeta mt1 ON ( wp_posts.posts.ID = 1 WHERE_id) wp_postmeta.meta_key = 'available_from_date' VE CAST(wp_postmeta.meta_value AS DATE) '2017-10-01' VE '2017-10-01' ARASINDA) VE ( mt1.meta_key = 'available_to_date' AND CAST(mt1.meta_value AS DATE) ) '2017-10-01' VE '2017-10-01' ARASINDA )) VE wp_posts.post_type = 'post' AND (wp_posts.post_status = 'yayınla' VEYA wp_posts.post_status = 'süresi dolmuş' VEYA wp_posts.post_status = ' gelecek' VEYA wp_posts.post_status = 'taslak' VEYA wp_posts.post_status = 'beklemede' VEYA wp_posts.post_status = 'süresi doldu' VEYA wp_posts.post_status = 'özel') GROUP BY wp_posts.ID ORDER.post BY wp_title A [/kod]
Almak için oldukça fazla ama kısacası, sorguya aşağıdakileri ekliyor:
- Tarih filtrelemenin gerçekleşmesine izin vermek için meta_key değerlerini tarih olarak yayınlamak (genellikle metin olarak saklanır)
- Mevcut_to_date anahtarının gönderilen iki tarih arasında olduğu gönderileri filtreleme
- Ayrıca kullanılabilir_to_date anahtarının gönderilen iki tarih arasında olduğu gönderileri filtreleme
Bu, sorgu argümanlarınıza fazladan bir iç içe argüman dizisi eklemek için oldukça ağır bir SQL sorgusu!
WP_Query'yi neden daha iyi tanımalısınız?
Çoğu zaman, bir WordPress web sitesi oluştururken, WP_Query nesnesini asla kullanmazsınız veya bu nesne hakkında endişelenmenize gerek kalmaz. Bir tema, bir alt tema (veya basit bir eklenti) oluşturuyorsanız, gönderilerinizi veya sayfalarınızı almak ve listelemek için WP_Query kullanmanız gerekebilir, ancak yalnızca gerçekten derin bir özelleştirmeye ihtiyacınız varsa. Çoğunlukla WP_Query nesnesi zaten kapsamdadır ve The Loop'u kullanmak için tek ihtiyacınız olan basit bir 'if ( have_posts() )' kontrolüdür.
Ancak, gönderileri veya sayfaları alıp listelemekten daha fazlasını yapması gereken daha spesifik bir şey (özel gönderi türleri veya alt tema kullanan daha gelişmiş bir eklenti) oluşturuyorsanız, bir noktada WP_Query nesnesini kullanmanız gerekecektir.
WP_Query nesnesinin nasıl kullanılacağını bilmek (veya sadece bilen birini işe almak), geliştirme süresinden saatler kazandıracak ve yalnızca ürününüzün kodunu iyileştirmekle kalmayacak, aynı zamanda WordPress standartlarını ve uygulamalarını doğrulamasını sağlayacaktır.
Bu ayrıca, ürününüz üzerinde çalışmaya devam etmek için ek WordPress geliştiricileri kiralamanız gerekirse, sorgularınızı anında alıp güncelleyebilecekleri anlamına gelir.
Yukarıda yayınladığım orijinal meta veri örneğine geri dönelim (tarih filtrelemeli). WP_Query kullanmadan bu sorguyu oluşturmanız ve sonuçlarını oluşturmanız gerekip gerekmediğini hayal edin.
küresel $wbdb; $query = “wp_posts'TAN SQL_CALC_FOUND_ROWS wp_posts.ID SEÇİN INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) INNER JOIN wp_postmeta mt1 ON ( wp_posts.ID = WHERE_post) (wp_posts.ID = WHERE_post) =. 'available_from_date' VE CAST(wp_postmeta.meta_value AS DATE) $from_date VE $to_date ARASINDA) VE ( mt1.meta_key = 'available_to_date' VE CAST(mt1.meta_value AS DATE) $from_date VE $to_post_post ) ARASINDA ) VE w_type_post ) 'post' VE (wp_posts.post_status = 'yayınla' VEYA wp_posts.post_status = 'süresi dolmuş' VEYA wp_posts.post_status = 'gelecek' VEYA wp_posts.post_status = 'taslak' VEYA wp_posts.post_status =post 'wp_stating' =s. süresi doldu' VEYA wp_posts.post_status = 'özel') wp_posts.ID'YE GÖRE GRUP SİPARİŞ wp_posts.post_title ASC LIMIT 0, 10” $results = $wpdb->get_results( $sorgu, OBJECT );
WP_Query kullanarak, tüm bu SQL'i yazmak (ve test etmek) yerine kodunuz aşağıdaki örneğe benzeyebilir:
[code lang='php'] $args = array( 'post_type' => 'product', 'posts_per_page' => 10, 'orderby' => 'title', 'order' => 'ASC', 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'available_from_date', 'value' => array( $from_date, $to_date ), 'compare' => 'BETWEEN', 'type' => 'DATE', ), array( 'key' => 'available_to_date', 'value' => array( $from_date, $to_date ), 'compare' => 'BETWEEN', 'type' => 'DATE' , ), ) ); $sonuçlar = WP_Query( $args); [/kod]
Aynı sonucu elde etmenin iki farklı yolu ve hangisini yapmayı tercih edeceğimi biliyorum.
Bir sonraki WordPress projeniz için yardıma mı ihtiyacınız var? Jonathan Bossenger'ı işe alın ve hemen onunla çalışmaya başlayın!
ev borcu WordPress sitesi