Leere Suche gibt Startseite zurück, wie man nicht gefundene Suchseite zurückgibt?

16

Wenn das Suchformular leer ist, gibt die Standardsuchfunktion die Startseite zurück. Ich möchte, dass die Seite "Entschuldigung, Ihre Suche ergab keine Ergebnisse" angezeigt wird.

Dieser Beitrag beantwortet es nicht

und dieses ticket sagt mir, dass es so funktionieren soll! Weiß jemand, wie man es ändert, außer mit einer .htaccess-Umleitung?

Ich benutze die folgende search.php-Datei: `

        <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
quelle
Code anzeigen?
Kaiser
Ich weiß nicht einmal, wo ich damit anfangen soll (außer dem htaccess), also kein Code. Jede Hilfe wird
gebeten
Wie wäre es mit Ihrem searchform.php- und search.php-Code?
Kaiser
Ich verwende das Bones-Thema, das eine search.php hat, aber die Kernsuchform verwendet
Drai
2
Dies ist eine allgemeine WordPress-Ausgabe, keine themenspezifische Ausgabe
Tom J Nowell

Antworten:

18

Hier sind 3 Möglichkeiten, dies zu beheben. Ich rate Ihnen, Lösung 2 zu verwenden, aber achten Sie auf die jQuery in Lösung 1, um die Situation an erster Stelle zu vermeiden.

Für diejenigen, die mehr Code aus dem Thema "Fragesteller" haben möchten, ist dies kein Thema. Dies ist ein allgemeines WordPress-Problem, das alle WordPress-Sites betrifft.

Lösung 1

Hier finden Sie ein ausführliches Tutorial, wie Sie dieses Problem beheben können:

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

Schauen wir uns heute etwas an, was die meisten Profis nie sehen: leere Suchen. Sie bieten ein Sucheingabefeld an, und jemand drückt unbeabsichtigt auf die Senden-Schaltfläche, ohne dass ein Begriff eingegeben wird. Der resultierende URI sieht folgendermaßen aus: example.com/?s=. Es zeigt den gleichen Inhalt wie Ihre Startseite. In der Tat ist es die Titelseite.

Das braucht niemand.

Lösung 2 (empfohlen)

Entnommen aus einem Beitrag von Spitzerg http://wordpress.org/support/topic/blank-search-sends-you-to-the-homepage

Eine andere Option ist das Hinzufügen eines Anforderungsfilters:

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

Wenn Sie die Suchanfrage in Ihrem Suchformular wiederverwenden, vergessen Sie nicht, sie zu kürzen, damit Sie nicht mit einem oder mehreren Leerzeichen enden (nur um die Sache sauber zu halten, hat dies wahrscheinlich keine Auswirkungen auf die Ergebnisse.

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

Hoffe, das hilft, es scheint so weit auf meiner Website zu funktionieren und beinhaltet keine Änderung des WP-Codes, um Upgrades zu vereinfachen.

Lösung 3

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

Ähnlich wie Lösung 2, aber nicht so umfangreich und leicht unterschiedlich.

if(!is_admin()){
    add_action('init', 'search_query_fix');
    function search_query_fix(){
        if(isset($_GET['s']) && $_GET['s']==''){
            $_GET['s']=' ';
        }
    }
}
Tom J Nowell
quelle
1
Das Problem mit Lösung 2 besteht darin, dass jeder Beitrag (oder zumindest jeder Beitrag mit einem Leerzeichen) zurückgegeben wird, wenn tatsächlich überhaupt keine Beiträge zurückgegeben werden sollen.
Felix Eve
2

Erstellen Sie eine Page Search.php und fügen Sie diesen Code ein und ändern Sie Ihre Schleife mit "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
quelle
2

Aufbauend auf Toms Lösung 2, aber um sicherzustellen, dass keine Posts zurückgegeben werden, fügen Sie wie zuvor einen Anforderungsfilter hinzu:

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

Setzen Sie diesmal eine globale Variable, um anzugeben, dass keine Suchergebnisse zurückgegeben werden sollen. Verwenden Sie dann einen posts_where-Hook, um sicherzustellen, dass keine Posts zurückgegeben werden:

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
quelle
1

Überprüfen Sie, ob die Suchabfrage leer ist ( get_search_query () ). Ersetzen Sie einfach die erste IF durch diese:

<?php if (have_posts() && get_search_query()) : while (have_posts()) : the_post(); ?>
user3537506
quelle
Ich denke, das ist eine faire Lösung. Einfach und sauber. Keine speziellen Filter und Aktionen, die Code erschweren können
Kamil
0

Ich gehe damit in meinen Themen wie folgt um. Versuchen Sie es mit diesem 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; ?>

Wir behandeln die if (! Have_posts ()) Bedingung. Schreibe es gleich nach deinem h3.archive-Titel, bevor if (have_posts) startet. Sie können sogar die Suchformularfunktion im Inhaltsbereich aufrufen.

Rutwick Gangurde
quelle
0

Ich hatte auch das gleiche Problem, es wird standardmäßig von WordPress gegeben.

aber zum glück habe ich etwas gefunden, das mir geholfen hat.

Füge unten in "Functions.php" hinzu

 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');

und dann in search.php unter zeile (zeile nr 15) ersetzen

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

Vielleicht hilft es Ihnen auch

Für Details lesen Sie bitte folgendes : Passen Sie leere Suchwörter an

Jack
quelle
0

Eine Möglichkeit, eine leere Suche zu vermeiden, besteht darin, Javascript auf leere Werte des Suchfelds zu überprüfen. Wenn das gefundene Feld leer ist, hören Sie auf, das folgende Suchformular zu senden:

$('#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
quelle
0
# Catch empty searches
RewriteCond %{QUERY_STRING} ^s=$
RewriteRule ^ /? [L,R=301]
Lasse Enggaard
quelle
Es ist unklar, wie dies die Frage beantwortet. Könnten Sie Ihre Antwort (mit der Schaltfläche "Bearbeiten" oben) bearbeiten und einige Details dazu hinzufügen, was dieser Code bewirkt, wo und wie er das Problem löst?
Howdy_McGee