| @@ -7,9 +7,9 @@ | ||
| 7 | 7 | */ |
| 8 | 8 | |
| 9 | 9 | namespace ElasticPress\Indexable\Post; |
| 10 | 10 | |
| 11 | -use \WP_Date_Query; | |
| 11 | +use WP_Date_Query; | |
| 12 | 12 | |
| 13 | 13 | if ( ! defined( 'ABSPATH' ) ) { |
| 14 | 14 | // @codeCoverageIgnoreStart |
| 15 | 15 | exit; // Exit if accessed directly. |
| @@ -80,9 +80,8 @@ | ||
| 80 | 80 | } |
| 81 | 81 | } |
| 82 | 82 | } |
| 83 | 83 | |
| 84 | - // @todo implement OR filter relationships. | |
| 85 | 84 | if ( empty( $relation ) ) { |
| 86 | 85 | $relation = 'AND'; |
| 87 | 86 | } |
| 88 | 87 | |
| @@ -110,8 +109,35 @@ | ||
| 110 | 109 | $filter_array['and'] = array( |
| 111 | 110 | 'bool' => $this->build_es_date_term_filter( $term_filters ), |
| 112 | 111 | ); |
| 113 | 112 | } |
| 113 | + } elseif ( 'OR' === $relation ) { | |
| 114 | + $should_clauses = []; | |
| 115 | + foreach ( $filter_chunks['filters'] as $filter ) { | |
| 116 | + | |
| 117 | + $group = []; | |
| 118 | + if ( ! empty( $filter['range_filters'] ) ) { | |
| 119 | + $group[] = [ 'range' => $filter['range_filters'] ]; | |
| 120 | + } | |
| 121 | + | |
| 122 | + if ( ! empty( $filter['date_terms'] ) ) { | |
| 123 | + foreach ( $filter['date_terms']['must'] ?? [] as $must_clause ) { | |
| 124 | + $group[] = $must_clause; | |
| 125 | + } | |
| 126 | + } | |
| 127 | + | |
| 128 | + if ( $group ) { | |
| 129 | + $should_clauses[] = [ 'bool' => [ 'must' => $group ] ]; | |
| 130 | + } | |
| 131 | + } | |
| 132 | + | |
| 133 | + if ( $should_clauses ) { | |
| 134 | + $filter_array['or'] = [ | |
| 135 | + 'bool' => [ | |
| 136 | + 'should' => $should_clauses, | |
| 137 | + ], | |
| 138 | + ]; | |
| 139 | + } | |
| 114 | 140 | } |
| 115 | 141 | |
| 116 | 142 | return $filter_array; |
| 117 | 143 | } |
| @@ -210,9 +236,9 @@ | ||
| 210 | 236 | } |
| 211 | 237 | |
| 212 | 238 | if ( ! empty( $query['before'] ) ) { |
| 213 | 239 | $range_filters = empty( $range_filters[ $column ] ) ? array( "{$column}" => array( "{$lt}" => [] ) ) : $range_filters; |
| 214 | - $range_filters[ $column ][ $lt ] = $this->build_mysql_datetime( $query['before'] ); | |
| 240 | + $range_filters[ $column ][ $lt ] = $this->build_mysql_datetime( $query['before'], $inclusive ); | |
| 215 | 241 | } |
| 216 | 242 | |
| 217 | 243 | if ( ! empty( $query['after'] ) || ! empty( $query['before'] ) ) { |
| 218 | 244 | $filter_parts['range_filters'] = $range_filters; |
| @@ -262,13 +288,13 @@ | ||
| 262 | 288 | $date_terms['must'][]['term'][ "date_terms.{$param}" ] = $value; |
| 263 | 289 | } elseif ( '!=' === $compare ) { |
| 264 | 290 | $date_terms['must_not'][]['term'][ "date_terms.{$param}" ] = $value; |
| 265 | 291 | } elseif ( 'IN' === $compare ) { |
| 266 | - foreach ( $value as $in_value ) { | |
| 292 | + foreach ( (array) $value as $in_value ) { | |
| 267 | 293 | $date_terms['should'][]['term'][ "date_terms.{$param}" ] = $in_value; |
| 268 | 294 | } |
| 269 | 295 | } elseif ( 'NOT IN' === $compare ) { |
| 270 | - foreach ( $value as $in_value ) { | |
| 296 | + foreach ( (array) $value as $in_value ) { | |
| 271 | 297 | $date_terms['must_not'][]['term'][ "date_terms.{$param}" ] = $in_value; |
| 272 | 298 | } |
| 273 | 299 | } elseif ( 'BETWEEN' === $compare ) { |
| 274 | 300 | $range_filter[ "date_terms.{$param}" ] = []; |