我不确定这是一个预期的bug还是一个从未预料到的bug,但这肯定是设计中的一个缺陷。
这种行为存在于我之前注意到的以下情况中
将空数组设置为post__in
返回所有帖子
将无效术语传递给tax_query
或使用name
名称包含特殊字符或多个单词的字段会从SQL查询中删除join子句,这也会导致返回所有帖子。我做了一个answer regarding this issue
因此,当我们将有效字符串传递给搜索函数时WHERE
条款被修改为包含我们的搜索词。通常情况下WHERE
子句在输入名为search
AND (((wp_posts.post_title LIKE \\\'%search%\\\')
OR (wp_posts.post_content LIKE \\\'%search%\\\')))
AND wp_posts.post_type IN (\\\'post\\\', \\\'page\\\', \\\'attachment\\\', \\\'information\\\', \\\'event_type\\\', \\\'cameras\\\')
AND (wp_posts.post_status = \\\'publish\\\'
OR wp_posts.post_author = 1
AND wp_posts.post_status = \\\'private\\\')
当我们传递一个空字符串时,search子句将从
WHERE
导致返回所有帖子的子句。这就是
WHERE
子句看起来像是当我们传递一个空字符串时
AND wp_posts.post_type IN (\\\'post\\\', \\\'page\\\', \\\'attachment\\\', \\\'information\\\', \\\'event_type\\\', \\\'cameras\\\')
AND (wp_posts.post_status = \\\'publish\\\' OR wp_posts.post_author = 1
AND wp_posts.post_status = \\\'private\\\')
这是中的部分
WP_Query
谁对此负责
if ( ! empty( $q[\'s\'] ) ) {
$search = $this->parse_search( $q );
}
解决这个问题的最简单方法是,每当我们传递一个空字符串作为搜索词时,返回404。为此,我们需要检查是否有有效的搜索字符串,然后根据该字符串设置404。您可以尝试以下方法
add_action( \'pre_get_posts\', function ( $q )
{
if( !is_admin() // Only target the front end
&& $q->is_main_query() // Only target the main query
&& $q->is_search() // Only target the search page
) {
// Get the search terms
$search_terms = $q->get( \'s\' );
// Set a 404 if s is empty
if ( !$search_terms ) {
add_action( \'wp\', function () use ( $q )
{
$q->set_404();
status_header(404);
nocache_headers();
});
}
}
});