Utilizzo di pre_get_posts per riscrivere la query di ricerca e mostrare post da multiple tassonomie
Sembra che dovrebbe essere semplice, ma sono bloccato!
Se un utente cerca 'alice', vorrei mostrargli tutti i post con i termini di tassonomia personalizzata 'bob' e 'carol', indipendentemente dal fatto che quei post contengano la stringa 'alice' o meno.
Riesco a impostare il tax_query della query in modo che mostri solo i post con 'bob' e 'carol' come termini, ma non riesco a resettare la query di ricerca effettiva in modo che mostri tutti i post, non solo quelli con 'alice'.
Questo è il filtro che sto usando per modificare il tax_query:
if ( !$query->is_search )
return $query;
$taxquery = array(
'relation' => 'OR',
array(
'taxonomy' => 'people',
'field' => 'slug',
'terms' => array( 'bob' ),
),
array(
'taxonomy' => 'people',
'field' => 'slug',
'terms' => array( 'carol' ),
)
);
$query->set( 'tax_query', $taxquery );
return $query;
ma usare questo per impostare la query di ricerca non funziona:
$queryvars = array(
's' => ''
);
$query->set( 'query_vars', $queryvars );
Non funziona perché non puoi usare set per cambiare tutte le variabili di query. Il modo più semplice per ottenere il risultato è impostare 's' a una stringa vuota:
add_action( 'pre_get_posts', function( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
$taxquery = array( ... );
$query->set( 'tax_query', $taxquery );
$query->set('s', '' );
}
});
In questo modo, WordPress continuerà a considerare la richiesta come una ricerca, quindi verrà utilizzato il template search.php per mostrare i risultati e se chiami is_search() il risultato sarà TRUE.
Se vuoi che WordPress non consideri più la richiesta come una ricerca, devi anche annullare manualmente $query->query_vars['s'] e impostare $query->is_search su false:
add_action( 'pre_get_posts', function( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
$taxquery = array( ... );
$query->set( 'tax_query', $taxquery );
$query->set('s', '' );
unset( $query->query['s'] );
$query->is_search = FALSE;
}
});
Facendo ciò, WordPress non considererà più la richiesta come una ricerca e utilizzerà index.php come template.
Se vuoi utilizzare un altro template, ad esempio taxonomy.php, devi usare il filtro 'template_include':
add_action( 'pre_get_posts', function( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
$taxquery = array( ... );
$query->set( 'tax_query', $taxquery );
$query->set('s', '' );
unset( $query->query['s'] );
$query->is_search = FALSE;
add_filter( 'template_include', function() {
return locate_template( 'taxonomy.php' )
}, 0 );
}
});