La búsqueda vacía devuelve la página de inicio, ¿cómo devolver una página de búsqueda no encontrada?
La función de búsqueda predeterminada devuelve la página de inicio si el formulario de búsqueda está vacío. Quiero que devuelva una página que diga "lo sentimos, su búsqueda no produjo resultados".
esta publicación no responde a esto
y este ticket ¡me dice que se supone que debe funcionar así! ¿Alguien ha descubierto cómo cambiarlo sin usar una redirección .htaccess?
Estoy usando el siguiente archivo search.php: `
<div id="content" class="clearfix">
<div id="main" class="col700 left clearfix" role="main">
<h1 class="archive_title"><span>Resultados de búsqueda para:</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("Publicado", "bonestheme"); ?> <time datetime="<?php echo the_time('Y-m-j'); ?>" pubdate><?php the_time('F jS, Y'); ?></time> <?php _e("por", "bonestheme"); ?> <?php the_author_posts_link(); ?> <span class="amp">&</span> <?php _e("archivado en", "bonestheme"); ?> <?php the_category(', '); ?>.</p>
</header> <!-- fin del encabezado del artículo -->
<section class="post_content">
<?php the_excerpt('<span class="read-more">Leer más sobre "'.the_title('', '', false).'" »</span>'); ?>
</section> <!-- fin de la sección del artículo -->
<footer>
</footer> <!-- fin del pie del artículo -->
</article> <!-- fin del artículo -->
<?php endwhile; ?>
<?php if (function_exists('page_navi')) { // si la función experimental está activa ?>
<?php page_navi(); // usar la función de navegación de página ?>
<?php } else { // si está desactivada, mostrar enlaces wp prev & next regulares ?>
<nav class="wp-prev-next">
<ul class="clearfix">
<li class="prev-link"><?php next_posts_link(_e('« Entradas Anteriores', "bonestheme")) ?></li>
<li class="next-link"><?php previous_posts_link(_e('Entradas Nuevas »', "bonestheme")) ?></li>
</ul>
</nav>
<?php } ?>
<?php else : ?>
<!-- esta área aparece si no hay resultados -->
<article id="post-not-found">
<header>
<h1>No Se Encontraron Resultados</h1>
</header>
<section class="post_content">
<p>Lo sentimos, pero el recurso solicitado no fue encontrado en este sitio.</p>
</section>
<footer>
</footer>
</article>
<?php endif; ?>
</div> <!-- fin de #main -->
<div id="sidebar1" class="sidebar right col220">
<?php get_search_form(); ?>
</div>
</div> <!-- fin de #content -->
`

Aquí hay 3 formas de solucionar esto, te recomiendo usar la solución 2, pero presta atención al jQuery en la solución 1 como una forma de evitar la situación desde el principio.
Para aquellos que quieran más código publicado del tema del que hizo la pregunta, esto no es un problema del tema, es un problema general de WordPress que afecta a todos los sitios WordPress.
Solución 1
Puedes encontrar un tutorial detallado sobre cómo solucionar esto aquí:
http://wpengineer.com/2162/fix-empty-searches/
Hoy, veamos algo que la mayoría de los profesionales nunca ven: búsquedas vacías. Ofreces un campo de entrada de búsqueda, y alguien presiona el botón de enviar accidentalmente, sin ningún término ingresado. El resultado URI se ve así: ejemplo.com/?s=. Muestra el mismo contenido que tu página de inicio. De hecho, es la página de inicio.
Nadie necesita eso.
Solución 2 (recomendada)
Tomado de una publicación de Spitzerg http://wordpress.org/support/topic/blank-search-sends-you-to-the-homepage
Otra opción es agregar un filtro de solicitud:
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; }
Luego, si estás reutilizando la consulta de búsqueda en tu formulario de búsqueda, no olvides recortarla para que no termines con uno o más espacios (solo para mantener las cosas limpias, probablemente no afectará los resultados.
<input type="text" name="s" id="s" value="<?php echo trim( get_search_query() ); ?>"/>
Espero que esto ayude, parece estar funcionando hasta ahora en mi sitio y no implica cambiar ningún código de WP, lo que facilita las actualizaciones.
Solución 3
http://www.warpconduit.net/2011/08/02/fix-redirection-and-error-page-on-empty-wordpress-search/
Similar a la solución 2 pero no tan extensa y ligeramente diferente.
if(!is_admin()){
add_action('init', 'search_query_fix');
}
function search_query_fix(){
if(isset($_GET['s']) && $_GET['s']==''){
$_GET['s']=' ';
}
}

El problema con la solución 2 es que devolverá cada publicación (o al menos cada publicación con un espacio en ella) cuando en realidad no debería devolver ninguna publicación.

Tampoco soluciona domain.com/página/2

Basándose en la solución 2 de Tom pero asegurándose de que no se devuelvan publicaciones, agregue un filtro de solicitud como antes:
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;
}
Pero esta vez establezca una variable global para indicar que no se deben devolver resultados de búsqueda. Luego, usando un hook posts_where, asegúrese de que no se devuelvan publicaciones:
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;
}

