Există o modalitate de a utiliza $query->set('tax_query' în filtrul pre_get_posts?
Există o modalitate de a utiliza $query->set('tax_query', ...)
în filtrul pre_get_posts
? De exemplu, următorul cod nu modifică interogarea. Rețineți că construiesc $taxonomies dintr-o căutare personalizată.
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
// cum să filtrezi căutarea WordPress excluzând postările din anumite taxonomii personalizate
$taxonomy_query = array('relation' => 'AND', $taxonomies);
$query->set('tax_query', $taxonomy_query);
}
return $query;
}
add_filter( 'pre_get_posts', 'custom_search_filter', 999 );
Mulțumesc anticipat.

Variabila $query
din filtru reprezintă un obiect WP_Query
, așa că nu ar trebui să transmiți un nou obiect WP_Query
în metodă pentru a seta proprietățile acelui obiect.
Întrebarea de la care ai copiat codul folosea incorect acțiunea, ceea ce poate fi esența problemei tale.
Da, tax_query
poate fi folosit în interiorul unei acțiuni pre_get_posts
sau similar prin conectarea la parse_request
, request
sau parse_query
.
Iată un exemplu:
Specifică o taxonomie personalizată pentru interogările de căutare
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' );
De menționat că o specificitate mai mare cu parametrii condiționali ar putea ajuta la evitarea modificării interogărilor pe care nu intenționezi să le schimbi.
De exemplu, dacă folosești un formular de căutare personalizat pentru a căuta un tip de postare personalizat, includerea unui câmp ascuns (sau chiar a unei liste dropdown) pentru a seta post_type
ar ajuta la oferirea unei specificități condiționale suplimentare.
<input type="hidden" name="post_type" id="post_type" value="my_post_type" />
Exemplul de mai sus pre_get_posts
(sau echivalent) acțiune/filtru ar avea atunci mai multe informații pentru a valida că modificăm tipul corect de cerere/interogare.
'my_post_type' === $query->query['post_type']
sau
'my_post_type' === get_query_var( 'my_post_type' )
Ai putea merge mai departe și folosi un parametru de interogare pe care nu-l aștepți în interogarea de căutare pe care WordPress îl acceptă, doar pentru a acționa ca un indicator pentru acțiunea/filtrul tău.
<input type="hidden" name="author_name" id="author_name" value="my_special_guy" />
Acest lucru oferă un alt parametru condițional pentru acțiunea ta de căutat și poți pur și simplu să anulezi valoarea înainte să ajungă la interogare.
set_query_var( 'author_name', '' );

poți să dai un exemplu funcțional de setare a tax_query în interiorul unei acțiuni pre_get_posts?

$tax_query este un obiect care conține un array imbricat. Nu poți suprascrie obiectul cu un array imbricat.

$tax_query
nu este un obiect, însă $query
este (este o instanță a WP_Query
).

acest lucru nu suprascrie complet tax_query? nu ar trebui ca $taxquery să fie adăugat la datele curente din argumentul tax_query?

@hot_barbara în stadiul actual, ar suprascrie tax_query. Această versiune ar adăuga la interogarea curentă: $taxquery = array( 'relation' => 'SAU', array( 'taxonomy' => 'career_event_type', 'field' => 'id', 'terms' => array( 52 ), 'operator'=> 'NOT IN' ) );

@t31os Nu ar trebui ca valorile cheii de matrice "field" să fie "term_id" în loc de "id"? Conform https://developer.wordpress.org/reference/classes/wp_query/#taxonomy-parameters, valorile posibile sunt 'term_id', 'name', 'slug' sau 'term_taxonomy_id'. Valoarea implicită este 'term_id'. Valoarea 'id' nu apare deloc acolo.

Interogările fiscale necesită setarea obiectului tax_query în interogare, deoarece interogarea a fost deja analizată. Consultați răspunsul meu pentru Modificarea paginilor de taxonomie pentru a exclude elementele din taxonomiile copil.
