WordPress Yönetici Arama: Sonuçları Genişletme

Yayınlanan: 2021-01-20

Bazen bir web sitesinde içerik bulmak zor olabilir. Bir WordPress Yöneticisi olarak, aradığınız içeriği bulmak ne kadar kolaysa o kadar iyidir. Neyse ki WordPress, kullanacağınız Yönetici ekranlarının çoğunda (örneğin Gönderiler ekranı) bir arama işlevi sağlar. Bu arama işlevi iyi olsa da, yine de birçok yönden sınırlıdır.

Örneğin, Gönderiler yönetici ekranında bir gönderi ararsanız, arama işlevi varsayılan olarak gönderi başlığında, gönderi alıntısında ve gönderi içeriğinde arama sorgusu metnini arar ve ardından bu sonuçları döndürür. Ancak, özel bir alanla ilgili anahtar kelimelerle arama yapmak isterseniz ne olur? Bu bilgi, sinir bozucu olabilecek yönetici gönderi listesi tablosu arama sonuçlarına dahil değildir.

Önceki bir makalede, gönderi türlerimize nasıl özel bir alan ekleneceğini öğrendik. Arama sonuçlarına da özel bir alanı nasıl ekleyebileceğimize bir göz atalım.

Yönetici Ekranında Arama Sorgusunu Genişletin Arama

Özel alanlar üzerinde çalıştığımız örneğimizde, Gönderilerimizden birinde 'kaynak' adlı özel bir alan oluşturduk ve bir URL değeri ekledik.

Gönderiler listesi tablosuna giderseniz ve arama çubuğunda bu 'kaynak' değerlerden birini kullanırsanız, WordPress varsayılan olarak arama yaparken özel alanlara bakmadığından herhangi bir sonuç alamazsınız.

Bunu değiştirmek için, WordPress'in arama özelliği için sağladığı orijinal kancayı genişletmemiz gerekecek. pre_get_posts gereken kanca, get_posts işlevinin içindeki 1779 satırı civarında wp-includes/class-wp-query.php dosyasında bulunan pre_get_posts'tur.

WordPress Sorgusu

Ön görünümde veya yönetici alanında bir sayfayı her ziyaret ettiğinizde, özellikleriyle birlikte isteğinize karşılık gelen WP_Query Nesnesini oluşturmak için bir kod komut dizisi zinciri yürütülür.

Her durumda WP_Query nesnesinde hangi değişikliklerin meydana geldiğini anlamak için sorgunun bazı özelliklerinin çıktısının geçici bir görünümünü oluşturalım.

Sorguyu yürütülmeden önce görüntülemek için, pre_get_posts eylem kancasına ekleyeceğiz. pre_get_posts filtresi, sorgu değişken nesnesi oluşturulduktan sonra, ancak gerçek sorgu çalıştırılmadan önce etkinleşir.

Aktif temanızın functions.php dosyasına şu kod parçasını ekleyin:

 add_action( 'pre_get_posts', 'print_query' ); function print_query( ) { print_r ( $GLOBALS['wp_query']->query ); echo "<hr>"; print_r ( $GLOBALS['wp_query']->query_vars ); echo "<hr>"; }

Şimdi, Mesajlar yönetici ekranını ziyaret ederseniz, query ve query_var s çıktıları en üstte yazdırılacaktır.

Kodu daha kolay görüntülemek için kopyalayıp ücretsiz bir çevrimiçi PHP güzelleştiriciye yapıştırabilirsiniz.

$GLOBALS['wp_query']->query dizisi (ilk çıkar) şöyle görünecektir:

 Array ( [order] => [orderby] => [post_type] => post [posts_per_page] => 20 [post_status] => [perm] => )

Örneğin, Mesajlar yönetici ekranında bir arama yapılması durumunda, arama dizesi dahil olmak üzere dizi çıktısı değişecektir. Örneğin 'wordpress.org' için arama yaparsak, şöyle görünecektir:

 Array ( [m] => 0 [cat] => 0 [s] => wordpress.org [paged] => 1 [order] => [orderby] => [post_type] => post [posts_per_page] => 20 [post_status] => [perm] => )

Kodu Birleştirin

Yukarıdaki bilgileri göz önünde bulundurarak, ihtiyacımız olan arama işlevini elde etmek için doğru kodu ekleyeceğiz. Bunu yapmak için, aktif temanızın functions.php geri dönün ve birkaç dakika önce önceki adımda eklediğiniz kodu silin. Ardından aşağıdaki kodu girin:

 add_action( 'pre_get_posts', 'extend_admin_search' ); function extend_admin_search( $query ) { $post_type = 'post'; $custom_fields = array("source",); if( ! is_admin() ) return; if ( $query->query['post_type'] != $post_type ) return; $search_term = $query->query_vars['s']; $query->query_vars['s'] = ''; if ( $search_term != '' ) { $meta_query = array( 'relation' => 'OR' ); foreach( $custom_fields as $custom_field ) { array_push( $meta_query, array( 'key' => $custom_field, 'value' => $search_term, 'compare' => 'LIKE' )); } $query->set( 'meta_query', $meta_query ); }; }

