Sertakan istilah taksonomi khusus dalam pencarian

33

Saya memiliki dua taksonomi khusus yang diterapkan pada dua jenis pos kustom. daftar istilah di sidebar baik-baik saja dan akan mencantumkan semua posting yang terkait dengannya. Namun, jika Anda mencari salah satu istilah secara spesifik, itu tidak memunculkan pos dengan istilah itu.

Contoh: http://dev.andrewnorcross.com/das/all-case-studies/ Cari istilah "PQRI"

Saya tidak mendapatkan apa-apa. Ada ide? Saya sudah mencoba menggunakan berbagai plugin pencarian tetapi mereka merusak parameter pencarian khusus saya atau tidak berfungsi.

Norcross
sumber
Nocross, dapatkah Anda menambahkan umpan balik ke jawaban yang diajukan Jan? Apakah Anda mungkin mencari plugin yang berfungsi?
hakre
Saya akhirnya mengabaikan rencana itu. Karena saya telah membuat 3 fungsi pencarian yang terpisah (berdasarkan kebutuhan yang berbeda di area tertentu), semua plugin yang saya uji memecahnya. Pada akhirnya, saya mengatakan kepada klien untuk memasukkan istilah dalam konten jika mereka ingin dapat dicari.
Norcross

Jawaban:

36

Saya akan merekomendasikan plugin Search Everything juga, tetapi jika Anda ingin menerapkan ini menggunakan fungsi pencarian WP, inilah kode yang saya gunakan dalam tema Atom saya:

// 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');

Ini didasarkan pada plugin Tag-Search: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23

onetrickpony
sumber
1
Ini hebat - bagaimana kode ini dapat dimodifikasi untuk mengecualikan array ID taksonomi dari pencarian?
HandiworkNYC.com
Perlu dicatat bahwa filter balik untuk kait ini menerima 2 argumen; yang ke-2 untuk semuanya adalah instance WP_Query yang dilewatkan dengan referensi. Setiap pemeriksaan untuk is_search()atau panggilan metode WP_Query lainnya ( is_search() is_home()dll.) Harus selalu dipanggil langsung pada instance kueri (mis. Dengan $query->is_search()asumsi nama variabel instance ada $querydalam tanda tangan callback) daripada fungsi templat yang akan selalu merujuk ke kueri utama , bukan kueri yang menjalankan filter.
Evan Mattson
4
Juga, mungkin bukan ide yang baik untuk menyuntikkan string pencarian mentah yang tersedia untuk umum secara langsung ke dalam query SQL ... bacaan yang disarankan
Evan Mattson
Saya hanya ingin menambahkan bahwa ini memiliki konflik dengan WPML karena WPML telah menggunakan 'T' di bagian gabung, jadi menggunakan sesuatu yang khusus alih-alih tr, tt dan t memperbaiki masalah ini
Bobz
7

Apakah ini pencarian standar WordPress? Karena itu sepertinya tidak memasukkan taksonomi (bahkan tidak standar, seperti kategori dan tag) dalam pencarian. Kode mencari post_titledan post_content, tetapi jika Anda ingin memasukkan hal lain, Anda harus memasukkan ke dalam posts_searchfilter.

Jan Fabry
sumber
5

Saya mencoba solusi Onetrickpony di atas https://wordpress.stackexchange.com/a/5404/37612 , yang hebat, tetapi saya menemukan satu masalah di sana, yang tidak berhasil untuk saya, dan saya akan membuat satu modifikasi kecil:

  1. jika saya mencari string dalam judul taksonomi - itu berfungsi dengan baik
  2. jika taksonomi memiliki karakter khusus misalnya dengan bahasa Jerman "Umlaut" (ö, ä, ü) dan satu pencarian untuk oe, ae, ue insteda menggunakan char khusus - Anda perlu menambahkan pencarian di siput taksonomi - OR t.slug LIKE '%".get_search_query()."%'

  3. jika Anda mencari kombinasi permintaan pencarian dan filter taksonomi - ini juga berfungsi dengan baik

  4. Tapi masalahnya adalah, ketika Anda mencoba menggunakan hanya filter taksonomi - kait pencarian menambahkan string kosong ke kueri jika tidak ada teks yang dicari, dan untuk alasan itu Anda mendapatkan SEMUA posting di hasilnya, bukan hanya yang dari taksonomi tersaring. Pernyataan IF sederhana memecahkan masalah. Jadi seluruh kode yang dimodifikasi adalah ini (berfungsi dengan baik untuk saya!)

function custom_search_where ($ where) { 
  global $ wpdb;
  if (is_search () && get_search_query ())
    $ where. = "OR ((t.name LIKE '%". get_search_query (). "%' OR t.slug LIKE '%". get_search_query (). "%') DAN {$ wpdb-> postingan} .post_status = 'terbitkan') ";
  mengembalikan $ di mana;
}

function custom_search_join ($ join) {
  global $ wpdb;
  if (is_search () && get_search_query ())
    $ 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 = tr.term_taxonomy_id INNER JOIN { $ wpdb-> terms} t ON t.term_id = tt.term_id ";
  return $ join;
}

fungsi custom_search_groupby ($ groupby) {
  global $ wpdb;

  // kita perlu mengelompokkan pada ID posting
  $ groupby_id = "{$ wpdb-> postingan} .ID";
  if (! is_search () || strpos ($ groupby, $ groupby_id)! == false ||! get_search_query ()) mengembalikan $ groupby;

  // groupby kosong, gunakan milik kita
  if (! strlen (trim ($ groupby)))) kembalikan $ groupby_id;

  // tidak kosong, tambahkan milik kita
  return $ groupby. ",". $ groupby_id;
}

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

Saya memiliki tingkat informasi yang sama seperti Jan. Saya tahu itu mungkin untuk memperluas pencarian dengan plugin juga.

Mungkin Cari Segalanya (Plugin Wordpress) adalah apa yang Anda cari. Menurut daftar fitur, sekarang mendukung taksonomi kustom.

hakre
sumber
+1 Untuk plugin Cari Semuanya. Ini berfungsi seperti yang diharapkan dan mengembalikan lebih banyak hasil daripada pencarian Wordpress standar.
PNMG
2

Saya menemukan jawaban dari onetrickpony sangat bagus tetapi memperlakukan pencarian apa pun sebagai istilah tunggal dan juga tidak akan berurusan dengan frasa pencarian yang disertai tanda kutip. Saya memodifikasi kodenya (khususnya, atom_search_wherefungsi) sedikit untuk menangani dua situasi ini. Ini adalah versi kodenya yang saya modifikasi:

// 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');
Mojamba
sumber
1

Saya memiliki masalah yang sama dengan plugin keranjang WooCommerce .. Hasil pencarian saya tidak termasuk istilah taksonomi kustom, 'product_tag', karena itu bukan tag posting standar. Saya menemukan solusi di utas StackOverflow lainnya tentang masalah ini:

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

Contoh kode oleh tkelly bekerja untuk saya ketika mengganti istilah authordalam contohnya dengan product_tagsesuai kebutuhan kita untuk plugin kereta.

mroncetwice
sumber