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

16

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, su búsqueda no devolvió resultados".

esta publicación no responde

y este boleto me dice que se supone que funciona de esa manera! ¿Alguien descubre 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 -->

``

Drai
fuente
mostrar algún código?
kaiser
Ni siquiera sé por dónde empezar a abordar esto (además del htaccess), así que no hay código. Cualquier ayuda es apreciada
Drai
¿Qué tal su código searchform.php y search.php?
kaiser
Estoy usando el tema Huesos que tiene un search.php pero usa la forma de búsqueda principal
Drai
2
Este es un problema general de WordPress, no un tema específico
Tom J Nowell

Respuestas:

18

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 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 en profundidad 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. Ofrece un campo de entrada de búsqueda y alguien presiona el botón de envío sin querer, sin ingresar ningún término. El URI resultante se ve así: example.com/?s=. Muestra el mismo contenido que su página principal. De hecho, es la portada.

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á reutilizando la consulta de búsqueda en su formulario de búsqueda, no olvide recortarla para que no termine 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

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']=' ';
        }
    }
}
Tom J Nowell
fuente
1
El problema con la solución 2 es que devolverá cada publicación (o al menos cada publicación con un espacio) cuando realmente no debería devolver ninguna publicación.
Felix Eve
2

Crea una página Search.php y pega este código y cambia tu ciclo 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(); ?>
Mohit Bumb
fuente
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 decir que no se deben devolver resultados de 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;
}
Víspera de felix
fuente
1

Compruebe si la consulta de búsqueda está vacía ( get_search_query () ), simplemente reemplace el primer IF por eso:

<?php if (have_posts() && get_search_query()) : while (have_posts()) : the_post(); ?>
usuario3537506
fuente
Creo que esta es una solución bastante justa. Simple y limpio. No hay filtros especiales y acciones que puedan complicar el código
Kamil
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 ()). Póngalo justo después de su título h3.archive, antes de que comience (have_posts). Incluso puede llamar a la función de formulario de búsqueda en el área de contenido.

Rutwick Gangurde
fuente
0

También me enfrenté al mismo problema, es por defecto dado por WordPress.

pero por suerte encontré algo que me ayudó.

Agregue a continuación 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 de abajo (línea no 15) en search.php

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

Podría ser que también te ayudará

Para más detalles, lea esto: Personalice la búsqueda vacía de WordPress

Jack
fuente
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 el campo se encuentra vacío, deje 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.
            }

});
Vishal Patel
fuente
0
# Catch empty searches
RewriteCond %{QUERY_STRING} ^s=$
RewriteRule ^ /? [L,R=301]
Lasse Enggaard
fuente
No está claro cómo esto responde la pregunta. ¿Podría editar su respuesta (usando el botón de edición anterior) y agregar algunos detalles sobre lo que hace este código, dónde colocarlo y cómo resuelve el problema, por favor?
Howdy_McGee