Использование pre_get_posts для поиска, когда результаты не найдены
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, если это возможно.

@Milo прав. Вы не можете использовать pre_get_posts
для определения количества результатов, потому что pre_get_posts
изменяет запрос до его выполнения (в этом его преимущество, но не для данного случая).
Я не могу придумать хорошего способа сделать это с помощью фильтра. Ваш обычный цикл — это именно то, что вам нужно:
if( have_posts() ) : while( have_posts() ) : the_post();
// делаем что-то
endwhile;
else :
// нет результатов поиска, запускаем новый запрос с WP_Query
endif;

Как уже отмечали другие, вы не можете использовать 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;
}