Crea un archivo Search.php y pega este código, luego cambia tu loop por "get_template_part('loop', 'search');
<div id="container">
<div id="content" role="main">
<?php if ( have_posts() ) : ?>
<h1 class="page-title"><?php printf( __( 'Resultados de búsqueda para: %s', 'mb' ), '<span>' . get_search_query() . '</span>' ); ?></h1>
<?php
/* Ejecuta el loop para la búsqueda y muestra los resultados.
* Si deseas sobreescribir esto en un theme hijo, incluye un archivo
* llamado loop-search.php y ese será usado en su lugar.
*/
get_template_part( 'loop', 'search' );
?>
<?php else : ?>
<div id="post-0" class="post no-results not-found">
<h2 class="entry-title"><?php _e( 'No se encontraron resultados', 'mb' ); ?></h2>
<div class="entry-content">
<p><?php _e( 'Lo sentimos, pero no hubo coincidencias con tus criterios de búsqueda. Por favor intenta nuevamente con palabras clave diferentes.', 'twentyten' ); ?></p>
<?php get_search_form(); ?>
</div><!-- .entry-content -->
</div><!-- #post-0 -->
<?php endif; ?>
</div><!-- #content -->
</div><!-- #container -->
<?php get_sidebar(); ?>
<?php get_footer(); ?>

Verifica si la consulta de búsqueda está vacía ( get_search_query() ), simplemente reemplaza el primer IF por esto:
<?php if (have_posts() && get_search_query()) : while (have_posts()) : the_post(); ?>

Lo manejo en mis temas de la siguiente manera. Prueba usando este código:
<?php if (!have_posts()): ?>
<article id="post-0">
<header>
<h3>No se encontraron publicaciones.</h3>
</header> <!-- fin del encabezado del artículo -->
<section class="post_content">
Lo sentimos, encontramos 0 publicaciones para tu búsqueda. Por favor intenta buscar nuevamente.
</section> <!-- fin de la sección del artículo -->
<footer>
</footer> <!-- fin del pie del artículo -->
</article> <!-- fin del artículo -->
<?php endif; ?>
Estamos manejando la condición if(!have_posts()). Colócalo justo después de tu h3.archive title, antes de que empiece el if(have_posts). Incluso puedes llamar a la función del formulario de búsqueda en el área de contenido.

Yo también me enfrenté al mismo problema, es algo que WordPress trae por defecto.
Pero por suerte encontré algo que me ayudó.
Añade lo siguiente en "functions.php":
function SearchFilter($query) {
// Si la variable de solicitud 's' está configurada pero vacía
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');
Y luego reemplaza esta línea (línea número 15) en search.php:
<?php if ( have_posts() && strlen( trim(get_search_query()) ) != 0 ) : ?>
Quizás esto también te ayude.
Para más detalles, lee esto: Personalizar búsqueda vacía en WordPress

Una forma de evitar búsquedas vacías es realizar una verificación con JavaScript para comprobar si el campo de búsqueda está vacío y, si se encuentra vacío, detener el envío del formulario de búsqueda como se muestra a continuación:
$('#searchform').submit(function(){
search_value =$.trim($('#searchform #s').val());
if(search_value == ""){
return false; // También puedes mostrar una notificación aquí para informar al usuario.
}
});

No está claro cómo esto responde a la pregunta. ¿Podrías editar tu respuesta (usando el botón de edición de arriba) y agregar algunos detalles sobre lo que hace este código, dónde colocarlo y cómo resuelve el problema, por favor?
