问题描述

我有两个自定义分类法应用于两个自定义帖子类型。侧栏上的条款列表很好,并将列出与其相关联的所有帖子。但是,如果您搜索特定的术语之一,则不会显示该术语的帖子。

示例: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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。