Puste wyszukiwanie zwraca stronę główną, jak zwrócić nie znalezioną stronę wyszukiwania?

16

Domyślna funkcja wyszukiwania, jeśli formularz wyszukiwania jest pusty, zwraca stronę główną. Chcę, aby zwróciła stronę „przepraszam, że wyszukiwanie nie zwróciło wyników”.

ten post nie odpowiada

a ten bilet mówi mi, że ma tak działać! Ktoś wymyślił, jak to zmienić, oprócz przekierowania .htaccess?

Korzystam z następującego pliku 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
źródło
pokazać jakiś kod?
kaiser
Nie wiem nawet od czego zacząć (oprócz htaccess), więc nie ma kodu. Każda pomoc jest mile
widziana
co powiesz na kod searchform.php i search.php?
kaiser
Korzystam z motywu kości, który ma search.php, ale używa podstawowego formularza wyszukiwania
Drai
2
To jest ogólny problem WordPress, a nie temat specyficzny dla tematu
Tom J Nowell

Odpowiedzi:

18

Oto 3 sposoby rozwiązania tego problemu, radzę użyć rozwiązania 2, ale zwróć uwagę na jQuery w rozwiązaniu 1 jako sposób na uniknięcie sytuacji.

Dla tych, którzy chcą więcej kodu opublikowanego z motywu pytającego, nie jest to problem motywu, jest to ogólny problem WordPress, który wpływa na wszystkie witryny WordPress.

Rozwiązanie 1

Szczegółowy samouczek, jak to naprawić, znajdziesz tutaj:

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

Dzisiaj spójrzmy na coś, czego większość profesjonalistów nigdy nie widzi: puste wyszukiwania. Udostępniasz pole wprowadzania wyszukiwania, a ktoś przypadkowo naciska przycisk wysyłania, bez wpisywania terminu. Wynikowy identyfikator URI wygląda następująco: example.com/?s=. Pokazuje tę samą treść, co strona główna. W rzeczywistości jest to pierwsza strona.

Nikt tego nie potrzebuje.

Rozwiązanie 2 (zalecane)

Zaczerpnięte z postu Spitzerg http://wordpress.org/support/topic/blank-search-sends-you-to-the-homepage

Inną opcją jest dodanie filtru żądania:

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

Następnie, jeśli ponownie używasz zapytania w formularzu wyszukiwania, nie zapomnij go przyciąć, aby nie powstało jedno lub więcej spacji (tylko dla zachowania czystości, prawdopodobnie nie wpłynie to na wyniki.

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

Mam nadzieję, że to pomaga, wydaje się, że działa ono do tej pory na mojej stronie i nie wymaga zmiany żadnego kodu WP, co ułatwia aktualizację.

Rozwiązanie 3

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

Podobne do rozwiązania 2, ale nie tak rozbudowane i nieco inne.

if(!is_admin()){
    add_action('init', 'search_query_fix');
    function search_query_fix(){
        if(isset($_GET['s']) && $_GET['s']==''){
            $_GET['s']=' ';
        }
    }
}
Tom J Nowell
źródło
1
Problem z rozwiązaniem 2 polega na tym, że zwróci każdy post (lub przynajmniej każdy post ze spacją), kiedy tak naprawdę nie powinien zwracać żadnych postów.
Felix Eve
2

Utwórz stronę Search.php i wklej ten kod i zmień swoją pętlę za pomocą „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
źródło
2

Opierając się na rozwiązaniu Toma 2, ale upewniając się, że żadne posty nie są zwracane, dodaj filtr żądań jak poprzednio:

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

Ale tym razem ustaw zmienną globalną, aby powiedzieć, że nie należy zwracać wyników wyszukiwania. Następnie za pomocą haka posts_where upewnij się, że nie są zwracane żadne posty:

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
źródło
1

Sprawdź, czy wyszukiwane zapytanie jest puste ( get_search_query () ), po prostu zastąp pierwszy JEŻELI:

<?php if (have_posts() && get_search_query()) : while (have_posts()) : the_post(); ?>
użytkownik3537506
źródło
Myślę, że to wystarczające rozwiązanie. Prosty i czysty. Brak specjalnych filtrów i działań, które mogłyby skomplikować kod
Kamil
0

Obsługuję to w moich motywach w następujący sposób. Spróbuj użyć tego kodu:

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

Obsługujemy warunek if (! Have_posts ()). Umieść go zaraz po tytule h3.archive, zanim rozpocznie się if (have_posts). Możesz nawet wywołać funkcję formularza wyszukiwania w obszarze zawartości.

Rutwick Gangurde
źródło
0

Napotkałem również ten sam problem, domyślnie podany przez wordpress.

ale na szczęście znalazłem coś, co mi pomogło.

Dodaj poniżej w „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');

a następnie zamień poniżej linii (linia nr 15) w search.php

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

Może ci to też pomoże

Aby uzyskać szczegółowe informacje, przeczytaj: Dostosuj puste wyszukiwane słowo

Jacek
źródło
0

Jednym ze sposobów uniknięcia pustego wyszukiwania jest sprawdzenie javascript pod kątem pustej wartości pola wyszukiwania, a jeśli znalezione pole jest puste, przestań przesyłać formularz wyszukiwania, jak poniżej:

$('#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
źródło
0
# Catch empty searches
RewriteCond %{QUERY_STRING} ^s=$
RewriteRule ^ /? [L,R=301]
Lasse Enggaard
źródło
Nie jest jasne, jak to odpowiada na pytanie. Czy możesz edytować swoją odpowiedź (za pomocą przycisku edycji powyżej) i dodać trochę szczegółów na temat tego, co robi ten kod, gdzie go umieścić i jak rozwiązuje problem?
Howdy_McGee