Özel taksonomi terimini aramaya dahil et


33

İki özel yazı tipine uygulanan iki özel taksonom var. Kenar çubuğundaki terimler listesi gayet iyi ve onunla ilişkili tüm gönderileri listeler. Bununla birlikte, belirli terimlerden birini ararsanız, bu terimle bir yazı açmaz.

Örnek: http://dev.andrewnorcross.com/das/all-case-studies/ "PQRI" terimini arayın

Hiçbir şey alamadım. Herhangi bir fikir? Çeşitli arama eklentileri kullanmayı denedim, ancak bunlar özel arama parametrelerimi bozuyor veya çalışmıyor.


Nocross, Jan'ın önerdiği cevaba biraz geri bildirim ekleyebilir misin? Muhtemelen işi yapan bir eklenti mi arıyorsunuz?
hakre

Planı bırakıp bitirdim. 3 ayrı arama fonksiyonu yarattığım için (belirli bölgelerdeki farklı ihtiyaçlara dayanarak), test ettiğim tüm eklentiler bunları kırdı. Sonunda, müşteriye aranabilir olmasını istiyorsa içeriğe terimler eklemesini söyledim.
Norcross

Yanıtlar:


36

Her Şeyde Arama eklentisini de öneririm , ancak bunu WP'nin arama işlevini kullanarak uygulamak istiyorsanız, Atom temamda kullandığım kod:

// search all taxonomies, based on: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23

function atom_search_where($where){
  global $wpdb;
  if (is_search())
    $where .= "OR (t.name LIKE '%".get_search_query()."%' AND {$wpdb->posts}.post_status = 'publish')";
  return $where;
}

function atom_search_join($join){
  global $wpdb;
  if (is_search())
    $join .= "LEFT JOIN {$wpdb->term_relationships} tr ON {$wpdb->posts}.ID = tr.object_id INNER JOIN {$wpdb->term_taxonomy} tt ON tt.term_taxonomy_id=tr.term_taxonomy_id INNER JOIN {$wpdb->terms} t ON t.term_id = tt.term_id";
  return $join;
}

function atom_search_groupby($groupby){
  global $wpdb;

  // we need to group on post ID
  $groupby_id = "{$wpdb->posts}.ID";
  if(!is_search() || strpos($groupby, $groupby_id) !== false) return $groupby;

  // groupby was empty, use ours
  if(!strlen(trim($groupby))) return $groupby_id;

  // wasn't empty, append ours
  return $groupby.", ".$groupby_id;
}

add_filter('posts_where','atom_search_where');
add_filter('posts_join', 'atom_search_join');
add_filter('posts_groupby', 'atom_search_groupby');

Tag-Search eklentisine dayanıyor: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23


1
Bu harika-- Bu kod, bir dizi taksonomi kimliğini arama dışında tutmak için nasıl değiştirilebilir?
HandiworkNYC.com

Bu kancalar için filtre geri aramalarının 2 argümanı kabul ettiği belirtilmelidir ; hepsi için ikincisi referans olarak geçen WP_Query örneğidir. Herhangi bir çek is_search()veya diğer WP_Query yöntemi çağrıları ( is_search() is_home()vb.), Her zaman ana sorguyu ifade edecek şablon işlevinden ziyade doğrudan sorgu örneğinde çağrılmalıdır (örneğin $query->is_search(), örnek değişkeninin adının $querygeri çağırma imzasında olduğu varsayılarak ) , filtrenin çalıştığı sorguyu değil.
Evan Mattson

4
Ayrıca, muhtemelen herkesin kullanabileceği ham arama dizesini doğrudan bir SQL sorgusuna enjekte etmek iyi bir fikir değil ... tavsiye edilen okuma
Evan Mattson

Bunun WPML ile bir uyuşmazlığı olduğunu eklemek isterim çünkü WPML alredy birleştirme bölümünde 'T' kullanmaktadır, bu nedenle tr, tt ve t yerine özel bir şey kullanmak bu sorunu düzeltir
Bobz

7

Bu standart WordPress araması mı? Çünkü bu , aramaya taksonomileri (kategoriler ve etiketler gibi standart bile değil) içermiyor gibi görünüyor . Kod arar post_titleve post_contentancak başka bir şey eklemek istiyorsanız posts_searchfiltreye bağlamanız gerekir .


5

Onetrickpony'in çözümünü https://wordpress.stackexchange.com/a/5404/37612 üzerinde denedim , bu harika bir şey, ancak orada benim için işe yaramayan bir sorun buldum ve küçük bir değişiklik yapmalıyım:

  1. taksonomi başlığında bir dize aradıysam - harika çalışıyor
  2. Taksonomide örneğin Alman "Umlauts" (ö, ä, ü) özel karakterleri varsa ve bunlardan biri özel karakter kullanmak için oe, ae, ue insteda yazıyorsa, aramayı taksonominin bölümüne eklemelisiniz - OR t.slug LIKE '%".get_search_query()."%'

  3. Bir arama sorgusu ve taksonomi filtresi kombinasyonu arıyorsanız - bu da iyi sonuç verir.

  4. Ancak sorun şu ki, yalnızca taksonomi filtresini kullanmaya çalıştığınızda - arama metni, hiçbir metin aranmazsa sorguya boş bir dize ekler ve bu nedenle sonuçta TÜM mesajları alırsınız. süzülmüş taksonomi. Basit bir IF ifadesi sorunu çözer. Yani tüm değiştirilmiş kod bu olurdu (benim için mükemmel çalışıyor!)

