WordPress Özel Sorguları – WP_Query Sınıfını Kullanma

Yayınlanan: 2021-02-06

WordPress, çoğu durumda gerekli bilgileri veritabanından alabilen çok çeşitli kullanıma hazır işlevler sunar. Ancak bir WordPress web sitesi geliştirirken, istenen sonucu elde etmek için bir filtrenin veya eylemin yeterli olmadığı çok sayıda senaryo vardır. Bu durumlarda. WordPress, WP_Query sınıfı biçiminde bir geçici çözüm sunar.

WP_Query sınıfının nasıl kullanılabileceğine bir göz atalım!

Özel Sorgu Vakaları

NOT: Bu makale, biraz PHP bilgisine sahip olduğunuzu ve MySQL/MariaDB artı WordPress ile çalışmaya aşina olduğunuzu varsaymaktadır.

Hangi sayfayı ziyaret ederseniz edin, WordPress içeriği görüntülemek için 'ana sorgu' denilen şeyi çalıştırır. Örneğin, kategori görünümü gibi bir sayfayı ziyaret ettiğinizde, sahne arkasında bir WP_Query nesnesi oluşturulur ve sayfayı görüntülemek için veritabanından gerekli tüm verileri alır.

WP_Query temel olarak yaptığı şey, SQL sorguları kullanmak zorunda kalmadan web sitenizin veritabanından içerik alma yeteneği sunmaktır.

Bunu yapmak için tek yapmamız gereken ihtiyaçlarımıza karşılık gelen argümanları tanımlamak ve yeni bir WP_Query nesnesi oluşturulacak ve bir SQL sorgusuna çevrilecek.

WP_Query Kullanan Bir Örnek

Belirli bir kategorideki gönderileri başka bir kategori şablonu içinde görüntülemek istiyorsak, yeni bir sorgu nesnesi oluşturmanız gerekir.

Bu örneğin amaçları doğrultusunda, Twenty Twenty temasını etkinleştirdik ve 'Kategori 1' adlı bir kategori altında 2 gönderi ve 'Hizmetler' adlı bir kategori altında 2 gönderi oluşturduk.

Ayrıca, 'Kategori 1' gönderileri için özel bir kategori görünümü şablonu oluşturduk. Bu kategorinin sümüğü 'category-1'dir, bu nedenle temanın klasörünün altındaki dosya, bizim durumumuzda category-category-1.php olan category-CATEGORYSLUG.php olmalıdır.

Lütfen aşağıdakileri category-category-1.php dosyasına yapıştırın.

 <?php /*** Custom Category 1 Template */ get_header(); ?> <main role="main"> <section class="site-content"> <div role="main"> <?php if ( have_posts() ) : ?> <header class="archive-header"> <h3 class="archive-title">Category: <?php single_cat_title( '', true ); ?></h3> </header> <?php while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; endif; ?> </div> </section> </main> <?php get_sidebar(); ?> <?php get_footer(); ?>

Döngüden önce, döngüde daha fazla gönderi olup olmadığını belirlemek için have_posts yöntemini kullanırız.

the_post() , döngünün gönderileri yinelemesi ve WordPress'e gönderiler dizisinin bir sonraki gönderisine geçmesini söylemesi için gereklidir.

