問題描述

我有兩個自定義分類法應用於兩個自定義帖子型別。側欄上的條款列表很好,並將列出與其相關聯的所有帖子。但是,如果您搜尋特定的術語之一,則不會顯示該術語的帖子。

示例:http://dev.andrewnorcross.com/das/all-case-studies/搜尋詞”PQRI”

我什麼都沒有有任何想法嗎?我嘗試使用各種搜尋外掛,但是它們會打破我的自定義搜尋引數,也可能不工作。

最佳解決方案

我會推薦 「搜尋所有」 外掛,但是如果要使用 WP 的搜尋功能實現此功能,請參閱我在 Atom 主題中使用的程式碼:

// 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 外掛:http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23

次佳解決方案

這是標準的 WordPress 搜尋嗎?因為 doesn’t seem to include taxonomies(甚至沒有標準,像類別和標籤) 在搜尋。程式碼在 post_titlepost_content 中進行搜尋,但如果要包含任何您應該掛接到 posts_search 過濾器的內容。

第三種解決方案

我嘗試了在 https://wordpress.stackexchange.com/a/5404/37612 上面的 Onetrickpony 的解決方案,這是偉大的,但我發現一個問題在那裡,這對我來說不起作用,我會做一個小的修改:

  1. 如果我在分類標題中搜尋了一個字串 – 它的效果很好
  2. 如果分類具有特殊字元,例如與德國”Umlauts”(ö,ä,ü) 和一個搜尋 oe,ae,ue instaa 使用特殊的字元 – 你需要新增搜尋的分類 – OR t.slug LIKE '%".get_search_query()."%'
  3. 如果您搜尋搜尋查詢和分類過濾器的組合 – 這也可以正常工作
  4. 但是問題是,當您嘗試僅使用分類過濾器時,如果搜尋沒有文字,則搜尋鉤子會在查詢中附加一個空字串,因此,您將獲得結果中的所有帖子,而不是僅從過濾分類法。一個簡單的 IF 語句解決了這個問題。所以整個修改後的程式碼就是這樣 (對我來說完美無缺)

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()."%') AND {$wpdb->posts}.post_status = 'publish')";
  return $where;
}

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 INNER JOIN {$wpdb->terms} t ON t.term_id = tt.term_id";
  return $join;
}

function custom_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 || !get_search_query()) 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','custom_search_where');
add_filter('posts_join', 'custom_search_join');
add_filter('posts_groupby', 'custom_search_groupby');

第四種方案

我有一樣的資訊像 Jan 一樣,我知道有可能擴充套件搜尋與外掛。

可能 Search Everything (WordPress Plugin)是你正在尋找的。根據功能列表,它現在支援自定義分類。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。