From 7029ccd013dfd0206c2428c243ce30b7d77af6b6 Mon Sep 17 00:00:00 2001 From: Ramon Date: Fri, 20 Aug 2021 13:25:44 -0300 Subject: [PATCH 01/24] Move PR from EP to ElasticpressLabs Co-authored-by: Ricardo Moraleida --- .../Feature/BooleanSearchOperators.php | 336 ++++++++++++++++++ 1 file changed, 336 insertions(+) create mode 100644 includes/classes/Feature/BooleanSearchOperators.php diff --git a/includes/classes/Feature/BooleanSearchOperators.php b/includes/classes/Feature/BooleanSearchOperators.php new file mode 100644 index 0000000..e66f2f5 --- /dev/null +++ b/includes/classes/Feature/BooleanSearchOperators.php @@ -0,0 +1,336 @@ +slug = 'boolean_search_operators'; + + $this->title = esc_html__( 'Boolean Search Operators', 'elasticpress-labs' ); + + $this->requires_install_reindex = false; + $this->default_settings = [ + 'active' => false, + ]; + + parent::__construct(); + } + + /** + * Setup Feature Functionality + */ + public function setup() { + $settings = $this->get_settings(); + + if ( $settings['active'] ) { + /** Features Class @var Features $features */ + $features = Features::factory(); + + /** Search Feature @var Feature\Search\Search $search */ + $search = $features->get_registered_feature( 'search' ); + + if ( ! $search->is_active() && $this->is_active() ) { + $features->deactivate_feature( $this->slug ); + + return false; + } + + add_filter( 'ep_elasticpress_enabled', [ $this, 'integrate_boolean_search_operators' ], 10, 2 ); + } + } + + /** + * Hook up the boolean operators query if it is enabled + * + * @hook ep_elasticpress_enabled + * + * @param {bool} $enabled Whether to integrate with Elasticsearch or not + * @param {WP_Query} $query WP_Query to evaluate + * + * @return bool + */ + public function integrate_boolean_search_operators( $enabled, $query ) { + if ( ! $enabled ) { + return false; + } + + if ( true === $query->query_vars['ep_integrate'] && + ( $this->is_active() || true === $query->query_vars['ep_boolean_operators'] ) ) { + + \add_filter( 'ep_formatted_args_query', [ $this, 'replace_query_if_boolean' ], 999, 4 ); + } + + return true; + } + + /** + * Check if a search query uses boolean operators and switch queries accordingly + * + * @hook ep_formatted_args_query + * + * @param {array} $query Current query + * @param {array} $query_vars Query variables + * @param {string} $search_text Search text + * @param {array} $search_fields Search fields + * + * @return array + */ + public function replace_query_if_boolean( $query, $query_vars, $search_text, $search_fields ) { + + if ( $this->query_uses_boolean_operators( $search_text ) ) { + + $simple_query = array( + 'simple_query_string' => array( + + /** + * Filter the fields to use in boolean operator searches + * + * @hook ep_boolean_operators_fields + * + * @param {array} $search_fields + * @param {array} $query_vars Query variables + * @param {string} $search_text Search text modified to replace tokens + * @param {array} $search_fields Search fields + * @param {array} $query The original query + * + * @return {array} New fields + */ + 'fields' => \apply_filters( 'ep_boolean_operators_fields', $search_fields, $query_vars, $search_text, $query ), + + /** + * Filter the default boolean operator + * Valid values: OR, AND + * + * @hook ep_boolean_operators_default + * + * @param {string} $default + * @param {array} $query_vars Query variables + * @param {string} $search_text Search text modified to replace tokens + * @param {array} $search_fields Search fields + * @param {array} $query The original query + * + * @return {string} New operator + */ + 'default_operator' => \apply_filters( 'ep_boolean_operators_default', 'OR', $query_vars, $search_text, $search_fields, $query ), + + /** + * Filter allowed boolean operators. + * Valid flags: ALL, AND, ESCAPE, FUZZY, NEAR, NONE, NOT, OR, PHRASE, PRECEDENCE, PREFIX, SLOP, WHITESPACE + * Must return a string with a single flag or use pipe separators, e.g.: 'OR|AND|PREFIX' + * + * @hook ep_boolean_operators_flags + * + * @param {string} $flags + * @param {array} $query_vars Query variables + * @param {string} $search_text Search text modified to replace tokens + * @param {array} $search_fields Search fields + * @param {array} $query The original query + * + * @return {string} New flags + */ + 'flags' => \apply_filters( 'ep_boolean_operators_flags', 'ALL', $query_vars, $search_text, $search_fields, $query ), + + /** + * Filter automatic synonym generation for boolean operators queries + * + * @hook ep_boolean_operators_generate_synonyms + * + * @param {bool} $auto_generate_synonyms + * @param {array} $query_vars Query variables + * @param {string} $search_text Search text modified to replace tokens + * @param {array} $search_fields Search fields + * @param {array} $query The original query + * + * @return {bool} New fuzziness + */ + 'auto_generate_synonyms_phrase_query' => \apply_filters( 'ep_boolean_operators_generate_synonyms', true, $query_vars, $search_text, $search_fields, $query ), + ), + ); + + $original_text = $search_text; + + if ( 'ALL' === $simple_query['simple_query_string']['flags'] ) { + $search_text = \str_replace( array( ' AND ', ' OR ', ' NOT ' ), array( ' +', ' | ', ' -' ), $search_text ); + } else { + $flags = explode( '|', $simple_query['simple_query_string']['flags'] ); + $ops = array( 'AND', 'OR', 'NOT' ); + + foreach ( $ops as $flag ) { + if ( \in_array( $flag, $flags, true ) ) { + switch ( $flag ) { + case 'AND': + $search_text = \str_replace( " $flag ", ' +', $search_text ); + break; + case 'OR': + $search_text = \str_replace( " $flag ", ' | ', $search_text ); + break; + case 'NOT': + $search_text = \str_replace( " $flag ", ' -', $search_text ); + break; + } + } + } + } + + /** + * Filter the search text to use in boolean operator queries + * + * @hook ep_boolean_operators_search_text + * + * @param {string} $search_text Search text modified to replace tokens + * @param {string} $original_text The original search text + * @param {array} $query_vars Query variables + * @param {array} $search_fields Search fields + * @param {array} $query The original query + * + * @return {string} New search text + */ + $simple_query['simple_query_string']['query'] = \apply_filters( 'ep_boolean_operators_search_text', $search_text, $original_text, $query_vars, $search_fields, $query ); + + /** + * Filter formatted Elasticsearch simple query string query (only contains query part) + * + * @hook ep_boolean_operators_query_args + * + * @param {array} $simple_query Current query + * @param {array} $query_vars Query variables + * @param {string} $search_text Search text modified to replace tokens + * @param {array} $search_fields Search fields + * @param {array} $query The original query + * + * @return {array} New query + */ + return \apply_filters( 'ep_boolean_operators_query_args', $simple_query, $query_vars, $search_text, $search_fields, $query ); + } + + return $query; + } + + /** + * Test if a search text uses boolean operators + * reference for this RegEx: https://regex101.com/r/JizB0Z/1 + * reference for acceptable operators: + * https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.html#simple-query-string-syntax + * + * # matches + * (museum (art)) # no extra requirements for surrounding parentheses + * "american museum" # no extra requirements for surrounding double quotes + * museum art* # requires zero space before the operator + * museum art~35 # requires zero space before and at least one digit after the operator + * museum | art # requires surrounding spaces + * museum +art # requires space before + * museum -art # requires space before + * museum OR art # requires surrounding spaces and uppercase operator + * museum AND art # requires surrounding spaces and uppercase operator + * museum NOT art # requires surrounding spaces and uppercase operator + * + * # non matches + * museum art + * art () + * museum art 1985 + * 35 artists~ + * museum or art + * museum and art + * museum not art + * "museum + * (museum + * museum) + * museum *art + * + * @param string $search_text the search query + * + * @return bool + */ + public function query_uses_boolean_operators( $search_text ) { + $boolean_regex = '/(\".+\")|(\+)|(\-)|(\S\*)|(\S\~\d)|(.+\|.+)|(\(\S+\))|(\sOR\s)|(\sAND\s)|(\sNOT\s)/'; + + return preg_match( $boolean_regex, $search_text ) !== false; + } + + /** + * Returns requirements status of feature + * + * Requires the search feature to be activated + * + * @return FeatureRequirementsStatus + */ + public function requirements_status() { + /** Features Class @var Features $features */ + $features = Features::factory(); + + /** Search Feature @var Feature\Search\Search $search */ + $search = $features->get_registered_feature( 'search' ); + + if ( ! $search->is_active() ) { + return new FeatureRequirementsStatus( 2, esc_html__( 'This feature requires the "Post Search" feature to be enabled', 'elasticpress-labs' ) ); + } + + return parent::requirements_status(); + } + + /** + * Output feature box summary + */ + public function output_feature_box_summary() { + ?> +

+ +

+ + Date: Fri, 20 Aug 2021 13:43:41 -0300 Subject: [PATCH 02/24] Check ES version before add auto_generate_synonyms_phrase_query --- .../Feature/BooleanSearchOperators.php | 39 ++++++++++--------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/includes/classes/Feature/BooleanSearchOperators.php b/includes/classes/Feature/BooleanSearchOperators.php index e66f2f5..7195f04 100644 --- a/includes/classes/Feature/BooleanSearchOperators.php +++ b/includes/classes/Feature/BooleanSearchOperators.php @@ -10,6 +10,7 @@ use ElasticPress\Feature; use ElasticPress\FeatureRequirementsStatus; use ElasticPress\Features; +use ElasticPress\Elasticsearch; if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. @@ -117,7 +118,7 @@ public function replace_query_if_boolean( $query, $query_vars, $search_text, $se * * @return {array} New fields */ - 'fields' => \apply_filters( 'ep_boolean_operators_fields', $search_fields, $query_vars, $search_text, $query ), + 'fields' => \apply_filters( 'ep_boolean_operators_fields', $search_fields, $query_vars, $search_text, $query ), /** * Filter the default boolean operator @@ -133,7 +134,7 @@ public function replace_query_if_boolean( $query, $query_vars, $search_text, $se * * @return {string} New operator */ - 'default_operator' => \apply_filters( 'ep_boolean_operators_default', 'OR', $query_vars, $search_text, $search_fields, $query ), + 'default_operator' => \apply_filters( 'ep_boolean_operators_default', 'OR', $query_vars, $search_text, $search_fields, $query ), /** * Filter allowed boolean operators. @@ -150,25 +151,27 @@ public function replace_query_if_boolean( $query, $query_vars, $search_text, $se * * @return {string} New flags */ - 'flags' => \apply_filters( 'ep_boolean_operators_flags', 'ALL', $query_vars, $search_text, $search_fields, $query ), - - /** - * Filter automatic synonym generation for boolean operators queries - * - * @hook ep_boolean_operators_generate_synonyms - * - * @param {bool} $auto_generate_synonyms - * @param {array} $query_vars Query variables - * @param {string} $search_text Search text modified to replace tokens - * @param {array} $search_fields Search fields - * @param {array} $query The original query - * - * @return {bool} New fuzziness - */ - 'auto_generate_synonyms_phrase_query' => \apply_filters( 'ep_boolean_operators_generate_synonyms', true, $query_vars, $search_text, $search_fields, $query ), + 'flags' => \apply_filters( 'ep_boolean_operators_flags', 'ALL', $query_vars, $search_text, $search_fields, $query ), ), ); + if ( version_compare( Elasticsearch::factory()->get_elasticsearch_version(), '6.0', '>=' ) ) { + /** + * Filter automatic synonym generation for boolean operators queries + * + * @hook ep_boolean_operators_generate_synonyms + * + * @param {bool} $auto_generate_synonyms + * @param {array} $query_vars Query variables + * @param {string} $search_text Search text modified to replace tokens + * @param {array} $search_fields Search fields + * @param {array} $query The original query + * + * @return {bool} New fuzziness + */ + $simple_query['simple_query_string']['auto_generate_synonyms_phrase_query'] = \apply_filters( 'ep_boolean_operators_generate_synonyms', true, $query_vars, $search_text, $search_fields, $query ); + } + $original_text = $search_text; if ( 'ALL' === $simple_query['simple_query_string']['flags'] ) { From 582cea6c948d3ece3dfe8d71fba1ad281caa79cc Mon Sep 17 00:00:00 2001 From: Ramon Date: Fri, 20 Aug 2021 13:52:27 -0300 Subject: [PATCH 03/24] Update filter's names --- .../Feature/BooleanSearchOperators.php | 20 +++++++++---------- includes/functions/core.php | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/includes/classes/Feature/BooleanSearchOperators.php b/includes/classes/Feature/BooleanSearchOperators.php index 7195f04..48b3297 100644 --- a/includes/classes/Feature/BooleanSearchOperators.php +++ b/includes/classes/Feature/BooleanSearchOperators.php @@ -108,7 +108,7 @@ public function replace_query_if_boolean( $query, $query_vars, $search_text, $se /** * Filter the fields to use in boolean operator searches * - * @hook ep_boolean_operators_fields + * @hook ep_labs_boolean_operators_fields * * @param {array} $search_fields * @param {array} $query_vars Query variables @@ -118,13 +118,13 @@ public function replace_query_if_boolean( $query, $query_vars, $search_text, $se * * @return {array} New fields */ - 'fields' => \apply_filters( 'ep_boolean_operators_fields', $search_fields, $query_vars, $search_text, $query ), + 'fields' => \apply_filters( 'ep_labs_boolean_operators_fields', $search_fields, $query_vars, $search_text, $query ), /** * Filter the default boolean operator * Valid values: OR, AND * - * @hook ep_boolean_operators_default + * @hook ep_labs_boolean_operators_default * * @param {string} $default * @param {array} $query_vars Query variables @@ -134,14 +134,14 @@ public function replace_query_if_boolean( $query, $query_vars, $search_text, $se * * @return {string} New operator */ - 'default_operator' => \apply_filters( 'ep_boolean_operators_default', 'OR', $query_vars, $search_text, $search_fields, $query ), + 'default_operator' => \apply_filters( 'ep_labs_boolean_operators_default', 'OR', $query_vars, $search_text, $search_fields, $query ), /** * Filter allowed boolean operators. * Valid flags: ALL, AND, ESCAPE, FUZZY, NEAR, NONE, NOT, OR, PHRASE, PRECEDENCE, PREFIX, SLOP, WHITESPACE * Must return a string with a single flag or use pipe separators, e.g.: 'OR|AND|PREFIX' * - * @hook ep_boolean_operators_flags + * @hook ep_labs_boolean_operators_flags * * @param {string} $flags * @param {array} $query_vars Query variables @@ -151,7 +151,7 @@ public function replace_query_if_boolean( $query, $query_vars, $search_text, $se * * @return {string} New flags */ - 'flags' => \apply_filters( 'ep_boolean_operators_flags', 'ALL', $query_vars, $search_text, $search_fields, $query ), + 'flags' => \apply_filters( 'ep_labs_boolean_operators_flags', 'ALL', $query_vars, $search_text, $search_fields, $query ), ), ); @@ -169,7 +169,7 @@ public function replace_query_if_boolean( $query, $query_vars, $search_text, $se * * @return {bool} New fuzziness */ - $simple_query['simple_query_string']['auto_generate_synonyms_phrase_query'] = \apply_filters( 'ep_boolean_operators_generate_synonyms', true, $query_vars, $search_text, $search_fields, $query ); + $simple_query['simple_query_string']['auto_generate_synonyms_phrase_query'] = \apply_filters( 'ep_labs_boolean_operators_generate_synonyms', true, $query_vars, $search_text, $search_fields, $query ); } $original_text = $search_text; @@ -200,7 +200,7 @@ public function replace_query_if_boolean( $query, $query_vars, $search_text, $se /** * Filter the search text to use in boolean operator queries * - * @hook ep_boolean_operators_search_text + * @hook ep_labs_boolean_operators_search_text * * @param {string} $search_text Search text modified to replace tokens * @param {string} $original_text The original search text @@ -210,7 +210,7 @@ public function replace_query_if_boolean( $query, $query_vars, $search_text, $se * * @return {string} New search text */ - $simple_query['simple_query_string']['query'] = \apply_filters( 'ep_boolean_operators_search_text', $search_text, $original_text, $query_vars, $search_fields, $query ); + $simple_query['simple_query_string']['query'] = \apply_filters( 'ep_labs_boolean_operators_search_text', $search_text, $original_text, $query_vars, $search_fields, $query ); /** * Filter formatted Elasticsearch simple query string query (only contains query part) @@ -225,7 +225,7 @@ public function replace_query_if_boolean( $query, $query_vars, $search_text, $se * * @return {array} New query */ - return \apply_filters( 'ep_boolean_operators_query_args', $simple_query, $query_vars, $search_text, $search_fields, $query ); + return \apply_filters( 'ep_labs_boolean_operators_query_args', $simple_query, $query_vars, $search_text, $search_fields, $query ); } return $query; diff --git a/includes/functions/core.php b/includes/functions/core.php index b3bfa86..92cb2b0 100644 --- a/includes/functions/core.php +++ b/includes/functions/core.php @@ -49,7 +49,7 @@ function i18n() { * @return void */ function init() { - do_action( 'elasticpress_labs_init' ); + do_action( 'ep_labs_init' ); } /** From bb6cd10acf720c89a2adf308e3610a92f773a6ff Mon Sep 17 00:00:00 2001 From: Ramon Date: Fri, 27 Aug 2021 12:56:24 -0300 Subject: [PATCH 04/24] Fix package name --- includes/classes/Feature/BooleanSearchOperators.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/classes/Feature/BooleanSearchOperators.php b/includes/classes/Feature/BooleanSearchOperators.php index 48b3297..ef314c3 100644 --- a/includes/classes/Feature/BooleanSearchOperators.php +++ b/includes/classes/Feature/BooleanSearchOperators.php @@ -19,7 +19,7 @@ /** * Boolean Search Feature * - * @package ElasticPress\Feature\BooleanSearchOperators + * @package ElasticPressLabs\Feature\BooleanSearchOperators */ class BooleanSearchOperators extends Feature { From 4fbe477d4e3c694ae5803f4ddc11d819e7539b47 Mon Sep 17 00:00:00 2001 From: Ramon Date: Fri, 27 Aug 2021 14:39:14 -0300 Subject: [PATCH 05/24] Add TestBooleanSearchOperators --- .../feature/TestBooleanSearchOperators.php | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 tests/phpunit/feature/TestBooleanSearchOperators.php diff --git a/tests/phpunit/feature/TestBooleanSearchOperators.php b/tests/phpunit/feature/TestBooleanSearchOperators.php new file mode 100644 index 0000000..aa2de36 --- /dev/null +++ b/tests/phpunit/feature/TestBooleanSearchOperators.php @@ -0,0 +1,77 @@ +register_feature($instance); + } + + /** + * Get Boolean Search Operators feature + * + * @since 1.2.0 + * @return BooleanSearchOperators + */ + protected function get_feature() { + return \ElasticPress\Features::factory()->get_registered_feature( 'boolean_search_operators' ); + } + + /** + * Test constrcut + * + * @since 1.2.0 + */ + public function testConstruct() { + $instance = $this->get_feature(); + + $this->assertEquals( 'boolean_search_operators', $instance->slug ); + $this->assertEquals( 'Boolean Search Operators', $instance->title ); + } + + /** + * Test box summary + * + * @since 1.2.0 + */ + public function testBoxSummary() { + ob_start(); + $this->get_feature()->output_feature_box_summary(); + $output = ob_get_clean(); + + $this->assertContains( 'Allow boolean operators in search queries.', $output ); + } + + /** + * Test box long text + * + * @since 1.2.0 + */ + public function testBoxLong() { + ob_start(); + $this->get_feature()->output_feature_box_long(); + $output = ob_get_clean(); + + $this->assertContains( 'Allows users to search using the following boolean operators:', $output ); + } + +} From b7996749a0b632c57a602c8972bc9fb9a3052661 Mon Sep 17 00:00:00 2001 From: Ramon Date: Fri, 27 Aug 2021 14:41:22 -0300 Subject: [PATCH 06/24] Update TestBooleanSearchOperators --- tests/phpunit/feature/TestBooleanSearchOperators.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/phpunit/feature/TestBooleanSearchOperators.php b/tests/phpunit/feature/TestBooleanSearchOperators.php index aa2de36..0683356 100644 --- a/tests/phpunit/feature/TestBooleanSearchOperators.php +++ b/tests/phpunit/feature/TestBooleanSearchOperators.php @@ -58,7 +58,7 @@ public function testBoxSummary() { $this->get_feature()->output_feature_box_summary(); $output = ob_get_clean(); - $this->assertContains( 'Allow boolean operators in search queries.', $output ); + $this->assertContains( 'Allow boolean operators in search queries', $output ); } /** From 40f7dd09b9cab9d322ba84df954e96fee9caeaff Mon Sep 17 00:00:00 2001 From: Ramon Date: Fri, 27 Aug 2021 15:24:59 -0300 Subject: [PATCH 07/24] Fix the return of query_uses_boolean_operators function --- includes/classes/Feature/BooleanSearchOperators.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/classes/Feature/BooleanSearchOperators.php b/includes/classes/Feature/BooleanSearchOperators.php index ef314c3..3e2b3f8 100644 --- a/includes/classes/Feature/BooleanSearchOperators.php +++ b/includes/classes/Feature/BooleanSearchOperators.php @@ -269,7 +269,7 @@ public function replace_query_if_boolean( $query, $query_vars, $search_text, $se public function query_uses_boolean_operators( $search_text ) { $boolean_regex = '/(\".+\")|(\+)|(\-)|(\S\*)|(\S\~\d)|(.+\|.+)|(\(\S+\))|(\sOR\s)|(\sAND\s)|(\sNOT\s)/'; - return preg_match( $boolean_regex, $search_text ) !== false; + return (bool) preg_match( $boolean_regex, $search_text ); } /** From 0939f2a4e4a7dccd83987763bd93b3cfb286f68f Mon Sep 17 00:00:00 2001 From: Ramon Date: Fri, 27 Aug 2021 15:26:56 -0300 Subject: [PATCH 08/24] Add test to query_uses_boolean_operators --- .../feature/TestBooleanSearchOperators.php | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/tests/phpunit/feature/TestBooleanSearchOperators.php b/tests/phpunit/feature/TestBooleanSearchOperators.php index 0683356..5861eef 100644 --- a/tests/phpunit/feature/TestBooleanSearchOperators.php +++ b/tests/phpunit/feature/TestBooleanSearchOperators.php @@ -74,4 +74,36 @@ public function testBoxLong() { $this->assertContains( 'Allows users to search using the following boolean operators:', $output ); } + /** + * Text query_uses_boolean_operators function + * + * @since 1.2.0 + */ + public function testQueryUsesBooleanOperators() { + $feature = $this->get_feature(); + + $this->assertTrue( $feature->query_uses_boolean_operators( '(museum (art))' ) ); + $this->assertTrue( $feature->query_uses_boolean_operators( '"american museum"' ) ); + $this->assertTrue( $feature->query_uses_boolean_operators( 'museum art*' ) ); + $this->assertTrue( $feature->query_uses_boolean_operators( 'museum art~35' ) ); + $this->assertTrue( $feature->query_uses_boolean_operators( 'museum | art' ) ); + $this->assertTrue( $feature->query_uses_boolean_operators( 'museum +art' ) ); + $this->assertTrue( $feature->query_uses_boolean_operators( 'museum -art' ) ); + $this->assertTrue( $feature->query_uses_boolean_operators( 'museum OR art' ) ); + $this->assertTrue( $feature->query_uses_boolean_operators( 'museum AND art' ) ); + $this->assertTrue( $feature->query_uses_boolean_operators( 'museum NOT art' ) ); + + $this->assertNotTrue( $feature->query_uses_boolean_operators( 'museum art' ) ); + $this->assertNotTrue( $feature->query_uses_boolean_operators( 'art ()' ) ); + $this->assertNotTrue( $feature->query_uses_boolean_operators( 'museum art 1985' ) ); + $this->assertNotTrue( $feature->query_uses_boolean_operators( '35 artists~' ) ); + $this->assertNotTrue( $feature->query_uses_boolean_operators( 'museum or art' ) ); + $this->assertNotTrue( $feature->query_uses_boolean_operators( 'museum and art' ) ); + $this->assertNotTrue( $feature->query_uses_boolean_operators( 'museum not art' ) ); + $this->assertNotTrue( $feature->query_uses_boolean_operators( '"museum' ) ); + $this->assertNotTrue( $feature->query_uses_boolean_operators( '(museum' ) ); + $this->assertNotTrue( $feature->query_uses_boolean_operators( 'museum)' ) ); + $this->assertNotTrue( $feature->query_uses_boolean_operators( 'museum *art' ) ); + } + } From ef525c595b45cdabdb225dd661f8b75c1f6085f7 Mon Sep 17 00:00:00 2001 From: Ramon Date: Fri, 27 Aug 2021 15:27:59 -0300 Subject: [PATCH 09/24] Update composer.lock --- composer.lock | 560 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 401 insertions(+), 159 deletions(-) diff --git a/composer.lock b/composer.lock index b89b2f8..c2e26eb 100644 --- a/composer.lock +++ b/composer.lock @@ -9,16 +9,16 @@ "packages-dev": [ { "name": "10up/elasticpress", - "version": "3.5.1", + "version": "3.6.2", "source": { "type": "git", "url": "https://github.com/10up/ElasticPress.git", - "reference": "8bc017231c0979129a644c0994e5bd12748a08b5" + "reference": "b64d09291b17e1c58969424b8f167071bc7dbddb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/10up/ElasticPress/zipball/8bc017231c0979129a644c0994e5bd12748a08b5", - "reference": "8bc017231c0979129a644c0994e5bd12748a08b5", + "url": "https://api.github.com/repos/10up/ElasticPress/zipball/b64d09291b17e1c58969424b8f167071bc7dbddb", + "reference": "b64d09291b17e1c58969424b8f167071bc7dbddb", "shasum": "" }, "require": { @@ -27,6 +27,7 @@ "require-dev": { "10up/phpcs-composer": "dev-master", "10up/wpacceptance": "dev-master", + "phpcompatibility/phpcompatibility-wp": "*", "phpunit/phpunit": "^7", "wpackagist-plugin/woocommerce": "*" }, @@ -66,7 +67,11 @@ "search", "wordpress" ], - "time": "2020-10-29T13:55:20+00:00" + "support": { + "issues": "https://github.com/10up/ElasticPress/issues", + "source": "https://github.com/10up/ElasticPress/tree/3.6.2" + }, + "time": "2021-08-26T17:25:32+00:00" }, { "name": "10up/phpcs-composer", @@ -74,12 +79,12 @@ "source": { "type": "git", "url": "https://github.com/10up/phpcs-composer.git", - "reference": "2fcd33205f7742c46fa09b28829321d847cc472d" + "reference": "2f5c3608bc03fe1ca65acf462dd7b5008f6829a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/10up/phpcs-composer/zipball/2fcd33205f7742c46fa09b28829321d847cc472d", - "reference": "2fcd33205f7742c46fa09b28829321d847cc472d", + "url": "https://api.github.com/repos/10up/phpcs-composer/zipball/2f5c3608bc03fe1ca65acf462dd7b5008f6829a0", + "reference": "2f5c3608bc03fe1ca65acf462dd7b5008f6829a0", "shasum": "" }, "require": { @@ -88,6 +93,7 @@ "squizlabs/php_codesniffer": "^3.4.0", "wp-coding-standards/wpcs": "*" }, + "default-branch": true, "type": "phpcodesniffer-standard", "notification-url": "https://packagist.org/downloads/", "license": [ @@ -99,7 +105,11 @@ "email": "ephraim.gregor@10up.com" } ], - "time": "2020-07-15T03:05:06+00:00" + "support": { + "issues": "https://github.com/10up/phpcs-composer/issues", + "source": "https://github.com/10up/phpcs-composer/tree/master" + }, + "time": "2021-01-08T03:03:06+00:00" }, { "name": "10up/wp_mock", @@ -126,6 +136,7 @@ "php-coveralls/php-coveralls": "^2.1", "sebastian/comparator": ">=1.2.3" }, + "default-branch": true, "type": "library", "autoload": { "psr-4": { @@ -140,20 +151,24 @@ "GPL-2.0-or-later" ], "description": "A mocking library to take the pain out of unit testing for WordPress", + "support": { + "issues": "https://github.com/10up/wp_mock/issues", + "source": "https://github.com/10up/wp_mock/tree/master" + }, "time": "2020-07-15T03:36:07+00:00" }, { "name": "antecedent/patchwork", - "version": "2.1.12", + "version": "2.1.15", "source": { "type": "git", "url": "https://github.com/antecedent/patchwork.git", - "reference": "b98e046dd4c0acc34a0846604f06f6111654d9ea" + "reference": "0430ceaac7f447f1778c199ec19d7e4362a6f961" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/antecedent/patchwork/zipball/b98e046dd4c0acc34a0846604f06f6111654d9ea", - "reference": "b98e046dd4c0acc34a0846604f06f6111654d9ea", + "url": "https://api.github.com/repos/antecedent/patchwork/zipball/0430ceaac7f447f1778c199ec19d7e4362a6f961", + "reference": "0430ceaac7f447f1778c199ec19d7e4362a6f961", "shasum": "" }, "require": { @@ -184,26 +199,30 @@ "runkit", "testing" ], - "time": "2019-12-22T17:52:09+00:00" + "support": { + "issues": "https://github.com/antecedent/patchwork/issues", + "source": "https://github.com/antecedent/patchwork/tree/2.1.15" + }, + "time": "2021-08-22T08:00:13+00:00" }, { "name": "dealerdirect/phpcodesniffer-composer-installer", - "version": "v0.7.0", + "version": "v0.7.1", "source": { "type": "git", "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git", - "reference": "e8d808670b8f882188368faaf1144448c169c0b7" + "reference": "fe390591e0241955f22eb9ba327d137e501c771c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/e8d808670b8f882188368faaf1144448c169c0b7", - "reference": "e8d808670b8f882188368faaf1144448c169c0b7", + "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/fe390591e0241955f22eb9ba327d137e501c771c", + "reference": "fe390591e0241955f22eb9ba327d137e501c771c", "shasum": "" }, "require": { "composer-plugin-api": "^1.0 || ^2.0", "php": ">=5.3", - "squizlabs/php_codesniffer": "^2 || ^3 || 4.0.x-dev" + "squizlabs/php_codesniffer": "^2.0 || ^3.0 || ^4.0" }, "require-dev": { "composer/composer": "*", @@ -250,7 +269,11 @@ "stylecheck", "tests" ], - "time": "2020-06-25T14:57:39+00:00" + "support": { + "issues": "https://github.com/dealerdirect/phpcodesniffer-composer-installer/issues", + "source": "https://github.com/dealerdirect/phpcodesniffer-composer-installer" + }, + "time": "2020-12-07T18:04:37+00:00" }, { "name": "doctrine/instantiator", @@ -301,6 +324,10 @@ "constructor", "instantiate" ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.4.0" + }, "funding": [ { "url": "https://www.doctrine-project.org/sponsorship.html", @@ -362,20 +389,24 @@ "keywords": [ "test" ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + }, "time": "2020-07-09T08:09:16+00:00" }, { "name": "mockery/mockery", - "version": "1.3.3", + "version": "1.3.4", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "60fa2f67f6e4d3634bb4a45ff3171fa52215800d" + "reference": "31467aeb3ca3188158613322d66df81cedd86626" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/60fa2f67f6e4d3634bb4a45ff3171fa52215800d", - "reference": "60fa2f67f6e4d3634bb4a45ff3171fa52215800d", + "url": "https://api.github.com/repos/mockery/mockery/zipball/31467aeb3ca3188158613322d66df81cedd86626", + "reference": "31467aeb3ca3188158613322d66df81cedd86626", "shasum": "" }, "require": { @@ -427,7 +458,11 @@ "test double", "testing" ], - "time": "2020-08-11T18:10:21+00:00" + "support": { + "issues": "https://github.com/mockery/mockery/issues", + "source": "https://github.com/mockery/mockery/tree/1.3.4" + }, + "time": "2021-02-24T09:51:00+00:00" }, { "name": "myclabs/deep-copy", @@ -475,6 +510,10 @@ "object", "object graph" ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2" + }, "funding": [ { "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", @@ -536,6 +575,10 @@ } ], "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/master" + }, "time": "2018-07-08T19:23:20+00:00" }, { @@ -583,6 +626,10 @@ } ], "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/master" + }, "time": "2018-07-08T19:19:57+00:00" }, { @@ -641,32 +688,36 @@ "phpcs", "standards" ], + "support": { + "issues": "https://github.com/PHPCompatibility/PHPCompatibility/issues", + "source": "https://github.com/PHPCompatibility/PHPCompatibility" + }, "time": "2019-12-27T09:44:58+00:00" }, { "name": "phpcompatibility/phpcompatibility-paragonie", - "version": "1.3.0", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie.git", - "reference": "b862bc32f7e860d0b164b199bd995e690b4b191c" + "reference": "ddabec839cc003651f2ce695c938686d1086cf43" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/b862bc32f7e860d0b164b199bd995e690b4b191c", - "reference": "b862bc32f7e860d0b164b199bd995e690b4b191c", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/ddabec839cc003651f2ce695c938686d1086cf43", + "reference": "ddabec839cc003651f2ce695c938686d1086cf43", "shasum": "" }, "require": { "phpcompatibility/php-compatibility": "^9.0" }, "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.5", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", "paragonie/random_compat": "dev-master", "paragonie/sodium_compat": "dev-master" }, "suggest": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." }, "type": "phpcodesniffer-standard", @@ -693,20 +744,24 @@ "polyfill", "standards" ], - "time": "2019-11-04T15:17:54+00:00" + "support": { + "issues": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie/issues", + "source": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie" + }, + "time": "2021-02-15T10:24:51+00:00" }, { "name": "phpcompatibility/phpcompatibility-wp", - "version": "2.1.0", + "version": "2.1.2", "source": { "type": "git", "url": "https://github.com/PHPCompatibility/PHPCompatibilityWP.git", - "reference": "41bef18ba688af638b7310666db28e1ea9158b2f" + "reference": "a792ab623069f0ce971b2417edef8d9632e32f75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/41bef18ba688af638b7310666db28e1ea9158b2f", - "reference": "41bef18ba688af638b7310666db28e1ea9158b2f", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/a792ab623069f0ce971b2417edef8d9632e32f75", + "reference": "a792ab623069f0ce971b2417edef8d9632e32f75", "shasum": "" }, "require": { @@ -714,10 +769,10 @@ "phpcompatibility/phpcompatibility-paragonie": "^1.0" }, "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.5" + "dealerdirect/phpcodesniffer-composer-installer": "^0.7" }, "suggest": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." }, "type": "phpcodesniffer-standard", @@ -743,7 +798,11 @@ "standards", "wordpress" ], - "time": "2019-08-28T14:22:28+00:00" + "support": { + "issues": "https://github.com/PHPCompatibility/PHPCompatibilityWP/issues", + "source": "https://github.com/PHPCompatibility/PHPCompatibilityWP" + }, + "time": "2021-07-21T11:09:57+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -792,6 +851,10 @@ "reflection", "static analysis" ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, "time": "2020-06-27T09:03:43+00:00" }, { @@ -844,6 +907,10 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master" + }, "time": "2020-09-03T19:13:55+00:00" }, { @@ -889,20 +956,24 @@ } ], "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0" + }, "time": "2020-09-17T18:55:26+00:00" }, { "name": "phpspec/prophecy", - "version": "1.12.1", + "version": "1.13.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d" + "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/8ce87516be71aae9b956f81906aaf0338e0d8a2d", - "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/be1996ed8adc35c3fd795488a653f4b518be70ea", + "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea", "shasum": "" }, "require": { @@ -914,7 +985,7 @@ }, "require-dev": { "phpspec/phpspec": "^6.0", - "phpunit/phpunit": "^8.0 || ^9.0 <9.3" + "phpunit/phpunit": "^8.0 || ^9.0" }, "type": "library", "extra": { @@ -952,7 +1023,11 @@ "spy", "stub" ], - "time": "2020-09-29T09:10:42+00:00" + "support": { + "issues": "https://github.com/phpspec/prophecy/issues", + "source": "https://github.com/phpspec/prophecy/tree/1.13.0" + }, + "time": "2021-03-17T13:42:18+00:00" }, { "name": "phpunit/php-code-coverage", @@ -1015,27 +1090,31 @@ "testing", "xunit" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/master" + }, "time": "2018-10-31T16:06:48+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "2.0.2", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "050bedf145a257b1ff02746c31894800e5122946" + "reference": "28af674ff175d0768a5a978e6de83f697d4a7f05" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", - "reference": "050bedf145a257b1ff02746c31894800e5122946", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/28af674ff175d0768a5a978e6de83f697d4a7f05", + "reference": "28af674ff175d0768a5a978e6de83f697d4a7f05", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=7.1" }, "require-dev": { - "phpunit/phpunit": "^7.1" + "phpunit/phpunit": "^8.5" }, "type": "library", "extra": { @@ -1065,7 +1144,17 @@ "filesystem", "iterator" ], - "time": "2018-09-13T20:33:42+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-07-19T06:46:01+00:00" }, { "name": "phpunit/php-text-template", @@ -1106,27 +1195,31 @@ "keywords": [ "template" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1" + }, "time": "2015-06-21T13:50:34+00:00" }, { "name": "phpunit/php-timer", - "version": "2.1.2", + "version": "2.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" + "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", - "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/2454ae1765516d20c4ffe103d85a58a9a3bd5662", + "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=7.1" }, "require-dev": { - "phpunit/phpunit": "^7.0" + "phpunit/phpunit": "^8.5" }, "type": "library", "extra": { @@ -1155,25 +1248,35 @@ "keywords": [ "timer" ], - "time": "2019-06-07T04:22:29+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/2.1.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T08:20:02+00:00" }, { "name": "phpunit/php-token-stream", - "version": "3.1.1", + "version": "3.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" + "reference": "9c1da83261628cb24b6a6df371b6e312b3954768" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", - "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/9c1da83261628cb24b6a6df371b6e312b3954768", + "reference": "9c1da83261628cb24b6a6df371b6e312b3954768", "shasum": "" }, "require": { "ext-tokenizer": "*", - "php": "^7.1" + "php": ">=7.1" }, "require-dev": { "phpunit/phpunit": "^7.0" @@ -1204,7 +1307,18 @@ "keywords": [ "tokenizer" ], - "time": "2019-09-17T06:23:10+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/php-token-stream/issues", + "source": "https://github.com/sebastianbergmann/php-token-stream/tree/3.1.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "abandoned": true, + "time": "2021-07-26T12:15:06+00:00" }, { "name": "phpunit/phpunit", @@ -1288,27 +1402,31 @@ "testing", "xunit" ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "source": "https://github.com/sebastianbergmann/phpunit/tree/7.5.20" + }, "time": "2020-01-08T08:45:45+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" + "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/1de8cd5c010cb153fcd68b8d0f64606f523f7619", + "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0" + "php": ">=5.6" }, "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.0" + "phpunit/phpunit": "^8.5" }, "type": "library", "extra": { @@ -1333,29 +1451,39 @@ ], "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "time": "2017-03-04T06:30:41+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T08:15:22+00:00" }, { "name": "sebastian/comparator", - "version": "3.0.2", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" + "reference": "1071dfcef776a57013124ff35e1fc41ccd294758" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", - "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1071dfcef776a57013124ff35e1fc41ccd294758", + "reference": "1071dfcef776a57013124ff35e1fc41ccd294758", "shasum": "" }, "require": { - "php": "^7.1", + "php": ">=7.1", "sebastian/diff": "^3.0", "sebastian/exporter": "^3.1" }, "require-dev": { - "phpunit/phpunit": "^7.1" + "phpunit/phpunit": "^8.5" }, "type": "library", "extra": { @@ -1373,6 +1501,10 @@ "BSD-3-Clause" ], "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" @@ -1384,10 +1516,6 @@ { "name": "Bernhard Schussek", "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" } ], "description": "Provides the functionality to compare PHP values for equality", @@ -1397,24 +1525,34 @@ "compare", "equality" ], - "time": "2018-07-12T15:12:46+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T08:04:30+00:00" }, { "name": "sebastian/diff", - "version": "3.0.2", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" + "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", - "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/14f72dd46eaf2f2293cbe79c93cc0bc43161a211", + "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=7.1" }, "require-dev": { "phpunit/phpunit": "^7.5 || ^8.0", @@ -1436,13 +1574,13 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" } ], "description": "Diff implementation", @@ -1453,24 +1591,34 @@ "unidiff", "unified diff" ], - "time": "2019-02-04T06:01:07+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:59:04+00:00" }, { "name": "sebastian/environment", - "version": "4.2.3", + "version": "4.2.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368" + "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368", - "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", + "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=7.1" }, "require-dev": { "phpunit/phpunit": "^7.5" @@ -1506,24 +1654,34 @@ "environment", "hhvm" ], - "time": "2019-11-20T08:46:58+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/4.2.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:53:42+00:00" }, { "name": "sebastian/exporter", - "version": "3.1.2", + "version": "3.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" + "reference": "6b853149eab67d4da22291d36f5b0631c0fd856e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", - "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/6b853149eab67d4da22291d36f5b0631c0fd856e", + "reference": "6b853149eab67d4da22291d36f5b0631c0fd856e", "shasum": "" }, "require": { - "php": "^7.0", + "php": ">=7.0", "sebastian/recursion-context": "^3.0" }, "require-dev": { @@ -1573,7 +1731,17 @@ "export", "exporter" ], - "time": "2019-09-14T09:02:43+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:47:53+00:00" }, { "name": "sebastian/global-state", @@ -1624,24 +1792,28 @@ "keywords": [ "global state" ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/2.0.0" + }, "time": "2017-04-27T15:39:26+00:00" }, { "name": "sebastian/object-enumerator", - "version": "3.0.3", + "version": "3.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" + "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", + "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", "shasum": "" }, "require": { - "php": "^7.0", + "php": ">=7.0", "sebastian/object-reflector": "^1.1.1", "sebastian/recursion-context": "^3.0" }, @@ -1671,24 +1843,34 @@ ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "time": "2017-08-03T12:35:26+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:40:27+00:00" }, { "name": "sebastian/object-reflector", - "version": "1.1.1", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "773f97c67f28de00d397be301821b06708fca0be" + "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", - "reference": "773f97c67f28de00d397be301821b06708fca0be", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", + "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", "shasum": "" }, "require": { - "php": "^7.0" + "php": ">=7.0" }, "require-dev": { "phpunit/phpunit": "^6.0" @@ -1716,24 +1898,34 @@ ], "description": "Allows reflection of object attributes, including inherited and non-public ones", "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "time": "2017-03-29T09:07:27+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:37:18+00:00" }, { "name": "sebastian/recursion-context", - "version": "3.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" + "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/367dcba38d6e1977be014dc4b22f47a484dac7fb", + "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb", "shasum": "" }, "require": { - "php": "^7.0" + "php": ">=7.0" }, "require-dev": { "phpunit/phpunit": "^6.0" @@ -1754,14 +1946,14 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, { "name": "Adam Harvey", "email": "aharvey@php.net" @@ -1769,24 +1961,34 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2017-03-03T06:23:57+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:34:24+00:00" }, { "name": "sebastian/resource-operations", - "version": "2.0.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" + "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", - "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/31d35ca87926450c44eae7e2611d45a7a65ea8b3", + "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=7.1" }, "type": "library", "extra": { @@ -1811,7 +2013,17 @@ ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "time": "2018-10-04T04:07:39+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/resource-operations/issues", + "source": "https://github.com/sebastianbergmann/resource-operations/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:30:19+00:00" }, { "name": "sebastian/version", @@ -1854,20 +2066,24 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/master" + }, "time": "2016-10-03T07:35:21+00:00" }, { "name": "squizlabs/php_codesniffer", - "version": "3.5.8", + "version": "3.6.0", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "9d583721a7157ee997f235f327de038e7ea6dac4" + "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/9d583721a7157ee997f235f327de038e7ea6dac4", - "reference": "9d583721a7157ee997f235f327de038e7ea6dac4", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ffced0d2c8fa8e6cdc4d695a743271fab6c38625", + "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625", "shasum": "" }, "require": { @@ -1905,20 +2121,25 @@ "phpcs", "standards" ], - "time": "2020-10-23T02:01:07+00:00" + "support": { + "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", + "source": "https://github.com/squizlabs/PHP_CodeSniffer", + "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" + }, + "time": "2021-04-09T00:54:41+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.20.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41" + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f4ba089a5b6366e453971d3aad5fe8e897b37f41", - "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", "shasum": "" }, "require": { @@ -1930,7 +2151,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.20-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1967,6 +2188,9 @@ "polyfill", "portable" ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1981,20 +2205,20 @@ "type": "tidelift" } ], - "time": "2020-10-23T14:02:19+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "75a63c33a8577608444246075ea0af0d052e452a" + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", - "reference": "75a63c33a8577608444246075ea0af0d052e452a", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", "shasum": "" }, "require": { @@ -2021,40 +2245,49 @@ } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + }, "funding": [ { "url": "https://github.com/theseer", "type": "github" } ], - "time": "2020-07-12T23:59:07+00:00" + "time": "2021-07-28T10:34:58+00:00" }, { "name": "webmozart/assert", - "version": "1.9.1", + "version": "1.10.0", "source": { "type": "git", - "url": "https://github.com/webmozart/assert.git", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" + "url": "https://github.com/webmozarts/assert.git", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0 || ^8.0", + "php": "^7.2 || ^8.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<3.9.1" + "vimeo/psalm": "<4.6.1 || 4.6.2" }, "require-dev": { - "phpunit/phpunit": "^4.8.36 || ^7.5.13" + "phpunit/phpunit": "^8.5.13" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, "autoload": { "psr-4": { "Webmozart\\Assert\\": "src/" @@ -2076,7 +2309,11 @@ "check", "validate" ], - "time": "2020-07-08T17:02:28+00:00" + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.10.0" + }, + "time": "2021-03-09T10:59:23+00:00" }, { "name": "wp-coding-standards/wpcs", @@ -2122,6 +2359,11 @@ "standards", "wordpress" ], + "support": { + "issues": "https://github.com/WordPress/WordPress-Coding-Standards/issues", + "source": "https://github.com/WordPress/WordPress-Coding-Standards", + "wiki": "https://github.com/WordPress/WordPress-Coding-Standards/wiki" + }, "time": "2020-05-13T23:57:56+00:00" } ], @@ -2137,5 +2379,5 @@ "php": ">=7.0" }, "platform-dev": [], - "plugin-api-version": "1.1.0" + "plugin-api-version": "2.0.0" } From 59a751675c528d52adc1ad6c02f4f6da2e9c1d7a Mon Sep 17 00:00:00 2001 From: Ramon Date: Mon, 30 Aug 2021 18:20:23 -0300 Subject: [PATCH 10/24] Add missing @since tag --- includes/classes/Feature/BooleanSearchOperators.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/includes/classes/Feature/BooleanSearchOperators.php b/includes/classes/Feature/BooleanSearchOperators.php index 3e2b3f8..dab2cd7 100644 --- a/includes/classes/Feature/BooleanSearchOperators.php +++ b/includes/classes/Feature/BooleanSearchOperators.php @@ -109,6 +109,7 @@ public function replace_query_if_boolean( $query, $query_vars, $search_text, $se * Filter the fields to use in boolean operator searches * * @hook ep_labs_boolean_operators_fields + * @since 1.2.0 * * @param {array} $search_fields * @param {array} $query_vars Query variables @@ -116,7 +117,7 @@ public function replace_query_if_boolean( $query, $query_vars, $search_text, $se * @param {array} $search_fields Search fields * @param {array} $query The original query * - * @return {array} New fields + * @return {array} New fields */ 'fields' => \apply_filters( 'ep_labs_boolean_operators_fields', $search_fields, $query_vars, $search_text, $query ), @@ -125,6 +126,7 @@ public function replace_query_if_boolean( $query, $query_vars, $search_text, $se * Valid values: OR, AND * * @hook ep_labs_boolean_operators_default + * @since 1.2.0 * * @param {string} $default * @param {array} $query_vars Query variables @@ -142,6 +144,7 @@ public function replace_query_if_boolean( $query, $query_vars, $search_text, $se * Must return a string with a single flag or use pipe separators, e.g.: 'OR|AND|PREFIX' * * @hook ep_labs_boolean_operators_flags + * @since 1.2.0 * * @param {string} $flags * @param {array} $query_vars Query variables @@ -159,7 +162,8 @@ public function replace_query_if_boolean( $query, $query_vars, $search_text, $se /** * Filter automatic synonym generation for boolean operators queries * - * @hook ep_boolean_operators_generate_synonyms + * @hook ep_labs_boolean_operators_generate_synonyms + * @since 1.2.0 * * @param {bool} $auto_generate_synonyms * @param {array} $query_vars Query variables @@ -201,6 +205,7 @@ public function replace_query_if_boolean( $query, $query_vars, $search_text, $se * Filter the search text to use in boolean operator queries * * @hook ep_labs_boolean_operators_search_text + * @since 1.2.0 * * @param {string} $search_text Search text modified to replace tokens * @param {string} $original_text The original search text @@ -216,6 +221,7 @@ public function replace_query_if_boolean( $query, $query_vars, $search_text, $se * Filter formatted Elasticsearch simple query string query (only contains query part) * * @hook ep_boolean_operators_query_args + * @since 1.2.0 * * @param {array} $simple_query Current query * @param {array} $query_vars Query variables From c6f61b7788616b8f4146dfc964bc066d629008da Mon Sep 17 00:00:00 2001 From: Ramon Date: Mon, 30 Aug 2021 18:23:05 -0300 Subject: [PATCH 11/24] Remove extra space --- .../Feature/BooleanSearchOperators.php | 69 +++++++++---------- 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/includes/classes/Feature/BooleanSearchOperators.php b/includes/classes/Feature/BooleanSearchOperators.php index dab2cd7..8058cb9 100644 --- a/includes/classes/Feature/BooleanSearchOperators.php +++ b/includes/classes/Feature/BooleanSearchOperators.php @@ -104,18 +104,17 @@ public function replace_query_if_boolean( $query, $query_vars, $search_text, $se $simple_query = array( 'simple_query_string' => array( - /** * Filter the fields to use in boolean operator searches * - * @hook ep_labs_boolean_operators_fields - * @since 1.2.0 + * @hook ep_labs_boolean_operators_fields + * @since 1.2.0 * - * @param {array} $search_fields - * @param {array} $query_vars Query variables - * @param {string} $search_text Search text modified to replace tokens - * @param {array} $search_fields Search fields - * @param {array} $query The original query + * @param {array} $search_fields + * @param {array} $query_vars Query variables + * @param {string} $search_text Search text modified to replace tokens + * @param {array} $search_fields Search fields + * @param {array} $query The original query * * @return {array} New fields */ @@ -125,16 +124,16 @@ public function replace_query_if_boolean( $query, $query_vars, $search_text, $se * Filter the default boolean operator * Valid values: OR, AND * - * @hook ep_labs_boolean_operators_default - * @since 1.2.0 + * @hook ep_labs_boolean_operators_default + * @since 1.2.0 * - * @param {string} $default - * @param {array} $query_vars Query variables - * @param {string} $search_text Search text modified to replace tokens - * @param {array} $search_fields Search fields - * @param {array} $query The original query + * @param {string} $default + * @param {array} $query_vars Query variables + * @param {string} $search_text Search text modified to replace tokens + * @param {array} $search_fields Search fields + * @param {array} $query The original query * - * @return {string} New operator + * @return {string} New operator */ 'default_operator' => \apply_filters( 'ep_labs_boolean_operators_default', 'OR', $query_vars, $search_text, $search_fields, $query ), @@ -146,13 +145,13 @@ public function replace_query_if_boolean( $query, $query_vars, $search_text, $se * @hook ep_labs_boolean_operators_flags * @since 1.2.0 * - * @param {string} $flags - * @param {array} $query_vars Query variables - * @param {string} $search_text Search text modified to replace tokens - * @param {array} $search_fields Search fields - * @param {array} $query The original query + * @param {string} $flags + * @param {array} $query_vars Query variables + * @param {string} $search_text Search text modified to replace tokens + * @param {array} $search_fields Search fields + * @param {array} $query The original query * - * @return {string} New flags + * @return {string} New flags */ 'flags' => \apply_filters( 'ep_labs_boolean_operators_flags', 'ALL', $query_vars, $search_text, $search_fields, $query ), ), @@ -165,13 +164,13 @@ public function replace_query_if_boolean( $query, $query_vars, $search_text, $se * @hook ep_labs_boolean_operators_generate_synonyms * @since 1.2.0 * - * @param {bool} $auto_generate_synonyms - * @param {array} $query_vars Query variables - * @param {string} $search_text Search text modified to replace tokens - * @param {array} $search_fields Search fields - * @param {array} $query The original query + * @param {bool} $auto_generate_synonyms + * @param {array} $query_vars Query variables + * @param {string} $search_text Search text modified to replace tokens + * @param {array} $search_fields Search fields + * @param {array} $query The original query * - * @return {bool} New fuzziness + * @return {bool} New fuzziness */ $simple_query['simple_query_string']['auto_generate_synonyms_phrase_query'] = \apply_filters( 'ep_labs_boolean_operators_generate_synonyms', true, $query_vars, $search_text, $search_fields, $query ); } @@ -204,16 +203,16 @@ public function replace_query_if_boolean( $query, $query_vars, $search_text, $se /** * Filter the search text to use in boolean operator queries * - * @hook ep_labs_boolean_operators_search_text + * @hook ep_labs_boolean_operators_search_text * @since 1.2.0 * - * @param {string} $search_text Search text modified to replace tokens - * @param {string} $original_text The original search text - * @param {array} $query_vars Query variables - * @param {array} $search_fields Search fields - * @param {array} $query The original query + * @param {string} $search_text Search text modified to replace tokens + * @param {string} $original_text The original search text + * @param {array} $query_vars Query variables + * @param {array} $search_fields Search fields + * @param {array} $query The original query * - * @return {string} New search text + * @return {string} New search text */ $simple_query['simple_query_string']['query'] = \apply_filters( 'ep_labs_boolean_operators_search_text', $search_text, $original_text, $query_vars, $search_fields, $query ); From 20e1f2c505ff04809b85522a7028025ebd90e2e8 Mon Sep 17 00:00:00 2001 From: Ramon Date: Mon, 30 Aug 2021 18:58:37 -0300 Subject: [PATCH 12/24] Fix translations --- .../Feature/BooleanSearchOperators.php | 76 ++++++++++++++++--- 1 file changed, 66 insertions(+), 10 deletions(-) diff --git a/includes/classes/Feature/BooleanSearchOperators.php b/includes/classes/Feature/BooleanSearchOperators.php index 8058cb9..8be3b4c 100644 --- a/includes/classes/Feature/BooleanSearchOperators.php +++ b/includes/classes/Feature/BooleanSearchOperators.php @@ -315,28 +315,84 @@ public function output_feature_box_long() {

  • - + or - AND + +, 2: AND */ + esc_html__( '%1$s or %2$s signifies AND operation. eg.: modern +art, modern AND art', 'elasticpress-labs' ), + '+', + 'AND' + ) + ); + ?>
  • - | or - OR + |, 2: OR */ + esc_html__( '%1$s or %2$s signifies OR operation. eg.: modern | art, modern OR art', 'elasticpress-labs' ), + '|', + 'OR' + ) + ); + ?>
  • - - or - NOT + -, 2: NOT */ + esc_html__( '%1$s or %2$s signifies NOT operation. eg.: modern -art, modern NOT art', 'elasticpress-labs' ), + '-', + 'NOT' + ) + ); + ?>
  • - " + " */ + esc_html__( '%1$s wraps characters to signify a phrase. eg.: "modern art"', 'elasticpress-labs' ), + '"' + ) + ); + ?>
  • - * + * */ + esc_html__( '%1$s signifies a prefix wildcard. eg.: art*', 'elasticpress-labs' ), + '*' + ) + ); + ?>
  • - () + () */ + esc_html__( '%1$s signifies precedence. eg.: (MoMA OR (modern AND art))', 'elasticpress-labs' ), + '()' + ) + ); + ?>
  • - ~# + ~# */ + esc_html__( '%1$s signifies slop if used on a phrase. eg.: "modern art"~2. Signifies fuzziness if used on a word: eg: modern~1', 'elasticpress-labs' ), + '~#' + ) + ); + ?>
