Existe uma maneira de usar $ query-> set ('tax_query' no filtro pre_get_posts?

16

Existe uma maneira de usar $query->set('tax_query', ...)no pre_get_postsfiltro? por exemplo, o próximo código não está alterando a consulta. Observe que estou criando $ taxonomias e pesquisas personalizadas.

function custom_search_filter($query) {
        ...

        // array('taxonomy' => 'category', 'field' => 'id', 'terms' => array( 41,42 ), 'operator' => 'IN')
        $taxonomies = implode(',', $taxonomy_arr);

        // /wordpress/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 );

Desde já, obrigado.

José Pablo Orozco Marín
fonte
1
Por que você está passando um WP_Queryobjeto para um método de configuração de argumento?
t31os
Sim, eu estava errado, agora eu entendi usando eval para converter a seqüência de caracteres em uma matriz (e estou realmente certo de que a seqüência de caracteres é segura). Obrigado.
José Pablo Orozco Marín

Respostas:

34

A $queryvariável no filtro representa um WP_Queryobjeto; portanto, você não deve passar um novo WP_Queryobjeto para o método para definir as propriedades desse objeto.

A pergunta da qual você copiou o código estava incorretamente usando o filtro, que eu acho que é o cerne do seu problema.

Sim, tax_querypode ser usado dentro de um pre_get_posts(ou similar parse_request) filtro / ação.

Aqui está um exemplo:
Especifique uma taxonomia customizada para consultas de pesquisa

function search_filter_get_posts($query) {
    if ( !$query->is_search )
        return $query;

    $taxquery = array(
        array(
            'taxonomy' => 'career_event_type',
            'field' => 'id',
            'terms' => array( 52 ),
            'operator'=> 'NOT IN'
        )
    );

    $query->set( 'tax_query', $taxquery );

}
add_action( 'pre_get_posts', 'search_filter_get_posts' );
t31os
fonte
6
você poderia dar um exemplo de como definir a tax_query dentro de uma ação pre_get_posts?
22412 helgatheviking
$ tax_query é um objeto que contém uma matriz aninhada. Você não pode substituir o objeto por uma matriz aninhada.
AlxVallejo 17/04
3
$tax_querynão é um objeto, $queryé (é uma instância de WP_Query).
t31os
2
isso não substitui completamente o tax_query? $ taxquery não deve ser acrescentado aos dados atuais no argumento tax_query?
Hot_barbara