Utilizzare pre_get_posts per i risultati di ricerca non trovati
function hotlinkers_wp_query($query) {
// Controlla se non è l'admin e se è una ricerca
if ( !$query->is_admin && $query->is_search) {
// Sostituisce i trattini con spazi nella query di ricerca
$search_query = str_replace('-',' ', $query->query_vars['s']);
$query->set('s', $search_query);
}
return $query;
}
add_action('pre_get_posts', 'hotlinkers_wp_query');
Questo codice è per i risultati di ricerca trovati, in search.php ho un else, quindi se non vengono trovati risultati mostra 15 post casuali (usando wp query).
Vorrei evitare questo comportamento se possibile da fare via pre_get_posts.

@Milo ha ragione. Non puoi usare pre_get_posts
per determinare il numero di risultati perché pre_get_posts
modifica una query prima che venga eseguita (ed è proprio questo che lo rende così utile, ma non per questo utilizzo specifico).
Non riesco a pensare a un buon modo per farlo usando un filtro. Il tuo normale loop è effettivamente ciò che vuoi:
if( have_posts() ) : while( have_posts() ) : the_post();
// fai qualcosa
endwhile;
else :
// nessun risultato di ricerca, esegui una nuova query con WP_Query
endif;

Come altri hanno detto, non puoi usare pre_get_posts poiché non c'è modo di sapere se la ricerca ha restituito dei post. Direi anche che l'if else è un modo molto pulito per farlo e potrebbe essere la scelta migliore se qualcun altro dovesse lavorarci.
Ma se davvero vuoi farlo con un filtro su posts_results o the_posts per restituire i post sostitutivi che dovrebbero essere mostrati se la ricerca è vuota.
<?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;
}
