Пустой поиск возвращает главную страницу, как вернуть страницу с сообщением "ничего не найдено"?

26 сент. 2011 г., 18:14:14
Просмотры: 33.6K
Голосов: 16

По умолчанию функция поиска при пустой форме возвращает главную страницу, а я хочу, чтобы она возвращала страницу с сообщением "извините, по вашему запросу ничего не найдено".

этот пост не отвечает на вопрос

а этот тикет говорит мне, что так и должно работать! Кто-нибудь нашел способ изменить это поведение без использования редиректа в .htaccess?

Я использую следующий файл search.php:

        <div id="content" class="clearfix">

            <div id="main" class="col700 left clearfix" role="main">

                <h1 class="archive_title"><span>Результаты поиска для:</span> <?php echo esc_attr(get_search_query()); ?></h1>

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

                <article id="post-<?php the_ID(); ?>" <?php post_class('clearfix'); ?>>

                    <header>

                        <h3><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></h3>

                        <p class="meta"><?php _e("Опубликовано", "bonestheme"); ?> <time datetime="<?php echo the_time('Y-m-j'); ?>" pubdate><?php the_time('F jS, Y'); ?></time> <?php _e("автором", "bonestheme"); ?> <?php the_author_posts_link(); ?> <span class="amp">&</span> <?php _e("в категории", "bonestheme"); ?> <?php the_category(', '); ?>.</p>

                    </header> <!-- конец заголовка статьи -->

                    <section class="post_content">
                        <?php the_excerpt('<span class="read-more">Читать далее "'.the_title('', '', false).'" &raquo;</span>'); ?>

                    </section> <!-- конец секции статьи -->

                    <footer>


                    </footer> <!-- конец подвала статьи -->

                </article> <!-- конец статьи -->

                <?php endwhile; ?>  

                <?php if (function_exists('page_navi')) { // если экспериментальная функция активна ?>

                    <?php page_navi(); // использовать функцию навигации ?>

                <?php } else { // если отключено, показывать стандартные ссылки wp prev & next ?>
                    <nav class="wp-prev-next">
                        <ul class="clearfix">
                            <li class="prev-link"><?php next_posts_link(_e('&laquo; Старые записи', "bonestheme")) ?></li>
                            <li class="next-link"><?php previous_posts_link(_e('Новые записи &raquo;', "bonestheme")) ?></li>
                        </ul>
                    </nav>
                <?php } ?>          

                <?php else : ?>

                <!-- эта область появляется, если нет результатов -->

                <article id="post-not-found">
                    <header>
                        <h1>Результатов не найдено</h1>
                    </header>
                    <section class="post_content">
                        <p>Извините, но запрошенный ресурс не найден на этом сайте.</p>
                    </section>
                    <footer>
                    </footer>
                </article>

                <?php endif; ?>

            </div> <!-- конец #main -->

            <div id="sidebar1" class="sidebar right col220">

                <?php get_search_form(); ?>

            </div>

        </div> <!-- конец #content -->
9
Комментарии

показать немного кода?

kaiser kaiser
26 сент. 2011 г. 18:18:31

Я даже не знаю, с чего начать решение этой проблемы (кроме htaccess), поэтому кода нет. Любая помощь приветствуется

Drai Drai
26 сент. 2011 г. 19:10:20

можете показать код из searchform.php и search.php?

kaiser kaiser
26 сент. 2011 г. 20:00:28

Я использую тему Bones, в которой есть файл search.php, но используется стандартная форма поиска WordPress

Drai Drai
26 сент. 2011 г. 21:44:54

упс, это тема Roots

Drai Drai
30 сент. 2011 г. 04:22:19

ссылка? (заполнитель)

kaiser kaiser
30 сент. 2011 г. 12:02:09

@Drai, ты разобрался? У меня такая же проблема. Спасибо!

dashaluna dashaluna
20 окт. 2011 г. 16:10:34

Вот ссылка на тему Roots, которую я использую: https://github.com/retlehs/roots

Drai Drai
25 окт. 2011 г. 00:52:41

Это общая проблема WordPress, а не конкретно этой темы

Tom J Nowell Tom J Nowell
28 окт. 2011 г. 17:07:17
Показать остальные 4 комментариев
Все ответы на вопрос 8
3
18

