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 );
}
});
