问题描述

我有一个 CPT 设置与附加的自定义分类法。我最近注意到,如果我搜索 0(零),在 back-end 以及 front-end,它给我的结果。这些结果的帖子中没有一个在标题和内容的任何地方都有 0 。反正我没有修改循环,只是简单的搜索模板。这让我想知道 2 件事情:

  1. WP 默认搜索是什么?

  2. 有没有办法阻止它搜索 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。