PluginProbe
Filter Everything — WordPress & WooCommerce Filters / trunk
Filter Everything — WordPress & WooCommerce Filters vtrunk
1.9.6 1.9.5 1.9.4 1.9.3 1.9.2.2 1.9.2.1 trunk 1.2.1 1.2.3 1.2.4 1.2.5 1.3.0 1.3.1 1.3.2 1.4.1 1.4.4 1.4.5 1.4.8 1.4.9 1.5.0 1.5.1 1.6.0 1.6.1 1.6.2 1.6.3 All 51 releases
filter-everything / src / Entities / PostMetaTrait.php

PostMetaTrait.php in Filter Everything — WordPress & WooCommerce Filters trunk, at src/Entities/PostMetaTrait.php

189 lines 5.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace FilterEverything\Filter;
4
5 trait PostMetaTrait
6 {
7 private function findNestedIndexForQuery( $meta_query_array )
8 {
9 $meta_key = $meta_query_array['key'];
10
11 if( empty( $this->new_meta_query ) ){
12 return 0;
13 }
14
15 foreach ( $this->new_meta_query as $i_level_1 => $maybe_meta_query ){
16 // This subquery already exists
17 if( isset( $maybe_meta_query[0]['key'] ) && $maybe_meta_query[0]['key'] === $meta_key ){
18 return $i_level_1;
19 }
20 }
21
22 return count( $this->new_meta_query );
23 }
24
25 private function hasNestedQueries( $meta_query )
26 {
27 if( isset( $meta_query[0]['key'] ) ){
28 return true;
29 }
30
31 return false;
32 }
33
34 private function isTheSameMetaQuery( $meta_query_1, $meta_query_2 )
35 {
36 $meta_query_1 = $this->normalizeMetaQueryArray( $meta_query_1 );
37 $meta_query_2 = $this->normalizeMetaQueryArray( $meta_query_2 );
38
39 $diff = array_diff( $meta_query_1, $meta_query_2 );
40
41 if ( empty( $diff ) ){
42 return true;
43 }
44
45 return false;
46 }
47
48 private function normalizeMetaQueryArray( $meta_query )
49 {
50 $normalized_meta_query = [];
51
52 if( ! is_array( $meta_query ) || ! isset( $meta_query['key'] ) ){
53 return false;
54 }
55 if( isset( $meta_query['value'] ) ){
56 if( is_array( $meta_query['value'] ) ){
57 sort( $meta_query['value'] );
58 $meta_query['value'] = implode( '-', $meta_query['value'] );
59 $normalized_meta_query['value'] = $meta_query['value'];
60 }else{
61 $normalized_meta_query['value'] = $meta_query['value'];
62 }
63 }
64
65 $normalized_meta_query['key'] = $meta_query['key'];
66 if( isset( $meta_query['compare'] ) ){
67 $normalized_meta_query['compare'] = isset( $meta_query['compare'] ) ? $meta_query['compare'] : '';
68 }
69
70 return $normalized_meta_query;
71 }
72
73 public function importExistingMetaQuery( $wp_query )
74 {
75 // Try to check if there is meta_key, meta_value and meta_compare
76 if( $wp_query->get('meta_key') ){
77 $this->addMetaKeyToQuery( $wp_query );
78 }
79
80 $already_existing_meta_query = $wp_query->get('meta_query');
81
82 if( is_array( $already_existing_meta_query ) ){
83 foreach( $already_existing_meta_query as $top_index => $value ){
84
85 if( $this->hasNestedQueries( $value ) ){
86 foreach( $value as $n => $nested_meta_query ){
87 $this->addMetaQueryArray( $nested_meta_query, $value['relation'], $top_index );
88 }
89 }else{
90 $this->addMetaQueryArray( $value );
91 }
92
93 }
94 }
95 }
96
97 public function addMetaKeyToQuery( $wp_query )
98 {
99 $args = [];
100
101 $args['key'] = $wp_query->get( 'meta_key' );
102 if( $wp_query->get( 'meta_value' ) ){
103 $args['value'] = $wp_query->get( 'meta_value' );
104 $args['compare'] = ( $compare = $wp_query->get( 'meta_compare' ) ) ? $compare : 'IN';
105 }
106
107 $wp_query->set( 'meta_key', '' );
108 $wp_query->set( 'meta_value', '' );
109
110 $this->addMetaQueryArray( $args );
111 }
112
113 public function isTermAlreadyInQuery( $queried_value, $wp_query )
114 {
115 // Is term in Key
116 if( $duplicate = $this->isTermInMetaKey( $queried_value, $wp_query ) ) {
117 return $duplicate;
118 }
119 // Is term in Query
120 if( $duplicate = $this->isTermInMetaQuery( $queried_value, $wp_query ) ) {
121 return $duplicate;
122 }
123
124 return false;
125 }
126
127 private function isTermInMetaKey( $queried_value, $wp_query ){
128 $duplicate = [];
129 $terms = $queried_value['values'];
130 $meta_key = $wp_query->get('meta_key');
131 $meta_value = $wp_query->get('meta_value');
132
133 foreach ( $terms as $term ) {
134 if( $queried_value['e_name'] === $meta_key ){
135 if( $meta_value === $term ){
136 $duplicate['post_meta'] = $queried_value['e_name'];
137 $duplicate['term'] = $term;
138 return $duplicate;
139 }
140 }
141 }
142
143 return false;
144 }
145
146 protected function addMetaQueryArray( $meta_query_array, $relation = false, $top_index = false )
147 {
148 if( ! isset( $meta_query_array['key'] ) ){
149 return false;
150 }
151
152 $existing_meta_query = $this->new_meta_query;
153
154 foreach ($existing_meta_query as $index => $present_query) {
155
156 if ($this->hasNestedQueries($present_query)) {
157 foreach ($present_query as $k => $nested_present_query) {
158
159 if (!isset($nested_present_query['key'])) {
160 // relation arg
161 continue;
162 }
163 if ($this->isTheSameMetaQuery($nested_present_query, $meta_query_array)) {
164 return false;
165 }
166 }
167 } else {
168 if ($this->isTheSameMetaQuery($present_query, $meta_query_array)) {
169 return false;
170 }
171 }
172
173 }
174
175 if ( $relation && in_array( $relation, array( 'AND', 'OR' ) ) ) {
176 if( $top_index !== false ) {
177 $nested_index = $top_index;
178 }else{
179 $nested_index = $this->findNestedIndexForQuery( $meta_query_array );
180 }
181
182 $this->new_meta_query[$nested_index][] = $meta_query_array;
183 $this->new_meta_query[$nested_index]['relation'] = $relation;
184 } else {
185 $this->new_meta_query[] = $meta_query_array;
186 }
187
188 }
189 }