Bu noktada kategorinin ön uç görünümümüz ( https://mycompanyname.com/category/category-1/ ) şöyle olacaktır:

Bu kod parçasını kullanarak birçok gönderi bilgisi eklemeyi ihmal ettiğimizi biliyorum, ancak bu örnek uğruna, basit tutmak ve yalnızca gönderi başlıklarını görüntülemek daha iyidir.

WordPress'in bu görünüm için oluşturduğu sorgu nesnesi özelliklerini görmek için endif; Beyan.

 var_dump ( $wp_query->query_vars );

Şimdi sayfanızı yenilerseniz, bu bilgiyi gönderiler listesinin altında göreceksiniz:

 array(63) { ["category_name"]=> string(10) "category-1" ["error"]=> string(0) "" ["m"]=> string(0) "" ["p"]=> int(0) ["post_parent"]=> string(0) "" ["subpost"]=> string(0) "" ["subpost_id"]=> string(0) "" ["attachment"]=> string(0) "" ["attachment_id"]=> int(0) ["name"]=> string(0) "" ["pagename"]=> string(0) "" ["page_id"]=> int(0) ["second"]=> string(0) "" ["minute"]=> string(0) "" ["hour"]=> string(0) "" ["day"]=> int(0) ["monthnum"]=> int(0) ["year"]=> int(0) ["w"]=> int(0) ["tag"]=> string(0) "" ["cat"]=> int(16) ["tag_id"]=> string(0) "" ["author"]=> string(0) "" ["author_name"]=> string(0) "" ["feed"]=> string(0) "" ["tb"]=> string(0) "" ["paged"]=> int(0) ["meta_key"]=> string(0) "" ["meta_value"]=> string(0) "" ["preview"]=> string(0) "" ["s"]=> string(0) "" ["sentence"]=> string(0) "" ["title"]=> string(0) "" ["fields"]=> string(0) "" ["menu_order"]=> string(0) "" ["embed"]=> string(0) "" ["category__in"]=> array(0) { } ["category__not_in"]=> array(0) { } ["category__and"]=> array(0) { } ["post__in"]=> array(0) { } ["post__not_in"]=> array(0) { } ["post_name__in"]=> array(0) { } ["tag__in"]=> array(0) { } ["tag__not_in"]=> array(0) { } ["tag__and"]=> array(0) { } ["tag_slug__in"]=> array(0) { } ["tag_slug__and"]=> array(0) { } ["post_parent__in"]=> array(0) { } ["post_parent__not_in"]=> array(0) { } ["author__in"]=> array(0) { } ["author__not_in"]=> array(0) { } ["ignore_sticky_posts"]=> bool(false) ["suppress_filters"]=> bool(false) ["cache_results"]=> bool(true) ["update_post_term_cache"]=> bool(true) ["lazy_load_term_meta"]=> bool(true) ["update_post_meta_cache"]=> bool(true) ["post_type"]=> string(0) "" ["posts_per_page"]=> int(10) ["nopaging"]=> bool(false) ["comments_per_page"]=> string(2) "50" ["no_found_rows"]=> bool(false) ["order"]=> string(4) "DESC" }

Diyelim ki 'Hizmetler' kategorisine ait gönderilerin listesini yukarıda tasvir edilen gönderilerin altında görüntülemek istiyoruz. Sayfa halihazırda mevcut kategori için bir sorgu nesnesi oluşturduğundan, mevcut ana sorgu argümanlarını değiştirerek bu sorunu çözmemiz gerekecek.

WordPress'in bunu başarmamıza izin verdiği yollara bir göz atalım.

sorgu_posts İşlevi

query_posts() işlevi, WordPress'in gönderileri görüntülemek için kullandığı ana sorguyu değiştirmenin bir yoludur. Bunu, ana sorguyu bir tarafa koyarak ve yeni bir sorgu ile değiştirerek yapar. Bunu, tanıtıldığı wp-includes/query.php dosyasında kendiniz görebilirsiniz.

 function &query_posts($query) { unset($GLOBALS['wp_query']); $GLOBALS['wp_query'] =& new WP_Query(); return $GLOBALS['wp_query']->query($query); }

Son satırın altına aşağıdaki satırları ekleyerek 'Hizmetler' Gönderilerini görüntülemek için başka bir döngü eklemeye endwhile; mevcut standart döngünün

 query_posts( array ( 'category_name' => 'services' ) ); while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile;

Ve işte gidiyorsun:

Ancak bu yöntemin bir dezavantajı vardır. Sorgu nesnesinin içerdiği kategoriyi yazdırmaya çalışırsak, bunun değiştiğini fark ederiz.

var_dump ( $wp_query->query_vars["category_name"] ); eklemeyi deneyin. Hizmetler sorgusundan sonra sayfayı yenileyin. Bu sonucu görmelisiniz:

 string(8) "services"

Bu, sorgunun değiştirildiği ancak hiçbir zaman geri alınmadığı için oldu. Bu yaklaşım, sorgularımızı izleyen içerikle ilgili birçok soruna neden olabilir.

Bu çakışmaları önlemek ve query_posts çağrısından sonra temizlemek için wp_reset_query() çağırın, orijinal ana sorgu geri yüklenecektir. Yani kodunuz şöyle görünmelidir:

 query_posts( array ( 'category_name' => 'services' ) ); while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; wp_reset_query(); var_dump ( $wp_query->query_vars["category_name"] );

Sayfanızı yeniledikten sonra, şimdi ilk sayfa kategorisinin sorguya geri döndüğünü görüyorsunuz.

 string(10) "category-1"

Son olarak, asıl sorgunun tekrar çalışmasına neden olduğu için sorgunuza ek yük eklediğinden query_posts kaçınılması gerektiğini belirtmeliyiz.

get_posts() İşlevi

Aynı sonuç, verilen kriterlere uyan bir dizi gönderiyi almak için get_posts() işlevinin kullanılmasıyla da gerçekleştirilebilir.

Aşağıda gösterilen Hizmetler döngüsünü değiştirin…

 query_posts( array ( 'category_name' => 'services' ) ); while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; wp_reset_query(); var_dump ( $wp_query->query_vars["category_name"] );

…Bununla birlikte:

 $my_query = get_posts( array ( 'category' => 17 ) ); foreach($my_query as $post) : setup_postdata($post); the_title( '<h4 class="example"></h4>' ); endforeach; var_dump ( $wp_query->query_vars["category_name"] );

Gördüğünüz gibi bu sefer WordPress tarafından tanımlanan get_posts() argümanlarına göre kategori adı yerine kategori kimliği ile çalışmak zorunda kaldık.

Burada dikkat edilmesi gereken bir diğer önemli nokta ise sorguyu sıfırlamamış olmamıza rağmen sorgu kategorisinin var_dump çıktısının hala bozulmamış ve 'hizmetler' olarak değiştirilmemiş olmasıdır. Bunun nedeni, get_posts() tek başına ana sorguyu değiştirmemesidir. Sorgu nesnesini değiştirmeden yeni bir örneğini oluşturmak için yeni bir ' $my_query ' değişkeni kullandık.

get_posts() işlevi, query_posts( query_posts() ile aynı parametreleri kullanır ve güvenli ve kullanımı kolay olduğu için şablonunuzun herhangi bir yerine statik özel döngüler eklemek istediğinizde kullanılması önerilir.

Yeni bir WP_Query Nesnesi Oluşturun

$wp_query , WP_Query sınıfının bir nesnesidir ve geçerli sayfa için gerekli veritabanı içeriğini alır. Bu sınıfı geçersiz kılmak, sonuçları özelleştirme ve farklı içeriği görüntüleme yöntemimizdir.

Kullanacağımız kod parçası bu:

 $services_query = new WP_Query( 'category_name=services' ); if ( $services_query->have_posts() ) { while ( $services_query->have_posts() ) : $services_query->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; } wp_reset_postdata(); var_dump ( $wp_query->query_vars["category_name"] );

Gönderilerinin görüntülenmesini istediğimiz kategorinin bilgisini tanımlamak için 'category_name' argümanını kullandık.

Yeni nesneyi kaydettik new WP_Query( 'category_name=services' ); $services_query değişkeninde.

Ardından, içeriği görüntülemek için bir while döngüsü kullandık ve bundan sonra döngüyü wp_reset_postdata(); ile sıfırladık. ana sorgunun orijinal verilerine geri yüklemek için.

WP_Query WordPress Sınıfının diğer argümanlarını denemek isterseniz, tam listeyi WordPress Codex sayfasında bulabilirsiniz.