[COT] `OrdersTableQuery`: ignore invalid elements in `meta_query` (#34347)

Handle invalid `meta_query` similarly to `WP_Query`

`meta_query` needs to be an array of arrays. Elements in `meta_query` that do not conform to the expected format will be ignored.

* Expose the SQL query in OrdersTableQuery for debugging purposes (similar to WP_Query)

* Add changelog

* Drop unnecessary `is_array()` check
This commit is contained in:
Jorge A. Torres 2022-08-19 13:26:57 -05:00 committed by GitHub
parent 87835e3af9
commit dd070e63e4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 23 additions and 20 deletions

View File

@ -0,0 +1,4 @@
Significance: minor
Type: tweak
Add support for an atomic `meta_query` arg in COT's order query code.

View File

@ -148,31 +148,28 @@ class OrdersTableMetaQuery {
private function sanitize_meta_query( array $q ): array {
$sanitized = array();
if ( $this->is_atomic( $q ) ) {
if ( isset( $q['value'] ) && array() === $q['value'] ) {
unset( $q['value'] );
}
$q['compare'] = isset( $q['compare'] ) ? strtoupper( $q['compare'] ) : ( isset( $q['value'] ) && is_array( $q['value'] ) ? 'IN' : '=' );
$q['compare_key'] = isset( $q['compare_key'] ) ? strtoupper( $q['compare_key'] ) : ( isset( $q['key'] ) && is_array( $q['key'] ) ? 'IN' : '=' );
if ( ! in_array( $q['compare'], self::NON_NUMERIC_OPERATORS, true ) && ! in_array( $q['compare'], self::NUMERIC_OPERATORS, true ) ) {
$q['compare'] = '=';
}
if ( ! in_array( $q['compare_key'], self::NON_NUMERIC_OPERATORS, true ) ) {
$q['compare_key'] = '=';
}
return $q;
}
// Nested.
foreach ( $q as $key => $arg ) {
if ( 'relation' === $key ) {
$relation = $arg;
} elseif ( ! is_array( $arg ) ) {
continue;
} elseif ( $this->is_atomic( $arg ) ) {
if ( isset( $arg['value'] ) && array() === $arg['value'] ) {
unset( $arg['value'] );
}
$arg['compare'] = isset( $arg['compare'] ) ? strtoupper( $arg['compare'] ) : ( isset( $arg['value'] ) && is_array( $arg['value'] ) ? 'IN' : '=' );
$arg['compare_key'] = isset( $arg['compare_key'] ) ? strtoupper( $arg['compare_key'] ) : ( isset( $arg['key'] ) && is_array( $arg['key'] ) ? 'IN' : '=' );
if ( ! in_array( $arg['compare'], self::NON_NUMERIC_OPERATORS, true ) && ! in_array( $arg['compare'], self::NUMERIC_OPERATORS, true ) ) {
$arg['compare'] = '=';
}
if ( ! in_array( $arg['compare_key'], self::NON_NUMERIC_OPERATORS, true ) ) {
$arg['compare_key'] = '=';
}
$sanitized[ $key ] = $arg;
} else {
$sanitized_arg = $this->sanitize_meta_query( $arg );

View File

@ -961,6 +961,8 @@ class OrdersTableQuery {
case 'posts':
case 'orders':
return $this->results;
case 'request':
return $this->sql;
default:
break;
}