Există o modalitate de a utiliza $query->set('tax_query' în filtrul pre_get_posts?

30 nov. 2011, 22:10:42
Vizualizări: 66.3K
Voturi: 20

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.

2
Comentarii

De ce transmiți un obiect WP_Query către o metodă de setare a argumentelor?

t31os t31os
1 dec. 2011 03:06:26

Da, am greșit, acum am reușit folosind eval pentru a converti șirul într-un array (și sunt absolut sigur că șirul este sigur). Mulțumesc.

José Pablo Orozco Marín José Pablo Orozco Marín
1 dec. 2011 14:14:13
Toate răspunsurile la întrebare 2
7
43

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', '' );
1 dec. 2011 15:32:04
Comentarii

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

helgatheviking helgatheviking
22 feb. 2012 22:05:44

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

AlxVallejo AlxVallejo
17 apr. 2013 22:11:06

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

t31os t31os
18 apr. 2013 00:29:10

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 hot_barbara
25 mai 2018 22:33:43

@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' ) );

rambillo rambillo
21 ian. 2020 00:20:20

@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.

Alexander Behling Alexander Behling
22 feb. 2022 11:38:59

Cu siguranță ar fi trebuit să fie, am actualizat răspunsul pentru a face unele corecții/adăugiri.

t31os t31os
20 oct. 2022 08:08:12
Arată celelalte 2 comentarii
0

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.

3 mai 2013 02:17:30