我有两个自定义分类法应用于两个自定义帖子类型。边栏上的术语列表就可以了,它将列出与之关联的所有帖子。但是,如果您搜索特定的术语之一,则不会显示该术语的帖子。
示例:http : //dev.andrewnorcross.com/das/all-case-studies/搜索术语“ PQRI”
我什么都没有。有任何想法吗?我尝试使用各种搜索插件,但它们要么破坏了我的自定义搜索参数,要么就不起作用。
我有两个自定义分类法应用于两个自定义帖子类型。边栏上的术语列表就可以了,它将列出与之关联的所有帖子。但是,如果您搜索特定的术语之一,则不会显示该术语的帖子。
示例:http : //dev.andrewnorcross.com/das/all-case-studies/搜索术语“ PQRI”
我什么都没有。有任何想法吗?我尝试使用各种搜索插件,但它们要么破坏了我的自定义搜索参数,要么就不起作用。
Answers:
我也建议使用“ 搜索所有内容”插件,但是如果您想使用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
is_search()
或其他WP_Query方法调用(is_search()
is_home()
等等)都应始终直接在查询实例上调用(例如,$query->is_search()
假设实例变量的名称$query
在回调签名中),而不是始终引用主查询的模板函数,而不是过滤器正在运行的查询。
这是标准的WordPress搜索吗?因为这似乎没有在搜索中包括分类法(甚至不包括分类和标签之类的标准分类法)。该代码在post_title
和中搜索post_content
,但如果要包含其他内容,则应插入posts_search
过滤器。
我在https://wordpress.stackexchange.com/a/5404/37612上面尝试了Onetrickpony的解决方案,虽然很好,但是我发现那里的一个问题对我不起作用,我将做一个小修改:
如果分类法具有特殊字符,例如德语“ Umlauts”(ö,ä,ü),并且使用特殊字符搜索oe,ae,uesteda,那么您需要在分类法的子句中添加搜索-
OR t.slug LIKE '%".get_search_query()."%'
如果您搜索搜索查询和分类过滤器的组合,则也可以正常工作
但是问题是,当您尝试仅使用分类过滤器时,如果没有搜索到任何文本,则搜索挂钩会将空字符串添加到查询中,因此您将在结果中获得所有帖子,而不是仅从过滤的分类法。一个简单的IF语句即可解决该问题。因此,整个修改后的代码将是这样(对我来说很好用!)
函数custom_search_where($ where){ 全局$ wpdb; 如果(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 ='发布')“; 返回$ where; } 函数custom_search_join($ join){ 全局$ wpdb; 如果(is_search()&& get_search_query()) $ join。=“”左联接{$ wpdb-> term_relationships} tr ON {$ wpdb-> posts} .ID = tr.object_id内联接{$ wpdb-> term_taxonomy} tt上tt.term_taxonomy_id = tr.term_taxonomy_id内联接{ $ wpdb-> terms} t ON t.term_id = tt.term_id“; 返回$ join; } 函数custom_search_groupby($ groupby){ 全局$ wpdb; //我们需要按帖子ID分组 $ groupby_id =“ {$ wpdb-> posts} .ID”; if(!is_search()|| strpos($ groupby,$ groupby_id)!== false ||!get_search_query())返回$ groupby; // groupby为空,请使用我们的 if(!strlen(trim($ groupby)))返回$ groupby_id; //不为空,请追加我们的 返回$ 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相同级别的信息。我知道也可以通过插件扩展搜索。
可能搜索所有内容(Wordpress插件)。根据功能列表,它现在支持自定义分类法。
我发现onetrickpony的答案很好,但它会将任何搜索都视为一个词,也不会处理用引号引起来的搜索词组。我对他的代码(特别是atom_search_where
函数)做了一些修改以应对这两种情况。这是我修改后的代码:
// 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');
我对WooCommerce购物车插件有同样的问题。我的搜索结果不包括自定义分类术语“ product_tag”,因为它不是标准的帖子标记。我在与此有关的另一个StackOverflow线程中找到了解决方案:
根据我们对购物车插件的需求,tkelly的代码示例为我工作时用author
他的示例替换了该术语product_tag
。