我试过上面提到的一匹小马的解决方案https://wordpress.stackexchange.com/a/5404/37612, 这很好,但我发现了一个问题,它对我不起作用,我会做一个小的修改:
如果我在分类法的标题中搜索一个字符串-如果分类法有特殊字符,例如德语的“Umlauts”(ö,ä,ü),并且搜索oe、ae、ue而不是使用特殊字符,则效果很好-您需要在分类法的slug中添加搜索-OR t.slug LIKE \'%".get_search_query()."%\'
如果您搜索搜索查询和分类过滤器的组合,这也可以正常工作
但问题是,当您尝试只使用分类法过滤器时,如果没有搜索文本,搜索挂钩会在查询中附加一个空字符串,因此您会得到结果中的所有帖子,而不仅仅是过滤后的分类法中的帖子。一个简单的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\');