From be130dac5907d363569bf5935d9c4d1bc41e42e4 Mon Sep 17 00:00:00 2001 From: Felipe Elia Date: Fri, 21 Oct 2022 09:04:26 -0300 Subject: [PATCH 1/2] Apply the 'all' operator correctly within widgets --- .../Feature/Facets/Types/Meta/FacetType.php | 22 ++++++++++++++----- .../Facets/Types/Taxonomy/FacetType.php | 22 ++++++++++++++----- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/includes/classes/Feature/Facets/Types/Meta/FacetType.php b/includes/classes/Feature/Facets/Types/Meta/FacetType.php index 578ca49637..ed60ee0cea 100644 --- a/includes/classes/Feature/Facets/Types/Meta/FacetType.php +++ b/includes/classes/Feature/Facets/Types/Meta/FacetType.php @@ -214,12 +214,24 @@ public function add_query_filters( $filters ) { } $meta_fields = $selected_filters[ $this->get_filter_type() ]; + $match_type = $feature->get_match_type(); + foreach ( $meta_fields as $meta_field => $values ) { - $filters[] = [ - 'terms' => [ - 'meta.' . $meta_field . '.raw' => array_keys( $values['terms'] ), - ], - ]; + if ( 'any' === $match_type ) { + $filters[] = [ + 'terms' => [ + 'meta.' . $meta_field . '.raw' => array_keys( $values['terms'] ), + ], + ]; + } else { + foreach ( $values['terms'] as $meta_key => $bool ) { + $filters[] = [ + 'term' => [ + 'meta.' . $meta_field . '.raw' => $meta_key, + ], + ]; + } + } } return $filters; diff --git a/includes/classes/Feature/Facets/Types/Taxonomy/FacetType.php b/includes/classes/Feature/Facets/Types/Taxonomy/FacetType.php index b4d1219b8e..b5a9c2a0e7 100644 --- a/includes/classes/Feature/Facets/Types/Taxonomy/FacetType.php +++ b/includes/classes/Feature/Facets/Types/Taxonomy/FacetType.php @@ -210,14 +210,26 @@ public function add_query_filters( $filters ) { } } + $match_type = $feature->get_match_type(); + foreach ( $selected_filters['taxonomies'] as $taxonomy => $filter ) { $taxonomy_slug = $attribute_taxonomies[ $taxonomy ] ?? $taxonomy; - $filters[] = [ - 'terms' => [ - 'terms.' . $taxonomy_slug . '.slug' => array_keys( $filter['terms'] ), - ], - ]; + if ( 'any' === $match_type ) { + $filters[] = [ + 'terms' => [ + 'terms.' . $taxonomy_slug . '.slug' => array_keys( $filter['terms'] ), + ], + ]; + } else { + foreach ( $filter['terms'] as $term_slug => $term ) { + $filters[] = [ + 'term' => [ + 'terms.' . $taxonomy_slug . '.slug' => $term_slug, + ], + ]; + } + } } return $filters; From bf4d23e229eb520e6aef920306f143531c9d6696 Mon Sep 17 00:00:00 2001 From: Felipe Elia Date: Fri, 21 Oct 2022 09:20:51 -0300 Subject: [PATCH 2/2] Fix tests --- tests/php/features/TestFacetTypeMeta.php | 27 ++++++++++++++++++-- tests/php/features/TestFacetTypeTaxonomy.php | 27 ++++++++++++++++++-- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/tests/php/features/TestFacetTypeMeta.php b/tests/php/features/TestFacetTypeMeta.php index 9e1b5ef737..5aa6d2c861 100644 --- a/tests/php/features/TestFacetTypeMeta.php +++ b/tests/php/features/TestFacetTypeMeta.php @@ -220,13 +220,36 @@ public function testAddQueryFilters() { $facet_feature = Features::factory()->get_registered_feature( 'facets' ); $facet_type = $facet_feature->types['meta']; - parse_str( 'ep_meta_filter_my_custom_field=dolor', $_GET ); + parse_str( 'ep_meta_filter_my_custom_field=dolor,amet', $_GET ); + + $new_filters = $facet_type->add_query_filters( [] ); + $expected = [ + [ + 'term' => [ + 'meta.my_custom_field.raw' => 'dolor', + ], + ], + [ + 'term' => [ + 'meta.my_custom_field.raw' => 'amet', + ], + ], + ]; + $this->assertSame( $expected, $new_filters ); + + /** + * Changing the match type should change from `term` to `terms` + */ + $change_match_type = function () { + return 'any'; + }; + add_filter( 'ep_facet_match_type', $change_match_type ); $new_filters = $facet_type->add_query_filters( [] ); $expected = [ [ 'terms' => [ - 'meta.my_custom_field.raw' => [ 'dolor' ], + 'meta.my_custom_field.raw' => [ 'dolor', 'amet' ], ], ], ]; diff --git a/tests/php/features/TestFacetTypeTaxonomy.php b/tests/php/features/TestFacetTypeTaxonomy.php index 618e9d9e5c..f3f0f8e4b7 100644 --- a/tests/php/features/TestFacetTypeTaxonomy.php +++ b/tests/php/features/TestFacetTypeTaxonomy.php @@ -163,13 +163,36 @@ public function testAddQueryFilters() { $facet_feature = Features::factory()->get_registered_feature( 'facets' ); $facet_type = $facet_feature->types['taxonomy']; - parse_str( 'ep_filter_taxonomy=dolor', $_GET ); + parse_str( 'ep_filter_taxonomy=dolor,amet', $_GET ); + + $new_filters = $facet_type->add_query_filters( [] ); + $expected = [ + [ + 'term' => [ + 'terms.taxonomy.slug' => 'dolor', + ], + ], + [ + 'term' => [ + 'terms.taxonomy.slug' => 'amet', + ], + ], + ]; + $this->assertSame( $expected, $new_filters ); + + /** + * Changing the match type should change from `term` to `terms` + */ + $change_match_type = function () { + return 'any'; + }; + add_filter( 'ep_facet_match_type', $change_match_type ); $new_filters = $facet_type->add_query_filters( [] ); $expected = [ [ 'terms' => [ - 'terms.taxonomy.slug' => [ 'dolor' ], + 'terms.taxonomy.slug' => [ 'dolor', 'amet' ], ], ], ];