Вот 3 способа исправить эту проблему. Я рекомендую использовать решение 2, но обратите внимание на jQuery в решении 1 как способ избежать этой ситуации изначально.

Для тех, кто хочет увидеть больше кода из темы автора вопроса: это не проблема темы, это общая проблема WordPress, которая затрагивает все сайты на WordPress.

Решение 1

Подробный урок о том, как это исправить, можно найти здесь:

http://wpengineer.com/2162/fix-empty-searches/

Сегодня давайте рассмотрим то, что большинство профессионалов никогда не видят: пустые поисковые запросы. Вы предлагаете поле для поиска, и кто-то случайно нажимает кнопку отправки, не введя ни одного слова. Получившийся URI выглядит так: example.com/?s=. Он показывает тот же контент, что и ваша главная страница. По сути, это и есть главная страница.

Никому это не нужно.

Решение 2 (рекомендуемое)

Взято из поста Spitzerg http://wordpress.org/support/topic/blank-search-sends-you-to-the-homepage

Другой вариант - добавить фильтр запросов:

add_filter( 'request', 'my_request_filter' );
function my_request_filter( $query_vars ) {
    if( isset( $_GET['s'] ) && empty( $_GET['s'] ) ) {
        $query_vars['s'] = " ";
    }
    return $query_vars;
}

