Utilizzare pre_get_posts per i risultati di ricerca non trovati

17 mag 2012, 18:11:02
Visualizzazioni: 4.76K
Voti: 0
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.

1
Commenti

non sono sicuro di capire la domanda - come fai a sapere che non è stato trovato nulla se non hai ancora effettuato la query?

Milo Milo
17 mag 2012 19:06:50
Tutte le risposte alla domanda 2
0

@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;
17 mag 2012 23:03:58
0

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;
}
18 mag 2012 20:04:58