Порожній пошук повертає домашню сторінку, як повернути не знайдену сторінку пошуку?


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
Драй

2
Це загальний випуск WordPress, а не певна тема
Том Дж. Ноуелл

Відповіді:


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

Створіть сторінку Search.php і вставте цей код і змініть цикл на "get_template_part (" цикл "," пошук ");

                    <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

Спираючись на рішення 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(); ?>

Я думаю, що це досить справедливе рішення. Простий і чистий. Немає спеціальних фільтрів та дій, які можуть ускладнити код
Каміль

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.

але, на щастя, я знайшов щось, що мені допомогло.

Додати нижче у "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');

а потім замініть нижче рядок (рядок № 15) у search.php

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

Можливо, це теж допоможе вам

Для детальної інформації читайте це: Налаштуйте порожній пошук WordPress


0

Один із способів уникнути порожнього пошуку - це перевірити javascript на порожнє значення поля пошуку, а якщо знайдене поле порожнім, то перестаньте надсилати форму пошуку, як показано нижче:

$('#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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.