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

13

La función de búsqueda predeterminada, si el formulario de búsqueda está vacío, devuelve la página de inicio. Quiero que devuelva una página de "Lo siento, tu búsqueda no produjo resultados".

esta publicación no responde

y este ticket me dice que se supone que funciona de esa manera. ¿Alguien descubrió cómo cambiarlo además de usar un redireccionamiento .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>Search Results for:</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("Posted", "bonestheme"); ?> <time datetime="<?php echo the_time('Y-m-j'); ?>" pubdate><?php the_time('F jS, Y'); ?></time> <?php _e("by", "bonestheme"); ?> <?php the_author_posts_link(); ?> <span class="amp">&</span> <?php _e("filed under", "bonestheme"); ?> <?php the_category(', '); ?>.</p>

                    </header> <!-- end article header -->

                    <section class="post_content">
                        <?php the_excerpt('<span class="read-more">Read more on "'.the_title('', '', false).'" &raquo;</span>'); ?>

                    </section> <!-- end article section -->

                    <footer>


                    </footer> <!-- end article footer -->

                </article> <!-- end article -->

                <?php endwhile; ?>  

                <?php if (function_exists('page_navi')) { // if expirimental feature is active ?>

                    <?php page_navi(); // use the page navi function ?>

                <?php } else { // if it is disabled, display regular wp prev & next links ?>
                    <nav class="wp-prev-next">
                        <ul class="clearfix">
                            <li class="prev-link"><?php next_posts_link(_e('&laquo; Older Entries', "bonestheme")) ?></li>
                            <li class="next-link"><?php previous_posts_link(_e('Newer Entries &raquo;', "bonestheme")) ?></li>
                        </ul>
                    </nav>
                <?php } ?>          

                <?php else : ?>

                <!-- this area shows up if there are no results -->

                <article id="post-not-found">
                    <header>
                        <h1>No Results Found</h1>
                    </header>
                    <section class="post_content">
                        <p>Sorry, but the requested resource was not found on this site.</p>
                    </section>
                    <footer>
                    </footer>
                </article>

                <?php endif; ?>

            </div> <!-- end #main -->

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

                <?php get_search_form(); ?>



            </div>

        </div> <!-- end #content -->

'

    
pregunta Drai 26.09.2011 - 17:14

8 respuestas

16

Aquí hay 3 formas de solucionar esto. Le aconsejo que use la solución 2, pero preste atención a jQuery en la solución 1 como una forma de evitar la situación en primer lugar.

Para aquellos que desean más código publicado desde el tema de los que hacen las preguntas, este no es un tema, es un problema general de WordPress que afecta a todos los sitios de WordPress.

Solución 1

Puede encontrar un tutorial detallado sobre cómo solucionar este problema aquí:

enlace

  

Hoy, veamos algo que la mayoría de los profesionales nunca ven:   Búsquedas vacías. Usted ofrece un campo de entrada de búsqueda, y alguien golpea el   Botón de enviar involuntariamente, sin ningún término introducido. La resultante   El URI se ve así: example.com/?s=. Muestra el mismo contenido que   tu portada De hecho, es la primera página.

     

Nadie necesita eso.

Solución 2 (recomendado)

Tomado de una publicación de Spitzerg enlace

  

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

Entonces, si está reutilizando la consulta de búsqueda en su formulario de búsqueda, no lo haga.   olvide recortarlo para no terminar 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 ninguno de los códigos WP para facilitar las actualizaciones.

Solución 3

enlace

Similar a la solución 2 pero no tan extenso y ligeramente diferente.

if(!is_admin()){
    add_action('init', 'search_query_fix');
    function search_query_fix(){
        if(isset($_GET['s']) && $_GET['s']==''){
            $_GET['s']=' ';
        }
    }
}
    
respondido por el Tom J Nowell 28.10.2011 - 16:05
2

Crea un Page Search.php y pega este código y cambia tu bucle con "get_template_part ('loop', 'search');                 

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

            <?php if ( have_posts() ) : ?>
                            <h1 class="page-title"><?php printf( __( 'Search Results for: %s', 'mb' ), '<span>' . get_search_query() . '</span>' ); ?></h1>
                            <?php
                            /* Run the loop for the search to output the results.
                             * If you want to overload this in a child theme then include a file
                             * called loop-search.php and that will be used instead.
                             */
                             get_template_part( 'loop', 'search' );
                            ?>
            <?php else : ?>
                            <div id="post-0" class="post no-results not-found">
                                <h2 class="entry-title"><?php _e( 'Nothing Found', 'mb' ); ?></h2>
                                <div class="entry-content">
                                    <p><?php _e( 'Sorry, but nothing matched your search criteria. Please try again with some different keywords.', 'twentyten' ); ?></p>
                                    <?php get_search_form(); ?>
                                </div><!-- .entry-content -->
                            </div><!-- #post-0 -->
            <?php endif; ?>
                        </div><!-- #content -->
                    </div><!-- #container -->

            <?php get_sidebar(); ?>
            <?php get_footer(); ?>
    
respondido por el Mohit Bumb 27.09.2011 - 07:54
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 configure una variable global para indicar que no se deben devolver los resultados de la búsqueda. Luego, utilizando un gancho 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;
}
    
respondido por el Felix Eve 02.09.2014 - 07:28
0

Lo manejo en mis temas de la siguiente manera. Intenta usar este código:

<?php if (!have_posts()): ?>
    <article id="post-0">
        <header>
            <h3>No posts found.</h3>
        </header> <!-- end article header -->

        <section class="post_content">
           Sorry, we found 0 posts for your search, Please try searching again.
        </section> <!-- end article section -->

        <footer>
        </footer> <!-- end article footer -->

    </article> <!-- end article -->
<?php endif; ?>

Estamos manejando la condición if (! have_posts ()). Colóquelo justo después de su título h3.archivo, antes de que comience (have_posts). Incluso puede llamar a la función de formulario de búsqueda en el área de contenido.

    
respondido por el Rutwick Gangurde 27.09.2011 - 05:51
0

También enfrenté el mismo problema, es un valor predeterminado dado por wordpress.

pero afortunadamente encontré algo que me ayudó.

Agregue más abajo en "Functions.php"

 function SearchFilter($query) {
    // If 's' request variable is set but empty
    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 reemplace la línea inferior (línea no 15) en search.php

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

Puede ser que también te ayude

Para más información, lea esto: Personalizar búsqueda vacía wordpress

    
respondido por el Jack 03.08.2013 - 07:55
0

Una forma de evitar la búsqueda vacía es realizar una comprobación de javascript para el valor vacío del campo de búsqueda y, si se encuentra vacío, dejar de enviar el formulario de búsqueda como se muestra a continuación:

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

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

            if(search_value == ""){

                return false; // You can also pop a notification here to inform to user.
            }

});
    
respondido por el Vishal Patel 08.05.2015 - 10:23
0

Comprueba si la consulta de búsqueda está vacía ( get_search_query () ), simplemente reemplaza el primer SI por eso:

<?php if (have_posts() && get_search_query()) : while (have_posts()) : the_post(); ?>
    
respondido por el user3537506 06.08.2015 - 15:04
0
# Catch empty searches
RewriteCond %{QUERY_STRING} ^s=$
RewriteRule ^ /? [L,R=301]
    
respondido por el Lasse Enggaard 28.02.2017 - 21:07

Lea otras preguntas en las etiquetas