Затем, если вы повторно используете поисковый запрос в своей поисковой форме, не забудьте обрезать его, чтобы не получить один или несколько пробелов (просто чтобы поддерживать чистоту, вероятно, это не повлияет на результаты.

<input type="text" name="s" id="s" value="<?php echo trim( get_search_query() ); ?>"/>

Надеюсь, это поможет. На моем сайте это работает, и не требует изменений в коде WP, что упрощает обновления.

Решение 3

http://www.warpconduit.net/2011/08/02/fix-redirection-and-error-page-on-empty-wordpress-search/

Похоже на решение 2, но не такое обширное и немного отличается.

    if(!is_admin()){
        add_action('init', 'search_query_fix');
    }
    function search_query_fix(){
        if(isset($_GET['s']) && $_GET['s']==''){
            $_GET['s']=' ';
        }
    }
28 окт. 2011 г. 17:05:30
Комментарии

Проблема второго решения в том, что оно вернет каждую запись (или по крайней мере каждую запись с пробелом), тогда как на самом деле не должно возвращать ничего.

Felix Eve Felix Eve
2 сент. 2014 г. 08:10:48

Оно также не исправляет domain.com/page/2

fdrv fdrv
20 мая 2020 г. 08:49:02

Пробел - это просто пример, который я использовал в качестве заполнителя. Возможно, стоит использовать то, что точно не встретится в вашем контенте, но в тот момент я не мог придумать подходящий вариант. Также существует более одного решения

Tom J Nowell Tom J Nowell
20 мая 2020 г. 21:44:31
1

Развивая решение Тома №2, но гарантируя, что никакие записи не будут возвращены, добавьте фильтр запроса, как и ранее:

add_filter( 'request', 'my_request_filter' );
function my_request_filter( $query_vars ) {
    if( isset( $_GET['s'] ) && empty( $_GET['s'] ) ) {
        $query_vars['s'] = " ";
        global $no_search_results;
        $no_search_results = TRUE;
    }
    return $query_vars;
}

Но на этот раз установите глобальную переменную, указывающую, что не должно возвращаться никаких результатов поиска. Затем, используя хук posts_where, убедитесь, что записи не возвращаются:

add_filter( 'posts_where' , 'posts_where_statement' ); 
function posts_where_statement( $where ) {
    global $no_search_results;
    if($no_search_results) {
        $where .= ' AND 1=0';
    }
    return $where;
}
2 сент. 2014 г. 08:28:24
Комментарии

Огромное спасибо за сниппет. Это сводило меня с ума, что при отсутствии поискового запроса возвращались все записи.

Michael Rogers Michael Rogers
28 дек. 2021 г. 17:44:46
0

Создайте файл Search.php и вставьте этот код, заменив свой цикл на "get_template_part('loop', 'search');

                    <div id="container">
                        <div id="content" role="main">

            <?php if ( have_posts() ) : ?>
                            <h1 class="page-title"><?php printf( __( 'Результаты поиска для: %s', 'mb' ), '<span>' . get_search_query() . '</span>' ); ?></h1>
                            <?php
                            /* Запускаем цикл для вывода результатов поиска.
                             * Если вы хотите переопределить это в дочерней теме, включите файл
                             * с названием loop-search.php, который будет использоваться вместо стандартного.
                             */
                             get_template_part( 'loop', 'search' );
                            ?>
            <?php else : ?>
                            <div id="post-0" class="post no-results not-found">
                                <h2 class="entry-title"><?php _e( 'Ничего не найдено', 'mb' ); ?></h2>
                                <div class="entry-content">
                                    <p><?php _e( 'Извините, но ничего не соответствует вашим критериям поиска. Пожалуйста, попробуйте снова с другими ключевыми словами.', 'twentyten' ); ?></p>
                                    <?php get_search_form(); ?>
                                </div><!-- .entry-content -->
                            </div><!-- #post-0 -->
            <?php endif; ?>
                        </div><!-- #content -->
                    </div><!-- #container -->

            <?php get_sidebar(); ?>
            <?php get_footer(); ?>
27 сент. 2011 г. 08:54:19
1

Проверка, является ли поисковый запрос пустым ( get_search_query() ), просто замените первый IF на этот:

<?php if (have_posts() && get_search_query()) : while (have_posts()) : the_post(); ?>
6 авг. 2015 г. 16:04:49
Комментарии

Думаю, это достаточно справедливое решение. Простое и чистое. Без специальных фильтров и действий, которые могут усложнить код

Kamil Kamil
24 сент. 2019 г. 17:23:57
0

В своих темах я обрабатываю это следующим образом. Попробуйте использовать этот код:

<?php if (!have_posts()): ?>
    <article id="post-0">
        <header>
            <h3>Записи не найдены.</h3>
        </header> <!-- конец заголовка статьи -->

        <section class="post_content">
           Извините, мы не нашли записей по вашему запросу. Пожалуйста, попробуйте поискать снова.
        </section> <!-- конец секции статьи -->

        <footer>
        </footer> <!-- конец подвала статьи -->

    </article> <!-- конец статьи -->
<?php endif; ?>

Мы обрабатываем условие if(!have_posts()). Поместите этот код сразу после h3.archive title, до начала if(have_posts). Вы также можете вызвать функцию формы поиска в области контента.

27 сент. 2011 г. 06:45:06
0

Я также столкнулся с этой проблемой, она является стандартным поведением WordPress.

К счастью, я нашел решение, которое мне помогло.

Добавьте следующий код в файл "functions.php":

function SearchFilter($query) {
    // Если переменная запроса 's' установлена, но пуста
    if (isset($_GET['s']) && empty($_GET['s']) && $query->is_main_query()){
        $query->is_search = true;
        $query->is_home = false;
    }
    return $query;}
add_filter('pre_get_posts','SearchFilter');

Затем замените следующую строку (строка 15) в файле search.php:

<?php if ( have_posts() && strlen( trim(get_search_query()) ) != 0 ) : ?>

Возможно, это решение поможет и вам.

Подробнее можно прочитать здесь: Настройка пустого поиска в WordPress

3 авг. 2013 г. 08:55:06
0

Один из способов избежать пустого поиска — выполнить проверку на JavaScript, чтобы убедиться, что поле поиска не пустое. Если поле пустое, можно остановить отправку формы поиска, как показано ниже:

$('#searchform').submit(function(){

            search_value =$.trim($('#searchform #s').val());

            if(search_value == ""){

                return false; // Здесь также можно вывести уведомление для пользователя.
            }

});
8 мая 2015 г. 11:23:58
1
# Перехват пустых поисковых запросов
RewriteCond %{QUERY_STRING} ^s=$
RewriteRule ^ /? [L,R=301]
28 февр. 2017 г. 22:07:54
Комментарии

Неясно, как это отвечает на вопрос. Не могли бы вы отредактировать свой ответ (используя кнопку редактирования выше) и добавить некоторые детали о том, что делает этот код, куда его вставлять и как он решает проблему?

Howdy_McGee Howdy_McGee
28 февр. 2017 г. 22:29:19