问题描述
我有一个 CPT 设置与附加的自定义分类法。我最近注意到,如果我搜索 0
(零),在 back-end 以及 front-end,它给我的结果。这些结果的帖子中没有一个在标题和内容的任何地方都有 0
。反正我没有修改循环,只是简单的搜索模板。这让我想知道 2 件事情:
-
WP 默认搜索是什么?
-
有没有办法阻止它搜索
0
?
有任何想法吗?
更新:
从以下评论中我更新了我的要求:
当输入 0
作为搜索键时,是否有办法在标题或内容中搜索包含 0
的帖子?
最佳解决方案
考虑 @Mayeenul 伊斯兰教评论:
I’ve just tested in a blank theme with dummy data, search with 0 (zero) fired an empty search – that means all:
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type IN ('post', 'page', 'attachment') AND (wp_posts.post_status = 'publish') ORDER BY wp_posts.post_date DESC LIMIT 0, 10
和 wp-includes/query.php
包含的事实
if ( ! empty( $q['s'] ) ) {
$search = $this->parse_search( $q );
}
,我们可以看到!empty($q['s'])
,其中 $q['s'] == 0 (or "0")
将返回 FALSE
。这意味着搜索查询不会有 LIKE
部分,当 $q['s'] == 0
和它返回”all” 的帖子,因为没有限制查询具体条件,应该在 LIKE
内部。
这是由 empty()
功能文档证实的:
The following things are considered to be empty:
…
- 0 (0 as an integer)
- “0” (0 as a string)
…
由于我们无法过滤/更新,”0″ 为了通过 if-empty 条件逻辑。我建议的是查询更新,以防用户要搜索”0″ 。
这是一个 quickfix 如何让用户搜索”0″ 。
add_filter("posts_where", "search_hotfix", 10, 1);
function search_hotfix($where_clause){
if(get_query_var('s') == 0){
$where_clause .= " AND (((wp_posts.post_title LIKE '%0%') OR (wp_posts.post_content LIKE '%0%'))) ";
}
return $where_clause;
}
更新:
这里是一个 quickfix 如何停止 WP 搜索”0″ 。此代码将强制 WP_Query 不提供任何结果。
add_action('pre_get_posts', 'search_hotfix_reset_q');
function search_hotfix_reset_q($query){
if ( get_query_var('s') == 0) {
$query->query_vars['post__in'] = array(0);
}
}
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。