C'è un modo per utilizzare $query->set('tax_query') nel filtro pre_get_posts?

30 nov 2011, 22:10:42
Visualizzazioni: 66.3K
Voti: 20

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.

2
Commenti

Perché stai passando un oggetto WP_Query in un metodo che imposta gli argomenti?

t31os t31os
1 dic 2011 03:06:26

Sì, ho sbagliato, ora ho risolto usando eval per convertire la stringa in un array (e sono assolutamente sicuro che la stringa sia sicura). Grazie.

José Pablo Orozco Marín José Pablo Orozco Marín
1 dic 2011 14:14:13
Tutte le risposte alla domanda 2
7
43

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', '' );
1 dic 2011 15:32:04
Commenti

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

helgatheviking helgatheviking
22 feb 2012 22:05:44

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

AlxVallejo AlxVallejo
17 apr 2013 22:11:06

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

t31os t31os
18 apr 2013 00:29:10

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

hot_barbara hot_barbara
25 mag 2018 22:33:43

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

rambillo rambillo
21 gen 2020 00:20:20

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

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

Sicuramente avrebbe dovuto esserlo, ho aggiornato la risposta per apportare alcune correzioni/aggiunte.

t31os t31os
20 ott 2022 08:08:12
Mostra i restanti 2 commenti
0

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.

3 mag 2013 02:17:30