custom_search_where ($ where) {işlevi 
  global $ wpdb;
  if (is_search () && get_search_query ())
    $ where. = "OR (('%' şeklinde LIKE '%". get_search_query (). "%' VEYA '%' LIKE '%". get_search_query) = 'yayınla') ";
  $ yerine geri dönün;
}

fonksiyon custom_search_join ($ join) {
  global $ wpdb;
  if (is_search () && get_search_query ())
    $ join. = "LEFT JOIN {$ wpdb-> term_relationships} tr AÇIK {$ wpdb-> gönderiler} .ID = tr.object_id INNER JOIN {$ wpdb-> term_taxonomy} tt ON tt. $ wpdb-> terms} t AÇIK t.term_id = tt.term_id ";
  $ join döndür;
}

fonksiyon custom_search_groupby ($ groupby) {
  global $ wpdb;

  // posta kimliğinde gruplandırmamız gerekiyor
  $ groupby_id = "{$ wpdb-> posts} .ID";
  if (! is_search () || strpos ($ groupby, $ groupby_id)! == false ||! get_search_query ()) $ groupby döndürür;

  // groupby boştu, bizimkileri kullan
  if (! strlen (trim ($ groupby)))) $ groupby_id döndürür;

  // boş değildi, bizimkileri ekle
  $ groupby döndür. ",". $ groupby_id;
}

add_filter ( 'posts_where', 'custom_search_where');
add_filter ('posts_join', 'custom_search_join');
add_filter ('posts_groupby', 'custom_search_groupby');

3

Jan gibi aynı bilgi düzeyine sahibim. Eklentileri kullanarak da arama yapmanın mümkün olduğunu biliyorum.

Muhtemelen Her Şeyi Arayın (Wordpress Plugin) aradığınız şeydir. Özellik listesine göre, artık özel taksonomileri destekliyor.


+1 Ara Herşey eklentisi için. Beklendiği gibi çalışır ve standart Wordpress aramasından daha fazla sonuç verir.
PNMG

2

Onetrickpony'den gelen cevabın harika olduğunu gördüm, ancak herhangi bir aramayı tek bir terim olarak görür ve ayrıca tırnak işaretleri içine alınmış bir arama ifadesiyle ilgilenmez. atom_search_whereBu iki durumla başa çıkmak için kodunu (özellikle de fonksiyonunu) biraz değiştirdim. İşte kodunun değiştirilmiş versiyonum:

// search all taxonomies, based on: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23

function atom_search_where($where){ 
    global $wpdb, $wp_query;
    if (is_search()) {
        $search_terms = get_query_var( 'search_terms' );

        $where .= " OR (";
        $i = 0;
        foreach ($search_terms as $search_term) {
            $i++;
            if ($i>1) $where .= " AND";     // --- make this OR if you prefer not requiring all search terms to match taxonomies
            $where .= " (t.name LIKE '%".$search_term."%')";
        }
        $where .= " AND {$wpdb->posts}.post_status = 'publish')";
    }
  return $where;
}

function atom_search_join($join){
  global $wpdb;
  if (is_search())
    $join .= "LEFT JOIN {$wpdb->term_relationships} tr ON {$wpdb->posts}.ID = tr.object_id INNER JOIN {$wpdb->term_taxonomy} tt ON tt.term_taxonomy_id=tr.term_taxonomy_id INNER JOIN {$wpdb->terms} t ON t.term_id = tt.term_id";
  return $join;
}

function atom_search_groupby($groupby){
  global $wpdb;

  // we need to group on post ID
  $groupby_id = "{$wpdb->posts}.ID";
  if(!is_search() || strpos($groupby, $groupby_id) !== false) return $groupby;

  // groupby was empty, use ours
  if(!strlen(trim($groupby))) return $groupby_id;

  // wasn't empty, append ours
  return $groupby.", ".$groupby_id;
}

add_filter('posts_where','atom_search_where');
add_filter('posts_join', 'atom_search_join');
add_filter('posts_groupby', 'atom_search_groupby');

1

WooCommerce alışveriş sepeti eklentisi ile ilgili de aynı sorunu yaşıyorum. Arama sonuçlarımı standart bir post etiketi olmadığı için özel taksonomi terimi 'product_tag' içermiyor. Bu diğer StackOverflow iş parçacığında konuyla ilgili bir çözüm buldum:

https://stackoverflow.com/questions/13491828/how-to-amend-wordpress-search-so-it-queries-taxonomy-terms-and-category-terms

Tkelly'nin kod örneği, benim authorörneğindeki terimini product_tag, araba eklentileri için gereksinimlerimize göre değiştirirken benim için çalıştı .

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.