Пустой поиск возвращает главную страницу, как вернуть страницу с сообщением "ничего не найдено"?
По умолчанию функция поиска при пустой форме возвращает главную страницу, а я хочу, чтобы она возвращала страницу с сообщением "извините, по вашему запросу ничего не найдено".
этот пост не отвечает на вопрос
а этот тикет говорит мне, что так и должно работать! Кто-нибудь нашел способ изменить это поведение без использования редиректа в .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).'" »</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('« Старые записи', "bonestheme")) ?></li>
<li class="next-link"><?php previous_posts_link(_e('Новые записи »', "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 -->

Вот 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']=' ';
}
}

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

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

Развивая решение Тома №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;
}

Создайте файл 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(); ?>

Проверка, является ли поисковый запрос пустым ( get_search_query() ), просто замените первый IF на этот:
<?php if (have_posts() && get_search_query()) : while (have_posts()) : the_post(); ?>

В своих темах я обрабатываю это следующим образом. Попробуйте использовать этот код:
<?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). Вы также можете вызвать функцию формы поиска в области контента.

Я также столкнулся с этой проблемой, она является стандартным поведением 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

Один из способов избежать пустого поиска — выполнить проверку на JavaScript, чтобы убедиться, что поле поиска не пустое. Если поле пустое, можно остановить отправку формы поиска, как показано ниже:
$('#searchform').submit(function(){
search_value =$.trim($('#searchform #s').val());
if(search_value == ""){
return false; // Здесь также можно вывести уведомление для пользователя.
}
});

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