Custom Post Type Consulta vários Termos de Taxonomia

Então, nesta página da lista Tipo de postagem personalizada, há uma lista de Propriedades.

Eu tenho um recurso de pesquisa personalizado onde eles podem procurar propriedades com determinados Termos de Taxonomia – mas também podem procurar por vários Termos de Taxonomia.

Pergunta : se alguém selecionar 2 termos, as únicas Propriedades que devem ser exibidas na lista são Propriedades com term_one AND term_two

Então eu tentei isso abaixo:

 $required_features_slugs = array(); if( isset ( $_GET['features'] ) ) { $features_slugs = $_GET['features']; } $feature = get_terms('features'); $tmp_required = $required_features_slugs; $property = array( 'post_type' => 'properties', 'paged' => $paged, 'tax_query' => array( array( 'taxonomy' => 'features', 'field' => 'slug', 'terms' => $tmp_required, 'operator' => 'AND', ) ), ); 

A URL parece assim:

 features%5B%5D=accredited-landlord&features%5B%5D=cellarbasement 

Agora, porque esses dois resources são selecionados, ele só deve retornar uma propriedade, porque existe apenas uma propriedade com term_one AND term_two dois

No entanto, eu não obtenho esse resultado, em vez disso, eu recebo 4 Propriedades porque existem 4 Propriedades. 3 com term_one e 1 com term_two .

O que eu quero acontecer é para 1 Propriedade para ser retornado porque há apenas uma propriedade com term_once AND term_two conjunto.

Há algo de errado que estou fazendo na Query?

Editar : arquivo PHP atualizado

 $required_features_slugs = array(); if( isset ( $_GET['features'] ) ) { $required_features_slugs = $_GET['features']; } $all_features = get_terms('features'); if( ! empty( $required_features_slugs ) ) { foreach ( $all_features as $feature ) { $tmp_required = $required_features_slugs; if( ! in_array($feature->slug, $required_features_slugs) ) { array_push( $tmp_required, $feature->slug ); } $property = array( 'post_type' => 'properties', 'paged' => $paged, 'tax_query' => array( 'taxonomy' => 'features', 'field' => 'slug', 'terms' => $tmp_required, 'operator' => 'AND', ), ); } } 

Edite # 2 : Então, aqui está o var_dump para a Consulta:

 array(3) { ["post_type"]=> string(10) "properties" ["paged"]=> int(1) ["tax_query"]=> array(4) { ["taxonomy"]=> string(8) "features" ["field"]=> string(4) "slug" ["terms"]=> array(2) { [0]=> string(19) "accredited-landlord" [1]=> string(14) "cellarbasement" } ["operator"]=> string(3) "AND" } } 

E aqui está o var_dump para os termos:

 array(2) { [0]=> string(19) "accredited-landlord" [1]=> string(14) "cellarbasement" } 

Solutions Collecting From Web of "Custom Post Type Consulta vários Termos de Taxonomia"

Argumentos de consulta:

Se $input_terms for a matriz de input de slugs de termo, então você deve poder usar (se eu entender a questão corretamente):

 $property = [ 'post_type' => 'properties', 'paged' => $paged, 'tax_query' => [ [ 'taxonomy' => 'features', 'field' => 'slug', 'terms' => $input_terms, 'operator' => 'AND', ] ], ]; 

onde adicionamos uma matriz em falta na consulta de impostos.

Validação:

Devemos validar primeiro os termos de input.

aqui estão alguns exemplos:

  • Verifique o número máximo de termos permitidos:

     $valid_input_terms_max_count = count( $input_terms ) < = 4; 
  • Verifique o número mínimo de termos permitidos:

     $valid_input_terms_min_count = count( $input_terms ) >= 1; 
  • Verifique se eles inserem limites de termos existem (assume matriz de input não vazia):

     $valid_input_terms_slugs = array_reduce( (array) $input_terms, function( $carry, $item ) { return $carry && null !== term_exists( $item, 'features' ); }, true ); 

    onde nós colecionamos term_exists() para todos os termos em um único valor booleano.

  • Podemos também combinar as limas de input contra uma disposição predefinida de lesmas

SQL gerado:

Aqui está uma consulta SQL gerada para dois slugs de termos existentes em $input_terms :

 SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND ( ( SELECT COUNT(1) FROM wp_term_relationships WHERE term_taxonomy_id IN (160,161) AND object_id = wp_posts.ID ) = 2 ) AND wp_posts.post_type = 'properties' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10 

Espero que você possa ajustar isso às suas necessidades.

Tente mudar o operador para 'operator' => 'IN' , ou tente usar o código de algo como isto:

 $required_features_slugs = array(); if( isset ( $_GET['features'] ) ) { $required_features_slugs = $_GET['features']; } if( ! empty( $required_features_slugs ) ) { $property = array( 'post_type' => 'properties', 'paged' => $paged, 'tax_query' => array( 'relation' => 'AND', ), ); foreach ( $required_features_slugs as $feature ) { $property['tax_query'][] = array( 'taxonomy' => 'features', 'field' => 'slug', 'terms' => $feature, ); } } } 

Talvez isso funcione:

 $property = array( 'post_type' => 'properties', 'paged' => $paged, 'tax_query' => array( 'relation' => 'AND', ), ); $features = $_GET['features']; foreach ($features as $feature) { $property['tax_query'][] = array( 'taxonomy' => 'features', 'field' => 'slug', 'terms' => $feature, ); }