C'è un modo per utilizzare $query->set('tax_query') nel filtro pre_get_posts?
C'è un modo per utilizzare $query->set('tax_query', ...)
nel filtro pre_get_posts
? Per esempio il seguente codice non sta modificando la query. Nota che sto costruendo $taxonomies da una ricerca personalizzata.
function custom_search_filter($query) {
...
// array('taxonomy' => 'category', 'field' => 'id', 'terms' => array( 41,42 ), 'operator' => 'IN')
$taxonomies = implode(',', $taxonomy_arr);
// https://wordpress.stackexchange.com/questions/25076/how-to-filter-wordpress-search-excluding-post-in-some-custom-taxonomies
$taxonomy_query = array('relation' => 'AND', $taxonomies);
$query->set('tax_query', $taxonomy_query);
}
return $query;
}
add_filter( 'pre_get_posts', 'custom_search_filter', 999 );
Grazie in anticipo.

La variabile $query
nel filtro rappresenta un oggetto WP_Query
, quindi non dovresti passare un nuovo oggetto WP_Query
nel metodo per impostare le proprietà di quell'oggetto.
La domanda da cui hai copiato il codice utilizzava in modo errato l'azione, che potrebbe essere stato il nocciolo del tuo problema.
Sì, tax_query
può essere utilizzato all'interno di un'azione pre_get_posts
o in modo simile agganciando parse_request
, request
o parse_query
.
Ecco un esempio:
Specifica una tassonomia personalizzata per le query di ricerca
function search_filter_get_posts( $query ) {
if( !$query->is_search || is_admin() )
return;
$taxquery = array(
array(
'taxonomy' => 'career_event_type',
'field' => 'term_id',
'terms' => array( 35, 19, 6 ),
'operator'=> 'IN'
)
);
$query->set( 'tax_query', $taxquery );
}
add_action( 'pre_get_posts', 'search_filter_get_posts' );
Sebbene si dovrebbe notare che una maggiore specificità con i tuoi parametri condizionali potrebbe aiutare a evitare di modificare query che non intendi modificare.
Ad esempio, se stai utilizzando un modulo di ricerca personalizzato per cercare un tipo di post personalizzato, includere un campo nascosto (o anche una casella di selezione) per impostare il post_type
aiuterebbe a fornire una specificità condizionale extra.
<input type="hidden" name="post_type" id="post_type" value="my_post_type" />
L'esempio sopra dell'azione/filtro pre_get_posts
(o equivalente) avrebbe quindi più informazioni per convalidare che stiamo modificando il tipo corretto di richiesta/query.
'my_post_type' === $query->query['post_type']
o
'my_post_type' === get_query_var( 'my_post_type' )
Potresti andare oltre e utilizzare un parametro di query var che non ti aspetti nella query di ricerca che WordPress supporta, solo per agire come flag per la tua azione/filtro.
<input type="hidden" name="author_name" id="author_name" value="my_special_guy" />
Questo fornisce un altro parametro condizionale per la tua azione da cercare, e puoi semplicemente annullare il valore prima che raggiunga la query.
set_query_var( 'author_name', '' );

potresti fornire un esempio funzionante di impostazione del tax_query all'interno di un'azione pre_get_posts?

$tax_query è un oggetto che contiene un array annidato. Non puoi sovrascrivere l'oggetto con un array annidato.

$tax_query
non è un oggetto, $query
invece lo è (è un'istanza di WP_Query
).

questo non sovrascrive completamente il tax_query? non dovrebbe essere $taxquery aggiunto ai dati correnti nell'argomento tax_query?

@hot_barbara così com'è, sovrascriverebbe il tax_query. Questa versione invece aggiungerebbe la query corrente: $taxquery = array( 'relation' => 'OR', array( 'taxonomy' => 'career_event_type', 'field' => 'id', 'terms' => array( 52 ), 'operator'=> 'NOT IN' ) );

@t31os I valori della chiave dell'array "field" non dovrebbero essere "term_id" invece di "id"? Secondo https://developer.wordpress.org/reference/classes/wp_query/#taxonomy-parameters, i valori possibili sono 'term_id', 'name', 'slug' o 'term_taxonomy_id'. Il valore predefinito è 'term_id'. Il valore 'id' non appare affatto.

Le query fiscali richiedono di impostare anche l'oggetto tax_query nella query poiché la query è già stata analizzata. Vedi la mia risposta per Modificare le pagine di tassonomia per escludere gli elementi nelle tassonomie figlie.
