Использование pre_get_posts для поиска, когда результаты не найдены

17 мая 2012 г., 18:11:02
Просмотры: 4.76K
Голосов: 0
function hotlinkers_wp_query($query) {
     // Если это не админка и это поисковый запрос
     if ( !$query->is_admin && $query->is_search) {
            // Заменяем дефисы на пробелы в поисковом запросе
            $search_query = str_replace('-',' ', $query->query_vars['s']);
            $query->set('s', $search_query);
     }

     return $query;
}
add_action('pre_get_posts', 'hotlinkers_wp_query');

Этот код работает для случаев, когда результаты поиска найдены. На странице search.php у меня есть условие else, которое показывает 15 случайных записей (используя wp_query), если ничего не найдено.

Хотелось бы избежать этого и реализовать через pre_get_posts, если это возможно.

1
Комментарии

не уверен, что понял вопрос - как вы можете знать, что ничего не найдено, если вы ещё не выполнили запрос?

Milo Milo
17 мая 2012 г. 19:06:50
Все ответы на вопрос 2
0

@Milo прав. Вы не можете использовать pre_get_posts для определения количества результатов, потому что pre_get_posts изменяет запрос до его выполнения (в этом его преимущество, но не для данного случая).

Я не могу придумать хорошего способа сделать это с помощью фильтра. Ваш обычный цикл — это именно то, что вам нужно:

if( have_posts() ) : while( have_posts() ) : the_post();

// делаем что-то

endwhile;

else :

// нет результатов поиска, запускаем новый запрос с WP_Query

endif;
17 мая 2012 г. 23:03:58
0

Как уже отмечали другие, вы не можете использовать pre get posts, поскольку нет возможности узнать, вернул ли поиск какие-либо записи. Я также считаю, что использование if else — это очень чистый способ решения задачи, и он может быть предпочтительнее, если над этим будет работать кто-то ещё.

Но если вам действительно хочется сделать это с помощью фильтра, вы можете использовать либо posts_results, либо the_posts, чтобы вернуть заменяющие записи, которые должны отображаться, если поиск не дал результатов.

<?php

add_filter('the_posts', 'np_replace_empty_search', 10, 2);
function np_replace_empty_search($posts, $wp_query){
    if($wp_query->is_search && empty($posts)){
        $new_query = new WP_Query();

        return $new_query->posts;
    }
    return $posts;
}
18 мая 2012 г. 20:04:58