Date: Wed, 1 Sep 2021 10:17:49 -0300 Subject: [PATCH 13/24] Update CHANGELOG --- CHANGELOG.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9567247..472c08a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file, per [the Ke ## [Unreleased] +## [1.2.0] - 2021-09-01 +### Added +- Boolean Search Operators Feature. Props [@moraleida](https://github.com/moraleida) and [@Rahmon](https://github.com/Rahmon) via [#7](https://github.com/10up/ElasticPressLabs/pull/7). + ## [1.1.0] - 2021-07-27 ### Added - Integration with [Co-Authors Plus](https://wordpress.org/plugins/co-authors-plus/). Props [@dinhtungdu](https://github.com/dinhtungdu) and [@Rahmon](https://github.com/Rahmon). @@ -12,6 +16,7 @@ All notable changes to this project will be documented in this file, per [the Ke Initial plugin release -[Unreleased]: https://github.com/10up/ElasticPressLabs/compare/1.1.0...HEAD +[Unreleased]: https://github.com/10up/ElasticPressLabs/compare/1.2.0...HEAD +[1.2.0]: https://github.com/10up/ElasticPressLabs/compare/1.1.0...1.2.0 [1.1.0]: https://github.com/10up/ElasticPressLabs/compare/1.0.0...1.1.0 [1.0.0]: https://github.com/10up/ElasticPressLabs/releases/tag/1.0.0 From 6ca7224ce181b12ab537f51aca26dbf1baff142d Mon Sep 17 00:00:00 2001 From: Ramon Date: Wed, 1 Sep 2021 10:28:25 -0300 Subject: [PATCH 14/24] Update version --- elasticpresslabs.php | 2 +- package-lock.json | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/elasticpresslabs.php b/elasticpresslabs.php index fa0ec48..86e31ab 100644 --- a/elasticpresslabs.php +++ b/elasticpresslabs.php @@ -3,7 +3,7 @@ * Plugin Name: ElasticPress Labs * Plugin URI: https://github.com/10up/ElasticPressLabs * Description: A developer focused interface to commonly ElasticPress plugin issues. - * Version: 1.1.0 + * Version: 1.2.0 * Requires at least: 4.9 * Requires PHP: 7.2 * Author: 10up diff --git a/package-lock.json b/package-lock.json index 8f7ffbb..434042f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "elasticpress-labs", - "version": "1.1.0", + "version": "1.2.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 334dd31..ebc1e1c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "elasticpress-labs", - "version": "1.1.0", + "version": "1.2.0", "description": "ElasticPress Labs", "author": { "name": "10up", From 5c70a27e20f6580daccb271703cdbc1dabcb15a6 Mon Sep 17 00:00:00 2001 From: Ramon Date: Wed, 1 Sep 2021 10:28:43 -0300 Subject: [PATCH 15/24] Update .pot --- languages/ElasticPressLabs.pot | 55 ++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/languages/ElasticPressLabs.pot b/languages/ElasticPressLabs.pot index 7edc876..1d197ad 100644 --- a/languages/ElasticPressLabs.pot +++ b/languages/ElasticPressLabs.pot @@ -2,14 +2,14 @@ # This file is distributed under the same license as the ElasticPress Labs plugin. msgid "" msgstr "" -"Project-Id-Version: ElasticPress Labs 1.1.0\n" +"Project-Id-Version: ElasticPress Labs 1.2.0\n" "Report-Msgid-Bugs-To: https://github.com/10up/ElasticPressLabs\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2021-07-16T21:42:24+00:00\n" +"POT-Creation-Date: 2021-09-01T13:26:52+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.4.0\n" "X-Domain: elasticpress-labs\n" @@ -35,6 +35,57 @@ msgstr "" msgid "https://10up.com" msgstr "" +#: includes/classes/Feature/BooleanSearchOperators.php:32 +msgid "Boolean Search Operators" +msgstr "" + +#: includes/classes/Feature/BooleanSearchOperators.php:295 +msgid "This feature requires the \"Post Search\" feature to be enabled" +msgstr "" + +#: includes/classes/Feature/BooleanSearchOperators.php:306 +msgid "Allow boolean operators in search queries" +msgstr "" + +#: includes/classes/Feature/BooleanSearchOperators.php:315 +msgid "Allows users to search using the following boolean operators:" +msgstr "" + +#. translators: 1: +, 2: AND +#: includes/classes/Feature/BooleanSearchOperators.php:322 +msgid "%1$s or %2$s signifies AND operation. eg.: modern +art, modern AND art" +msgstr "" + +#. translators: 1: |, 2: OR +#: includes/classes/Feature/BooleanSearchOperators.php:334 +msgid "%1$s or %2$s signifies OR operation. eg.: modern | art, modern OR art" +msgstr "" + +#. translators: 1: -, 2: NOT +#: includes/classes/Feature/BooleanSearchOperators.php:346 +msgid "%1$s or %2$s signifies NOT operation. eg.: modern -art, modern NOT art" +msgstr "" + +#. translators: 1: " +#: includes/classes/Feature/BooleanSearchOperators.php:358 +msgid "%1$s wraps characters to signify a phrase. eg.: \"modern art\"" +msgstr "" + +#. translators: 1: * +#: includes/classes/Feature/BooleanSearchOperators.php:369 +msgid "%1$s signifies a prefix wildcard. eg.: art*" +msgstr "" + +#. translators: 1: () +#: includes/classes/Feature/BooleanSearchOperators.php:380 +msgid "%1$s signifies precedence. eg.: (MoMA OR (modern AND art))" +msgstr "" + +#. translators: 1: ~# +#: includes/classes/Feature/BooleanSearchOperators.php:391 +msgid "%1$s signifies slop if used on a phrase. eg.: \"modern art\"~2. Signifies fuzziness if used on a word: eg: modern~1" +msgstr "" + #: includes/classes/Feature/CoAuthorsPlus.php:34 msgid "Co-Authors Plus" msgstr "" From 5c4df9d99a5ba9da598003a722d540f495ab1c95 Mon Sep 17 00:00:00 2001 From: Jeffrey Paul Date: Wed, 1 Sep 2021 08:42:42 -0500 Subject: [PATCH 16/24] Update CHANGELOG.md --- CHANGELOG.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 472c08a..302fd83 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,13 +10,13 @@ All notable changes to this project will be documented in this file, per [the Ke ## [1.1.0] - 2021-07-27 ### Added -- Integration with [Co-Authors Plus](https://wordpress.org/plugins/co-authors-plus/). Props [@dinhtungdu](https://github.com/dinhtungdu) and [@Rahmon](https://github.com/Rahmon). +- Integration with [Co-Authors Plus](https://wordpress.org/plugins/co-authors-plus/). Props [@dinhtungdu](https://github.com/dinhtungdu) and [@Rahmon](https://github.com/Rahmon) via [#4](https://github.com/10up/ElasticPressLabs/pull/4). ### [1.0.0] - 2021-02-09 +### Added +- Initial plugin release. -Initial plugin release - -[Unreleased]: https://github.com/10up/ElasticPressLabs/compare/1.2.0...HEAD +[Unreleased]: https://github.com/10up/ElasticPressLabs/compare/trunk...develop [1.2.0]: https://github.com/10up/ElasticPressLabs/compare/1.1.0...1.2.0 [1.1.0]: https://github.com/10up/ElasticPressLabs/compare/1.0.0...1.1.0 [1.0.0]: https://github.com/10up/ElasticPressLabs/releases/tag/1.0.0 From f91f3dcf86623c8e2f414a797ace00e3014f2ee8 Mon Sep 17 00:00:00 2001 From: Jeffrey Paul Date: Wed, 1 Sep 2021 08:47:56 -0500 Subject: [PATCH 17/24] additional version bump in elasticpresslabs.php --- elasticpresslabs.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/elasticpresslabs.php b/elasticpresslabs.php index 86e31ab..6c905fc 100644 --- a/elasticpresslabs.php +++ b/elasticpresslabs.php @@ -17,7 +17,7 @@ */ // Useful global constants. -define( 'ELASTICPRESS_LABS_VERSION', '1.1.0' ); +define( 'ELASTICPRESS_LABS_VERSION', '1.2.0' ); define( 'ELASTICPRESS_LABS_URL', plugin_dir_url( __FILE__ ) ); define( 'ELASTICPRESS_LABS_PATH', plugin_dir_path( __FILE__ ) ); define( 'ELASTICPRESS_LABS_INC', ELASTICPRESS_LABS_PATH . 'includes/' ); From 2236d7369565be3462a246530b9bfccd0fc15d1d Mon Sep 17 00:00:00 2001 From: Jeffrey Paul Date: Wed, 1 Sep 2021 08:51:49 -0500 Subject: [PATCH 18/24] Update README.md --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index eb54bd7..461f345 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,10 @@ # ElasticPress Labs - A developer focused interface to commonly [ElasticPress plugin](https://github.com/10up/ElasticPress/) issues +> A developer focused interface to commonly [ElasticPress plugin](https://github.com/10up/ElasticPress/) issues -**Please note:** trunk is the stable branch +[![Support Level](https://img.shields.io/badge/support-active-green.svg)](#support-level) [![Tests](https://github.com/10up/ElasticPressLabs/actions/workflows/test.yml/badge.svg)](https://github.com/10up/ElasticPressLabs/actions/workflows/test.yml) [![Linting](https://github.com/10up/ElasticPressLabs/actions/workflows/lint.yml/badge.svg)](https://github.com/10up/ElasticPressLabs/actions/workflows/lint.yml) [![Release Version](https://img.shields.io/github/release/10up/ElasticPressLabs.svg)](https://github.com/10up/ElasticPressLabs/releases/latest) ![WordPress tested up to version](https://img.shields.io/badge/WordPress-v5.0%20tested-success.svg) [![GPLv2 License](https://img.shields.io/github/license/10up/ElasticPressLabs.svg)](https://github.com/10up/ElasticPressLabs/blob/develop/LICENSE.md) + +**Please note:** `trunk` is the stable branch ## Overview @@ -44,4 +46,3 @@ If you identify any errors or have an idea for improving the plugin, please [ope

- From 548f2893819048ab4e6454decb84e007718c7992 Mon Sep 17 00:00:00 2001 From: Jeffrey Paul Date: Wed, 1 Sep 2021 09:07:55 -0500 Subject: [PATCH 19/24] Update README.md --- README.md | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 461f345..363a695 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # ElasticPress Labs -> A developer focused interface to commonly [ElasticPress plugin](https://github.com/10up/ElasticPress/) issues +> A developer-focused interface to enabling experimental [ElasticPress plugin](https://github.com/10up/ElasticPress/) features. [![Support Level](https://img.shields.io/badge/support-active-green.svg)](#support-level) [![Tests](https://github.com/10up/ElasticPressLabs/actions/workflows/test.yml/badge.svg)](https://github.com/10up/ElasticPressLabs/actions/workflows/test.yml) [![Linting](https://github.com/10up/ElasticPressLabs/actions/workflows/lint.yml/badge.svg)](https://github.com/10up/ElasticPressLabs/actions/workflows/lint.yml) [![Release Version](https://img.shields.io/github/release/10up/ElasticPressLabs.svg)](https://github.com/10up/ElasticPressLabs/releases/latest) ![WordPress tested up to version](https://img.shields.io/badge/WordPress-v5.0%20tested-success.svg) [![GPLv2 License](https://img.shields.io/github/license/10up/ElasticPressLabs.svg)](https://github.com/10up/ElasticPressLabs/blob/develop/LICENSE.md) @@ -8,16 +8,11 @@ ## Overview -This plugin provides a developer focused interface to commonly used filters without the need -of being fully accessible and skipping the need of providing a streamlined used experience. -It's meant to be an easy way to solve common issues without code changes. +This plugin provides a developer-focused interface to commonly used filters without the need of being fully accessible and skipping the need of providing a streamlined user experience. It's meant to be an easy way to solve common issues without code changes. ## Documentation -ElasticPress Labs acts as a ElasticPress feature and registers its methods through the -[ElasticPress Feature -API](http://10up.github.io/ElasticPress/tutorial-feature-api.html). In this way the -features added to this plugin will be immediately available in the ElasticPress interface. +ElasticPress Labs acts as an ElasticPress feature and registers its methods through the [ElasticPress Feature API](http://10up.github.io/ElasticPress/tutorial-feature-api.html). In this way the features added to this plugin will be immediately available in the ElasticPress interface. This plugin provides a simple interface to enable and disable features. @@ -36,11 +31,6 @@ If you identify any errors or have an idea for improving the plugin, please [ope **Active:** 10up is actively working on this, and we expect to continue work for the foreseeable future including keeping tested up to the most recent version of WordPress. Bug reports, feature requests, questions, and pull requests are welcome. -## Changelog - -### 1.0.0 -- Initial plugin release - ## Like what you see?

From 69792ddfe021f2006ecf7d6939053fff91c2304e Mon Sep 17 00:00:00 2001 From: Jeffrey Paul Date: Wed, 1 Sep 2021 09:15:22 -0500 Subject: [PATCH 20/24] add missing props to CHANGELOG.md --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 302fd83..12941d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,11 +6,11 @@ All notable changes to this project will be documented in this file, per [the Ke ## [1.2.0] - 2021-09-01 ### Added -- Boolean Search Operators Feature. Props [@moraleida](https://github.com/moraleida) and [@Rahmon](https://github.com/Rahmon) via [#7](https://github.com/10up/ElasticPressLabs/pull/7). +- Boolean Search Operators Feature. Props [@moraleida](https://github.com/moraleida), [@Rahmon](https://github.com/Rahmon), and [@felipeelia](https://github.com/felipeelia) via [#7](https://github.com/10up/ElasticPressLabs/pull/7). ## [1.1.0] - 2021-07-27 ### Added -- Integration with [Co-Authors Plus](https://wordpress.org/plugins/co-authors-plus/). Props [@dinhtungdu](https://github.com/dinhtungdu) and [@Rahmon](https://github.com/Rahmon) via [#4](https://github.com/10up/ElasticPressLabs/pull/4). +- Integration with [Co-Authors Plus](https://wordpress.org/plugins/co-authors-plus/). Props [@dinhtungdu](https://github.com/dinhtungdu), [@Rahmon](https://github.com/Rahmon), and [@mbanusic](https://github.com/mbanusic) via [#4](https://github.com/10up/ElasticPressLabs/pull/4). ### [1.0.0] - 2021-02-09 ### Added From 6a38e39cbb6645fbb14d4dcfcceecab12d2e6c5f Mon Sep 17 00:00:00 2001 From: Jeffrey Paul Date: Wed, 1 Sep 2021 09:16:05 -0500 Subject: [PATCH 21/24] Create readme.txt --- readme.txt | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 readme.txt diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..be5c15a --- /dev/null +++ b/readme.txt @@ -0,0 +1,30 @@ +=== ElasticPress Labs === +Contributors: 10up +Tags: Elasticsearch, ElasticPress, search, boolean, Co-Authors Plus +Requires at least: 4.9 +Tested up to: 5.0 +Stable tag: 1.2.0 +Requires PHP: 7.2 +License: GPLv2 or later +License URI: https://www.gnu.org/licenses/gpl-2.0.html + +A developer-focused interface to enabling experimental ElasticPress plugin features. + +== Description == + +This plugin provides a developer-focused interface to commonly used filters without the need of being fully accessible and skipping the need of providing a streamlined user experience. It's meant to be an easy way to solve common issues without code changes. + +ElasticPress Labs acts as an ElasticPress feature and registers its methods through the [ElasticPress Feature API](http://10up.github.io/ElasticPress/tutorial-feature-api.html). In this way the features added to this plugin will be immediately available in the ElasticPress interface. + +This plugin provides a simple interface to enable and disable features. + +== Changelog == + += 1.2.0 = +* **Added:** Boolean Search Operators Feature. Props [@moraleida](https://github.com/moraleida), [@Rahmon](https://github.com/Rahmon), and [@felipeelia](https://github.com/felipeelia). + += 1.1.0 = +* **Added:** Integration with [Co-Authors Plus](https://wordpress.org/plugins/co-authors-plus/). Props [@dinhtungdu](https://github.com/dinhtungdu), [@Rahmon](https://github.com/Rahmon), and [@mbanusic](https://github.com/mbanusic). + += 1.0.0 = +* Initial plugin release. From d0745e857d669a343e03a486ef887afe1e9ba282 Mon Sep 17 00:00:00 2001 From: Jeffrey Paul Date: Wed, 1 Sep 2021 09:19:24 -0500 Subject: [PATCH 22/24] update WP minimum to 3.7.1 in readme.txt --- readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.txt b/readme.txt index be5c15a..1c9594d 100644 --- a/readme.txt +++ b/readme.txt @@ -1,7 +1,7 @@ === ElasticPress Labs === Contributors: 10up Tags: Elasticsearch, ElasticPress, search, boolean, Co-Authors Plus -Requires at least: 4.9 +Requires at least: 3.7.1 Tested up to: 5.0 Stable tag: 1.2.0 Requires PHP: 7.2 From bbfb3d6bef06630abffd033268d316fd6084aba4 Mon Sep 17 00:00:00 2001 From: Ramon Date: Wed, 1 Sep 2021 16:30:40 -0300 Subject: [PATCH 23/24] Update readme.txt --- readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.txt b/readme.txt index 1c9594d..447cb10 100644 --- a/readme.txt +++ b/readme.txt @@ -2,7 +2,7 @@ Contributors: 10up Tags: Elasticsearch, ElasticPress, search, boolean, Co-Authors Plus Requires at least: 3.7.1 -Tested up to: 5.0 +Tested up to: 5.8 Stable tag: 1.2.0 Requires PHP: 7.2 License: GPLv2 or later From b580c608358131df4949fe712eb56bd57f5bb7d2 Mon Sep 17 00:00:00 2001 From: Ramon Date: Wed, 1 Sep 2021 17:08:15 -0300 Subject: [PATCH 24/24] Add screenshots --- .wordpress-org/screenshot-1.jpg | Bin 0 -> 81975 bytes .wordpress-org/screenshot-2.jpg | Bin 0 -> 142791 bytes .wordpress-org/screenshot-3.jpg | Bin 0 -> 91747 bytes .wordpress-org/screenshot-4.jpg | Bin 0 -> 119297 bytes .wordpress-org/screenshot-5.jpg | Bin 0 -> 120500 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 .wordpress-org/screenshot-1.jpg create mode 100644 .wordpress-org/screenshot-2.jpg create mode 100644 .wordpress-org/screenshot-3.jpg create mode 100644 .wordpress-org/screenshot-4.jpg create mode 100644 .wordpress-org/screenshot-5.jpg diff --git a/.wordpress-org/screenshot-1.jpg b/.wordpress-org/screenshot-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fed024ada554b0aa6adaefb20678547050bc544c GIT binary patch literal 81975 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