การค้นหาที่ว่างเปล่าส่งคืนโฮมเพจ, วิธีการส่งคืนหน้าการค้นหาไม่พบ?


16

ฟังก์ชั่นการค้นหาเริ่มต้นหากแบบฟอร์มการค้นหาว่างเปล่าส่งคืนโฮมเพจฉันต้องการให้ส่งคืนหน้า "ขออภัยที่การค้นหาของคุณไม่มีผลลัพธ์"

โพสต์นี้ไม่ตอบ

และตั๋วนี้บอกฉันว่ามันควรจะทำหน้าที่อย่างนั้น! ทุกคนทราบวิธีการเปลี่ยนนอกเหนือจากการใช้การเปลี่ยนเส้นทาง. htaccess

ฉันใช้ไฟล์ 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 -->

`


แสดงรหัส?
ไกเซอร์

ฉันไม่รู้ด้วยซ้ำว่าจะเริ่มจัดการกับเรื่องนี้ได้ที่ไหน (นอกเหนือจาก htaccess) ดังนั้นจึงไม่มีรหัส ความช่วยเหลือใด ๆ ที่ชื่นชม
Drai

แล้ว searchform.php และโค้ด search.php ของคุณล่ะ?
ไกเซอร์

ฉันกำลังใช้ชุดรูปแบบกระดูกซึ่งมี search.php แต่ใช้ searchform หลัก
Drai

2
นี่เป็นปัญหา WordPress ทั่วไปไม่ใช่ปัญหาเฉพาะของธีม
Tom J Nowell

คำตอบ:


18

ต่อไปนี้เป็นวิธีการแก้ไข 3 วิธีฉันขอแนะนำให้คุณใช้โซลูชัน 2 แต่ให้ความสนใจกับ jQuery ในโซลูชันที่ 1 เพื่อหลีกเลี่ยงสถานการณ์ในตอนแรก

สำหรับผู้ที่ต้องการรหัสเพิ่มเติมที่โพสต์จากชุดคำถามผู้ถามนี่ไม่ใช่ปัญหาของชุดรูปแบบนี่เป็นปัญหา WordPress ทั่วไปที่มีผลกับไซต์ WordPress ทั้งหมด

โซลูชันที่ 1

คุณสามารถดูบทช่วยสอนเชิงลึกเกี่ยวกับวิธีการแก้ไขได้ที่นี่:

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

วันนี้เรามาดูสิ่งที่มืออาชีพส่วนใหญ่ไม่เคยเห็น: การค้นหาที่ว่างเปล่า คุณเสนอช่องป้อนข้อมูลการค้นหาและมีคนกดปุ่มส่งโดยไม่ได้ตั้งใจโดยไม่ต้องป้อนคำใด ๆ URI ที่ได้จะเป็นดังนี้: example.com/?s= มันแสดงเนื้อหาเดียวกันกับหน้าแรกของคุณ ในความเป็นจริงมันเป็นหน้าแรก

ไม่มีใครต้องการสิ่งนั้น

โซลูชัน 2 (แนะนำ)

นำมาจากโพสต์โดย Spitzerg http://wordpress.org/support/topic/blank-search-sends-you-to-the-homepage

ตัวเลือกอื่นคือการเพิ่มตัวกรองคำขอ:

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

จากนั้นถ้าคุณใช้คำค้นหาในแบบฟอร์มการค้นหาอย่าลืมที่จะตัดมันดังนั้นคุณจะไม่ต้องจบด้วยช่องว่างหนึ่งช่องหรือมากกว่านั้น (เพียงเพื่อรักษาสิ่งต่าง ๆ ให้สะอาดอาจไม่มีผลต่อผลลัพธ์

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

หวังว่านี่จะช่วยได้ดูเหมือนว่าจะใช้งานได้แล้วในไซต์ของฉันและไม่เกี่ยวข้องกับการเปลี่ยนรหัส WP ใด ๆ ทำให้การอัพเกรดง่ายขึ้น

โซลูชัน 3

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

คล้ายกับโซลูชัน 2 แต่ไม่ครอบคลุมและแตกต่างกันเล็กน้อย

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

1
ปัญหาของโซลูชันที่ 2 คือมันจะส่งคืนทุกโพสต์ (หรืออย่างน้อยทุกโพสต์ที่มีช่องว่าง) เมื่อจริง ๆ แล้วมันไม่ควรส่งคืนโพสต์เลย
เฟลิกซ์อีฟ

2

สร้าง Page Search.php และวางรหัสนี้และเปลี่ยนลูปของคุณด้วย "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(); ?>

2

การสร้างโซลูชันของ Tom 2 แต่ต้องแน่ใจว่าไม่มีการส่งคืนโพสต์ใด ๆ ให้เพิ่มตัวกรองคำขอก่อนหน้านี้:

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

แต่เวลานี้ตั้งค่าตัวแปรส่วนกลางเพื่อบอกว่าไม่ควรส่งคืนผลลัพธ์การค้นหา จากนั้นใช้ตะขอ posts_where ตรวจสอบให้แน่ใจว่าไม่มีการส่งคืนโพสต์:

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

ตรวจสอบว่าการสืบค้นว่างเปล่า ( get_search_query () ) เพียงแค่แทนที่ IF แรกด้วยการทำเช่นนั้น:

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

ฉันคิดว่านี่เป็นทางออกที่ยุติธรรมพอ เรียบง่ายและสะอาด ไม่มีตัวกรองและการกระทำพิเศษที่สามารถทำให้โค้ดซับซ้อน
Kamil

0

ฉันจัดการมันในธีมของฉันดังนี้ ลองใช้รหัสนี้:

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

เรากำลังจัดการกับเงื่อนไข if (! have_posts ()) วางไว้ด้านหลังชื่อ h3.archive ของคุณก่อนถ้า (have_posts) เริ่ม คุณสามารถเรียกใช้ฟังก์ชันฟอร์มการค้นหาในพื้นที่เนื้อหา


0

ฉันยังประสบปัญหาเดียวกันมันเป็นค่าเริ่มต้นที่กำหนดโดย WordPress

แต่โชคดีที่ฉันพบบางอย่างที่ช่วยฉัน

เพิ่มด้านล่างใน "Function.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');

จากนั้นแทนที่บรรทัดด้านล่าง (บรรทัดที่ 15) ใน search.php

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

อาจจะช่วยคุณได้เช่นกัน

สำหรับรายละเอียดอ่านสิ่งนี้: ปรับแต่งการค้นหาว่างเปล่า wordpress


0

วิธีหนึ่งในการหลีกเลี่ยงการค้นหาที่ว่างเปล่าคือทำการตรวจสอบจาวาสคริปต์เพื่อหาค่าว่างของช่องค้นหาและหากพบช่องว่างแล้วให้หยุดส่งแบบฟอร์มการค้นหาเช่นด้านล่าง:

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

});

0
# Catch empty searches
RewriteCond %{QUERY_STRING} ^s=$
RewriteRule ^ /? [L,R=301]

มันไม่ชัดเจนว่าวิธีนี้ตอบคำถาม คุณสามารถแก้ไขคำตอบของคุณ (โดยใช้ปุ่มแก้ไขด้านบน) และเพิ่มรายละเอียดเกี่ยวกับสิ่งที่รหัสนี้จะวางไว้ที่ไหนและแก้ไขปัญหาได้อย่างไร?
Howdy_McGee
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.