Use $ query-set várias vezes com pre_get_posts?

4

Estou usando o pre_get_posts hook para filtrar postagens por termos personalizados. Tudo funcionando bem, mas se eu quiser filtrar posts por dois termos personalizados, a consulta só filtra pelo último termo dado. Veja meu código abaixo. Eu coloco isto em pre_get_posts mas quando ambas as instruções if são TRUE, somente o último conjunto $ query- > é feito, o que significa que ele não filtrará as postagens duas vezes. Existe alguma maneira de conseguir isso? Obrigado

//For searching
if( $query->is_main_query() && isset( $_GET[ 'ls' ] ) ) {
$rt_term_id = $_GET['listing_soort'];
$rt_term_id_land = $_GET['listing_land'];
        // IF our soort vakantie is set and not empty - include it in the query
        if( isset( $rt_term_id ) && ! empty( $rt_term_id ) ) {
            $query->set( 'tax_query', array( array(
                'taxonomy'  => 'vakantiesoorten_listing',
                'field'     => 'id',
                'terms'     => array($rt_term_id[0]),
            ) ) );
        }
        // IF our land vakantie is set and not empty - include it in the query
        if( empty($_GET['location_geo_data']) && isset( $rt_term_id_land ) && ! empty( $rt_term_id_land ) ) {
            $query->set( 'tax_query', array( array(
                'taxonomy'  => 'landen_listing',
                'field'     => 'id',
                'terms'     => array($rt_term_id_land[0]),
            ) ) );
        }
    }   
    
por RobbTe 20.07.2017 / 15:44

2 respostas

3

Pense neste pseudo código

if sky == blue
  set a = 5
if grass == green
  set a = 7

Qual será o valor a ? Não 12.

Esta é exatamente a mesma situação. Você está definindo um parâmetro específico para um valor específico. Na segunda chamada, você está sobrescrevendo seu valor anterior. Para evitar isso, você pode construir o valor (aqui, a matriz) antecipadamente e chamar ->set() apenas uma vez.

$tax_query = array();
if( isset( $rt_term_id ) && ! empty( $rt_term_id ) ) {
    $tax_query[] = array(
        'taxonomy'  => 'vakantiesoorten_listing',
        'field'     => 'id',
        'terms'     => array($rt_term_id[0]),
    );
}
if( empty($_GET['location_geo_data']) && isset( $rt_term_id_land ) && ! empty( $rt_term_id_land ) ) {
    $tax_query[] = array(
        'taxonomy'  => 'landen_listing',
        'field'     => 'id',
        'terms'     => array($rt_term_id_land[0]),
    );
}
$query->set( 'tax_query', $tax_query );
    
por kero 20.07.2017 / 15:50
1

Você pode fazer isso, basta obter o valor original da consulta de imposto, adicionar a consulta adicional e defini-la novamente. A versão abreviada é:

// Get current tax query if it exists, otherwise get an empty array.
$tax_query = $query->get( 'tax_query' ) ?: array();

if ( true ) {
    $tax_query[] = array(); // Add first tax query.
}

if ( true ) {
    $tax_query[] = array(); // Add second tax query.
}

$query->set( 'tax_query', $tax_query ); // Set tax query parameter on query.
    
por Jacob Peattie 20.07.2017 / 15:49

Tags