Sonraki adım, $post_type ve $custom_fields değişkenlerini gereksinimlerinize uygun değerlerle değiştirmektir. Bakalım kodda ne yapmışız.

  • $post_type = 'post'; – Burada aramak istediğimiz yazı tipini tanımlıyoruz.
  • $custom_fields = array("source",); – Burada aramak istediğimiz özel alan(lar)ı tanımlarız.

pre_get_posts kancasıyla çalıştığımız için, doğru sayfadayken kodumuzda özel arama uzantımızı uyguladığımızdan emin olmak önemlidir. Τ WordPress'e kodumuzu belirli koşullar altında görüntülemesini söylemek için bazı koşullu etiketler kullanıyoruz.

  • if ( ! is_admin() ) return; koşul, yönetici alanında değilsek, kodlarımızdan hiçbirinin yürütülmemesini sağlar.
  • if ( $query->query['post_type'] != $post_type ) $post_type değişkeninde tanımladığımız yazı tipi üzerinde çalışıp çalışmadığımızı kontrol eder. Bizim durumumuzda, post .
  • $search_term = $query->query_vars['s']; arama dizesini bir değişkende tuttuğumuz ve sonra onu tekrar boş olarak ayarladığımız yerdir $query->query_vars['s'] = ''; yoksa hiçbir şey bulamaz.

Şimdi, bu güncellemeler yapıldığında, son aramayı yenilerseniz doğru sonuçları alacaksınız. Bizim durumumuzda, sonuçlarda bir 'kaynak' özel alan girişi içeren 'Post 1' gönderisini görüyoruz: 'https://dev. wordpress.org /reference/functions/add_post_meta/'.

wordpress yönetici aramasını geliştirin

Ön Görünüm Aramasında Arama Sorgusunu Genişletin

Artık Yönetici aramamızı 'düzelttik', ön uç arama işlevimizi geliştirmeye geçebiliriz, böylece web sitesi kullanıcılarımız da özel alanlar arayabilirler.

Daha önce Yönetici aramasının özel alanlar için hiçbir sonuç vermemesi gibi, ön uç arama da özel alanlar için herhangi bir sonuç döndürmez.

İdeal olarak, kullanıcıların bu alanları arayabilmesini istiyoruz. Bu örnekte, gönderilerimizden birinde şu anda 'https://dev.wordpress.org/reference/functions/add_post_meta/' url'sini içeren özel bir 'kaynak' alanımız var. Bir kullanıcı 'wordpress.org' için arama yaparsa, bu gönderi sonuçlarda görünmelidir. Bunu nasıl yapacağımızı öğrenelim.

Gerekli Kod

Tekrar function.php dosyanıza gidin ve daha önce yapıştırdığınız kodu kopyalayın. Şimdi, bunu doğrudan bu kodun altına yapıştırın (böylece functions.php içinde bu kodun iki kopyasına sahip olursunuz) Şimdi, bu ikinci kod partisindeki işlevin adını extend_front_search . Şöyle görünmelidir:

 add_action( 'pre_get_posts', 'extend_admin_search' ); function extend_admin_search( $query ) { $post_type = 'post'; $custom_fields = array("source",); if( ! is_admin() ) return; if ( $query->query['post_type'] != $post_type ) return; $search_term = $query->query_vars['s']; $query->query_vars['s'] = ''; if ( $search_term != '' ) { $meta_query = array( 'relation' => 'OR' ); foreach( $custom_fields as $custom_field ) { array_push( $meta_query, array( 'key' => $custom_field, 'value' => $search_term, 'compare' => 'LIKE' )); } $query->set( 'meta_query', $meta_query ); }; }

Ardından, if ( $query->query['post_type'] != $post_type ) return; şart.

 add_action( 'pre_get_posts', 'extend_front_search' ); function extend_front_search( $query ) { $post_type = 'post'; $custom_fields = array("source",); if( is_admin() ) return; $search_term = $query->query_vars['s']; $query->query_vars['s'] = ''; if ( $search_term != '' ) { $meta_query = array( 'relation' => 'OR' ); foreach( $custom_fields as $custom_field ) { array_push( $meta_query, array( 'key' => $custom_field, 'value' => $search_term, 'compare' => 'LIKE' )); } $query->set( 'meta_query', $meta_query ); }; }

