Boş arama ana sayfayı döndürür, bulunamadı arama sayfasına nasıl dönülür?


16

Arama formu boşsa, varsayılan arama işlevi ana sayfayı döndürür, "aramanız hiçbir sonuç döndürmedi" sayfasını döndürmesini istiyorum.

bu yazı cevap vermiyor

ve bu bilet bana bu şekilde işlemesi gerektiğini söylüyor! Herkes bir .htaccess yönlendirmesi kullanmanın yanı sıra nasıl değiştirileceğini anladı mı?

Aşağıdaki search.php dosyasını kullanıyorum: `

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

'


kod gösterilsin mi?
kaiser

Ben bile (htaccess yanı sıra) bu adrese başlamak için nerede bilmiyorum, bu yüzden hiçbir kod. Herhangi bir yardım için teşekkür ederiz
Drai

searchform.php ve search.php kodunuz nasıl?
kaiser

Ben bir
search.php

2
Bu, temaya özel bir sorun değil, genel bir WordPress sorunu
Tom J Nowell

Yanıtlar:


18

İşte bunu düzeltmenin 3 yolu, çözüm 2'yi kullanmanızı öneririm, ancak ilk etapta durumdan kaçınmanın bir yolu olarak çözüm 1'deki jQuery'ye dikkat edin.

Soru soranları temasından daha fazla kod isteyenler için bu bir tema sorunu değil, bu tüm WordPress sitelerini etkileyen genel bir WordPress sorunudur.

Çözüm 1

Bu sorunu nasıl çözeceğiniz konusunda ayrıntılı bir eğitim bulabilirsiniz:

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

Bugün, çoğu profesyonelin hiç görmediği bir şeye bakalım: boş aramalar. Bir arama giriş alanı sunuyorsunuz ve birisi herhangi bir terim girmeden istemeden gönder düğmesine basıyor. Ortaya çıkan URI şöyle görünür: example.com/?s=. Ön sayfanızla aynı içeriği gösterir. Aslında, ön sayfa.

Kimsenin buna ihtiyacı yok.

Çözüm 2 (önerilir)

Spitzerg tarafından alınan froma yayını http://wordpress.org/support/topic/blank-search-sends-you-to-the-homepage

Başka bir seçenek de istek filtresi eklemektir:

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

Arama sorgunuzu arama formunuzda yeniden kullanıyorsanız, bir veya daha fazla boşluk elde etmemeniz için kırpmayı unutmayın (sadece işleri temiz tutmak için muhtemelen sonuçları etkilemez).

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

Umarım bu yardımcı olur, şimdiye kadar sitemde çalışıyor gibi görünüyor ve yükseltmeleri kolaylaştırmak için WP kodlarından herhangi birini değiştirmeyi içermiyor.

Çözüm 3

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

Çözelti 2'ye benzer ancak geniş ve biraz farklı değildir.

if(!is_admin()){
    add_action('init', 'search_query_fix');
    function search_query_fix(){
        if(isset($_GET['s']) && $_GET['s']==''){
            $_GET['s']=' ';
        }
    }
}

1
Çözüm 2 ile ilgili sorun, gerçekten hiçbir yazı döndürmemesi gerektiğinde her yazıyı (veya en azından içinde bir boşluk bulunan her yazıyı) döndürmesidir.
Felix Eve

2

Bir Sayfa Search.php oluşturun ve bu kodu yapıştırın ve döngünüzü "get_template_part ('loop', 'search') ile değiştirin;

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

2

Tom'un çözümü 2'yi temel alarak ancak hiçbir gönderinin döndürülmediğinden emin olmak için önceki gibi bir istek filtresi ekleyin:

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

Ancak bu kez, hiçbir arama sonucunun döndürülmemesi gerektiğini belirten bir global değişken belirledi. Sonra bir posts_where kancası kullanarak hiçbir gönderinin döndürülmediğinden emin olun:

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

1

Arama sorgusunun boş olup olmadığını kontrol edin ( get_search_query () ), ilk IF'yi bununla değiştirin:

<?php if (have_posts() && get_search_query()) : while (have_posts()) : the_post(); ?>

Bunun yeterince adil bir çözüm olduğunu düşünüyorum. Basit ve temiz. Kodu zorlaştırabilecek özel filtreler ve işlemler yok
Kamil

0

Temalarımda şu şekilde ele alıyorum. Bu kodu kullanmayı deneyin:

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

İf (! Have_posts ()) koşulunu yerine getiriyoruz. H3.archive başlığınızdan hemen sonra (have_posts) başlamadan önce koyun. İçerik alanındaki arama formu işlevini bile çağırabilirsiniz.


0

Aynı problemle de karşılaştım, varsayılan olarak wordpress tarafından verildi.

ama neyse ki bana yardımcı olacak bir şey buldum.

"Functions.php" dosyasına aşağıdan ekleyin

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

ve sonra search.php dosyasının altındaki satırı (satır no 15) değiştirin

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

Sana da yardımcı olabilir mi

Ayrıntılar için şunu okuyun: Boş arama wordpressini özelleştirin


0

Boş aramayı önlemenin bir yolu, arama alanının boş değeri için javascript kontrolü yapmaktır ve alan boşsa aşağıdaki gibi arama formunu göndermeyi durdurun:

$('#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.
            }

});

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.