空搜索输入将返回所有帖子

时间:2016-02-04 作者:Stephen

所以今天我决定在我的网站上实现一个搜索表单,当用户搜索时,它显然会返回一个结果,但我遇到了一个小问题。

My Problem

当用户搜索结果时,由于某种原因没有在搜索表单中输入任何内容,它会返回5页,而我希望它返回一条消息,上面写着“搜索字段为空-再次搜索”。

我该如何实现这一点?我在下面插入了控制searchform 按钮和搜索时输出的内容。

Code Controlling the Search Form

searchform.php 这是用户输入所需内容的搜索表单(我感觉需要在此处输入一些代码以检查是否为空)

<form role="search" method="get" id="searchform" action="<?php echo home_url(\'/\'); ?>">
    <div>
        <label class="screen-reader-text" for="s">Search: </label>
        <input type="text" value="" name="s" id="s" placeholder="<?php the_search_query(); ?>" />
        <input type="submit" id="searchsubmit" value="Search" />
    </div>
</form>
search.php 这将向用户显示他们搜索的内容以及获取模板的步骤content-search 显示页面名称。

<div class="search-result">
    <div class="container">
        <div class="row">
            <div class="search">
                <?php if (have_posts()) : ?>

                    <h2>Search Result For: <?php the_search_query(); ?></h2>
                    <div class="light-separator small center"></div>

                    <?php
                    while (have_posts()) : the_post();

                    get_template_part(\'content-search\', get_post_format());

                    endwhile;
                    else :
                        echo \'
                        <div class="no-content"> 
                            <h3>Ooopss, looks like nothing matches your result.</h3>
                        </div>\';
                    endif;
                ?>
                <div class="search-form"><?php get_search_form(); ?></div>
            </div>        
        </div>
    </div>
</div>
content-search.php - 这将显示页面标题和页面永久链接

<div class="searchs">
    <h4>Pages - <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4>
</div>

5 个回复
最合适的回答,由SO网友:birgire 整理而成

这只是@PieterGoosen提供的信息性答案的另一种选择。

Pieter发布此部分后:

if ( ! empty( $q[\'s\'] ) ) {
    $search = $this->parse_search( $q );
}
我想到,在posts_search 过滤器,用于空搜索字符串。但是parse_search() 方法受到保护,即使我们可以访问它,空搜索也只会给我们:

AND (((wp_posts.post_title LIKE \'%%\') OR (wp_posts.post_content LIKE \'%%\'))) 
那只会搜索一切。所以这条路并没有多产;-)

在WordPress 4.5中,它已更改为

if ( strlen( $q[\'s\'] ) ) {
    $search = $this->parse_search( $q );
}
相反,如果是空搜索,我们可以尝试停止主查询:

/**
 * Halt the main query in the case of an empty search 
 */
add_filter( \'posts_search\', function( $search, \\WP_Query $q )
{
    if( ! is_admin() && empty( $search ) && $q->is_search() && $q->is_main_query() )
        $search .=" AND 0=1 ";

    return $search;
}, 10, 2 );

SO网友:Pieter Goosen

我不确定这是一个预期的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();
            });
        }
    }
});

SO网友:Thomas Buegel

如果要排除长度小于定义长度的搜索字符串和空搜索字符串,可以使用birgire解决方案的此修改函数。在此示例中,只有一个字母的空短语和搜索短语不会给出任何结果:

    add_filter( \'posts_search\', function( $search, \\WP_Query $q )
    {
        $sphrase = get_search_query();
        $slen = strlen($sphrase);
        $minlen = 2;
            if( ! is_admin() && $slen < $minlen && $q->is_search() && $q->is_main_query() ){
                $search .=" AND 0=1 ";
            }
        return $search;
    }, 10, 2 );

SO网友:Chad Reitsma

如果您使用的是标准搜索。php文件,只需在if(have\\u posts())条件中添加逻辑就容易多了。。。

if ( have_posts() && $_GET[\'s\'] != \'\' )
这样,如果搜索参数为空,它就不会执行内容循环。

SO网友:Wordpress Dev-lover

要排除长度小于定义长度的搜索字符串和空搜索字符串,可以使用birgire解决方案的此修改函数:

add_filter( \'posts_search\', function( $search, \\WP_Query $q )
{
    $sphrase = get_search_query();
    $slen = strlen($sphrase);
    $minlen = 2;
        if( ! is_admin() && $slen < $minlen && $q->is_search() && $q->is_main_query() ){
            $search .=" AND 0=1 ";
        }
    return $search;
}, 10, 2 );

相关推荐

nothing happen in search form

我想创建搜索表单,但当我搜索时什么都没有发生,这是代码:索引。php: <div class=\"tech-btm\"> <?php get_search_form();?> </div> 搜索表单:<form role=\"search\" method=\"get\" id=\"searchform\" action=\"<?php echo home_url(\'/\')?>\"> &