Sadece if( is_admin() ) return; kodun yalnızca ön uçta uygulanacağından emin olmak için ve gitmeye hazırız.

Alternatif Bir Strateji

WordPress aramasını özel alanları içerecek şekilde genişletmenin başka bir yolu da SQL sorgusunu değiştirmektir.

WP_Query sınıfı, wp-includes/class-wp-query.php dosyasının 2897. satırında açıklandığı gibi onu parçalara ayırarak size bu konuda yardımcı olur.

 $clauses = (array) apply_filters_ref_array( 'posts_clauses_request', array( compact( $pieces ), &$this ) ); $where = isset( $clauses['where'] ) ? $clauses['where'] : ''; $groupby = isset( $clauses['groupby'] ) ? $clauses['groupby'] : ''; $join = isset( $clauses['join'] ) ? $clauses['join'] : ''; $orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : ''; $distinct = isset( $clauses['distinct'] ) ? $clauses['distinct'] : ''; $fields = isset( $clauses['fields'] ) ? $clauses['fields'] : ''; $limits = isset( $clauses['limits'] ) ? $clauses['limits'] : '';

Daha önce özel alanlar makalelerinde bahsettiğimiz gibi, tüm özel alan verileri, varsayılan olarak WordPress aramasına dahil olmayan 'postmeta' tablosundaki veritabanında saklanır. İlk adımımız aşağıdaki kodu kullanarak bu iki tabloyu birleştirmek :

 function join_meta_table( $join ) { global $wpdb; if ( is_search() ) { $join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '..post_id '; } return $join; } add_filter('posts_join', 'join_meta_table' );

Sorgunun JOIN yan tümcesini filtrelediği için elbette posts_join kancasını kullandık.

Daha sonra, ihtiyaçlarımızı karşılamak için sorgunun WHERE parçasını değiştirmek için posts_where kancasını kullanacağız.

 function modify_where_clause( $where ) { global $pagenow, $wpdb; if ( is_search() ) { $where = preg_replace( "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/", "(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where ); } return $where; } add_filter( 'posts_where', 'modify_where_clause' );

Son olarak, yinelemeleri önlememiz gerekiyor. Bunu başarmak için, sorgunun DISTINCT yan tümcesini filtreleyen posts_distinct kancasını kullanırız.

 function prevent_duplicates( $where ) { global $wpdb; if ( is_search() ) { return "DISTINCT"; } return $where; } add_filter( 'posts_distinct', 'prevent_duplicates' );

Şimdi “wordpress.org” dizesini ararsak ön uçta ne olduğunu görelim.

ön uçta wordpress arama

Beklendiği gibi, sonuçlar bu sefer doğru. WordPress araması, "https://dev" değerine sahip "kaynak" alanını içerdiğinden "post 1" buldu. wordpress.org /reference/functions/add_post_meta/

WordPress Arama Sonuçlarında Özel Gönderi Türleri

Yapmak isteyebileceğiniz başka bir şey, Özel Gönderi Türlerini aranabilir hale getirmektir (özel bir gönderi türünü nasıl oluşturacağınızdan emin değilseniz, buradaki makalelerimize göz attığınızdan emin olun).

'Kitaplar' adında özel bir gönderi türü oluşturduğumuzu ve bu gönderi türünün arama sonuçlarında görünmesini istediğimizi düşünelim. Bu sefer SQL sorgusunu yeniden oluşturmamız gerekmiyor, ancak aşağıda gösterildiği gibi yalnızca pre_get_posts kancasındaki gönderi türlerini yeniden tanımlıyoruz. Kodun bir kez daha functions.php dosyasına yerleştirilmesi gerekir.

 function tg_include_custom_post_types_in_search_results( $query ) { if ( $query->is_main_query() && $query->is_search() && ! is_admin() ) { $query->set( 'post_type', array( 'post', 'books' ) ); } } add_action( 'pre_get_posts', 'tg_include_custom_post_types_in_search_results' );

Burada yaptığımız, post_type kancasına argüman olarak arama sonuçlarına dahil edilecek istenen yazı tiplerini eklemekti.

Bir türü hariç tutmak istiyorsanız, onu diziden kaldırmanız yeterlidir.

Çözüm

WordPress web sitenizdeki aramayı iyileştirmek gerçekten yardımcı olabilir ve büyük bir zaman tasarrufu sağlayabilir. Son kullanıcınız için hem özel gönderi türlerini hem de özel alanları arayabilmeleri de önemlidir. Umarım yukarıdaki talimat size bunu kendi web sitenizde nasıl başaracağınız konusunda bir fikir vermiştir.