La búsqueda vacía devuelve la página de inicio, ¿cómo devolver una página de búsqueda no encontrada?

26 sept 2011, 18:14:14
Vistas: 33.6K
Votos: 16

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).'" &raquo;</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('&laquo; Entradas Anteriores', "bonestheme")) ?></li>
                            <li class="next-link"><?php previous_posts_link(_e('Entradas Nuevas &raquo;', "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 -->

`

9
Comentarios

¿mostrar algo de código?

kaiser kaiser
26 sept 2011 18:18:31

Ni siquiera sé por dónde empezar para abordar esto (además del htaccess), así que no tengo código. Cualquier ayuda es apreciada

Drai Drai
26 sept 2011 19:10:20

¿qué tal el código de tu searchform.php y search.php?

kaiser kaiser
26 sept 2011 20:00:28

Estoy usando el tema Bones que tiene un search.php pero utiliza el searchform predeterminado del núcleo

Drai Drai
26 sept 2011 21:44:54

Ups, es el tema Roots

Drai Drai
30 sept 2011 04:22:19

¿enlace? (marcador de posición)

kaiser kaiser
30 sept 2011 12:02:09

@Drai, ¿lo has resuelto? Tengo el mismo problema. ¡Gracias!

dashaluna dashaluna
20 oct 2011 16:10:34

Aquí está el enlace al tema roots que estoy usando https://github.com/retlehs/roots

Drai Drai
25 oct 2011 00:52:41

Este es un problema general de WordPress, no un problema específico del tema

Tom J Nowell Tom J Nowell
28 oct 2011 17:07:17
Mostrar los 4 comentarios restantes
Todas las respuestas a la pregunta 8
3
18

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']=' ';
        }
    }
28 oct 2011 17:05:30
Comentarios

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.

Felix Eve Felix Eve
2 sept 2014 08:10:48

Tampoco soluciona domain.com/página/2

fdrv fdrv
20 may 2020 08:49:02

El espacio es solo lo que usé como marcador de posición, podrías considerar usar algo que sepas que nunca aparecerá en tu contenido en su lugar, pero no se me ocurrió algo adecuado en ese momento. Además, hay más de una solución

Tom J Nowell Tom J Nowell
20 may 2020 21:44:31
1

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;
}
2 sept 2014 08:28:24
Comentarios

Muchas gracias por el fragmento de código. Me estaba volviendo loco que devolviera todas las publicaciones cuando no se buscaba nada.

Michael Rogers Michael Rogers
28 dic 2021 17:44:46
0

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(); ?>
27 sept 2011 08:54:19
1

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(); ?>
6 ago 2015 16:04:49
Comentarios

Creo que esta es una solución bastante justa. Simple y limpia. Sin filtros ni acciones especiales que puedan complicar el código

Kamil Kamil
24 sept 2019 17:23:57
0

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.

27 sept 2011 06:45:06
0

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

3 ago 2013 08:55:06
0

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.
            }

});
8 may 2015 11:23:58
1
# Capturar búsquedas vacías
RewriteCond %{QUERY_STRING} ^s=$
RewriteRule ^ /? [L,R=301]
28 feb 2017 22:07:54
Comentarios

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?

Howdy_McGee Howdy_McGee
28 feb 2017 22:29:19