usando pre_get_posts para resultados de búsqueda no encontrados
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');
esto es para los resultados de búsqueda encontrados, en search.php tengo un else, así que si no se encuentran búsquedas muestra 15 publicaciones aleatorias (usando wp query)
quería evitar eso si es posible hacerlo a través de pre_get_posts.

@Milo tiene razón. No puedes usar pre_get_posts
para determinar el número de resultados porque pre_get_posts
modifica una consulta antes de que se ejecute (por eso es tan genial, solo que no para este uso).
No se me ocurre una buena manera de hacer esto usando un filtro. Tu bucle normal es realmente lo que necesitas:
if( have_posts() ) : while( have_posts() ) : the_post();
// hacer cosas
endwhile;
else :
// no hay resultados de búsqueda, ejecuta una nueva consulta con WP_Query
endif;

Como otros han mencionado, no puedes usar pre_get_posts ya que no hay forma de saber si la búsqueda devolvió algún post. También diría que el if else es una forma muy limpia de hacerlo y podría ser la mejor opción si alguien más va a trabajar en esto.
Pero si realmente deseas hacerlo con un filtro, ya sea en posts_results o the_posts, para devolver los posts de reemplazo que deberían mostrarse si la búsqueda está vacía.
<?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;
}
