[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:
parent
87835e3af9
commit
dd070e63e4
|
@ -0,0 +1,4 @@
|
|||
Significance: minor
|
||||
Type: tweak
|
||||
|
||||
Add support for an atomic `meta_query` arg in COT's order query code.
|
|
@ -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 );
|
||||
|
||||
|
|
|
@ -961,6 +961,8 @@ class OrdersTableQuery {
|
|||
case 'posts':
|
||||
case 'orders':
|
||||
return $this->results;
|
||||
case 'request':
|
||||
return $this->sql;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue