La recherche vide renvoie la page d'accueil, comment retourner la page de recherche introuvable?

16

La fonction de recherche par défaut si le formulaire de recherche est vide renvoie la page d'accueil, je veux qu'elle renvoie une page "désolé votre recherche n'a renvoyé aucun résultat".

ce post n'y répond pas

et ce ticket me dit qu'il est censé fonctionner de cette façon! Quelqu'un sait comment le changer en plus d'utiliser une redirection .htaccess?

J'utilise le fichier search.php suivant: `

        <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
la source
montrer du code?
kaiser
Je ne sais même pas par où commencer pour résoudre ce problème (à part le htaccess), donc pas de code. Toute aide est appréciée
Drai
que diriez-vous de votre code searchform.php et search.php?
kaiser du
J'utilise le thème des os qui a un search.php mais utilise le formulaire de recherche principal
Drai
2
Il s'agit d'un problème WordPress général et non d'un thème spécifique
Tom J Nowell

Réponses:

18

Voici 3 façons de résoudre ce problème, je vous conseille d'utiliser la solution 2, mais faites attention à la jQuery dans la solution 1 comme un moyen d'éviter la situation en premier lieu.

Pour ceux qui veulent plus de code publié à partir du thème des demandeurs, ce n'est pas un problème de thème, c'est un problème général de WordPress qui affecte tous les sites WordPress.

Solution 1

Vous pouvez trouver un didacticiel détaillé sur la façon de résoudre ce problème ici:

http://wpengineer.com/2162/fix-empty-searches/

Aujourd'hui, regardons quelque chose que la plupart des professionnels ne voient jamais: les recherches vides. Vous proposez un champ de saisie de recherche et quelqu'un clique sur le bouton Soumettre sans le vouloir, sans aucun terme saisi. L'URI résultant ressemble à ceci: example.com/?s=. Il affiche le même contenu que votre page d'accueil. En fait, c'est la première page.

Personne n'en a besoin.

Solution 2 (recommandée)

Extrait d'un article de Spitzerg http://wordpress.org/support/topic/blank-search-sends-you-to-the-homepage

Une autre option consiste à ajouter un filtre de requête:

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

Ensuite, si vous réutilisez la requête de recherche dans votre formulaire de recherche, n'oubliez pas de la couper afin de ne pas vous retrouver avec un ou plusieurs espaces (juste pour garder les choses propres, cela n'affectera probablement pas les résultats.

<input type="text" name="s" id="s" value="<?php echo trim( get_search_query() ); ?>"/>

J'espère que cela aide, cela semble fonctionner jusqu'à présent sur mon site et n'implique pas de changer le code WP, ce qui facilite les mises à niveau.

Solution 3

http://www.warpconduit.net/2011/08/02/fix-redirection-and-error-page-on-empty-wordpress-search/

Similaire à la solution 2 mais pas aussi vaste et légèrement différent.

if(!is_admin()){
    add_action('init', 'search_query_fix');
    function search_query_fix(){
        if(isset($_GET['s']) && $_GET['s']==''){
            $_GET['s']=' ';
        }
    }
}
Tom J Nowell
la source
1
Le problème avec la solution 2 est qu'elle retournera chaque publication (ou au moins chaque publication avec un espace) alors qu'en réalité, elle ne devrait renvoyer aucune publication.
Felix Eve du
2

Créez un Page Search.php et collez ce code et changez votre boucle avec "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
la source
2

En s'appuyant sur la solution 2 de Tom mais en vous assurant qu'aucun message n'est renvoyé, ajoutez un filtre de demande comme précédemment:

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

Mais cette fois, définissez une variable globale pour dire qu'aucun résultat de recherche ne doit être renvoyé. Ensuite, en utilisant un hook posts_where, assurez-vous qu'aucun message n'est renvoyé:

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;
}
Felix Eve
la source
1

Vérifiez si la requête de recherche est vide ( get_search_query () ), remplacez simplement le premier IF par celui-ci:

<?php if (have_posts() && get_search_query()) : while (have_posts()) : the_post(); ?>
user3537506
la source
Je pense que c'est une solution assez juste. Simple et propre. Pas de filtres spéciaux et d'actions pouvant compliquer le code
Kamil
0

Je le gère dans mes thèmes comme suit. Essayez d'utiliser ce code:

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

Nous gérons la condition if (! Have_posts ()). Mettez-le juste après votre titre h3.archive, avant si (have_posts) commence. Vous pouvez même appeler la fonction de formulaire de recherche dans la zone de contenu.

Rutwick Gangurde
la source
0

J'ai également fait face au même problème, c'est par défaut donné par wordpress.

mais heureusement, j'ai trouvé quelque chose qui m'a aidé.

Ajouter ci-dessous dans "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');

puis remplacez sous la ligne (ligne n ° 15) dans search.php

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

Peut-être que cela vous aidera aussi

Pour plus de détails, lisez ceci: Personnaliser la recherche vide wordpress

Jack
la source
0

Une façon d'éviter la recherche vide consiste à effectuer une vérification javascript pour la valeur vide du champ de recherche et si le champ trouvé est vide, alors arrêtez de soumettre le formulaire de recherche comme ci-dessous:

$('#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
la source
0
# Catch empty searches
RewriteCond %{QUERY_STRING} ^s=$
RewriteRule ^ /? [L,R=301]
Lasse Enggaard
la source
On ne sait pas comment cela répond à la question. Pourriez-vous modifier votre réponse (en utilisant le bouton Modifier ci-dessus) et ajouter des détails sur ce que fait ce code, où le mettre et comment il résout le problème, s'il vous plaît?
Howdy_McGee