问题描述
我有两个自定义分类法应用于两个自定义帖子类型。侧栏上的条款列表很好,并将列出与其相关联的所有帖子。但是,如果您搜索特定的术语之一,则不会显示该术语的帖子。
示例: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_title
和 post_content
中进行搜索,但如果要包含任何您应该挂接到 posts_search
过滤器的内容。
第三种解决方案
我尝试了在 https://wordpress.stackexchange.com/a/5404/37612 上面的 Onetrickpony 的解决方案,这是伟大的,但我发现一个问题在那里,这对我来说不起作用,我会做一个小的修改:
- 如果我在分类标题中搜索了一个字符串 – 它的效果很好
- 如果分类具有特殊字符,例如与德国”Umlauts”(ö,ä,ü) 和一个搜索 oe,ae,ue instaa 使用特殊的字符 – 你需要添加搜索的分类 –
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');
第四种方案
我有一样的信息像 Jan 一样,我知道有可能扩展搜索与插件。
可能 Search Everything (WordPress Plugin)是你正在寻找的。根据功能列表,它现在支持自定义分类。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。