PluginProbe
Listdom: AI-powered Business Directory with Classifieds Ads Listings / trunk
Listdom: AI-powered Business Directory with Classifieds Ads Listings vtrunk
6.0.0 5.9.0 5.8.1 5.8.0 5.7.0 5.6.0 trunk 1.0.0 1.0.1 1.0.2 1.1.0 1.1.1 1.2.0 1.2.1 1.3.0 1.3.1 1.4.0 1.5.0 1.6.0 1.6.1 1.6.2 1.6.3 1.7.0 1.8.0 1.9.0 All 75 releases
listdom / app / includes / query.php

query.php in Listdom: AI-powered Business Directory with Classifieds Ads Listings trunk, at app/includes/query.php

343 lines 8.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 class LSD_Query extends LSD_Base
4 {
5 public static function attribute($key, $value)
6 {
7 $id = '';
8 $type = '';
9
10 $operators = [
11 'neq',
12 'grq',
13 'grb',
14 'lwq',
15 'nlk',
16 'nin',
17 'nbt',
18 'nex',
19 'eq',
20 'gr',
21 'lw',
22 'lk',
23 'in',
24 'bt',
25 'ex',
26 ];
27
28 foreach ($operators as $operator)
29 {
30 $suffix = '-' . $operator;
31 if (substr($key, -strlen($suffix)) !== $suffix) continue;
32
33 $id = substr($key, 0, -strlen($suffix));
34 $type = $operator;
35 break;
36 }
37
38 if ($id === '' || $type === '') return false;
39
40 if ($id == 'address') $field = 'lsd_address';
41 else if ($id == 'price') $field = 'lsd_price';
42 else if ($id == 'class') $field = 'lsd_price_class';
43 else if ($id == 'rate') $field = 'lsd_rate';
44 else if (strpos($id, 'revf-') === 0)
45 {
46 if (!class_exists(\LSDPACREV\Reviews::class)) return false;
47
48 $field = \LSDPACREV\Reviews::review_field_meta_key(substr($id, 5));
49 }
50 else if ($id == 'acf_fields') $field = 'acf_fields';
51 else $field = 'lsd_attribute_' . LSD_Main::get_attr_slug($id);
52
53 if (($id === 'rate' || strpos($id, 'revf-') === 0) && is_numeric($value) && (float) $value <= 0) return false;
54
55 $query = [];
56 switch ($type)
57 {
58 case 'eq':
59
60 $query = [
61 'key' => $field,
62 'value' => $value,
63 'compare' => '=',
64 ];
65
66 break;
67
68 case 'neq':
69
70 $query = [
71 'key' => $field,
72 'value' => $value,
73 'compare' => '!=',
74 ];
75
76 break;
77
78 case 'gr':
79
80 $query = [
81 'key' => $field,
82 'value' => $value,
83 'compare' => '>',
84 'type' => 'NUMERIC',
85 ];
86
87 break;
88
89 case 'grq':
90
91 $query = [
92 'key' => $field,
93 'value' => $value,
94 'compare' => '>=',
95 'type' => 'NUMERIC',
96 ];
97
98 break;
99
100 case 'grb':
101
102 $query = [
103 'key' => $field,
104 'value' => explode(':', rtrim($value, ':')),
105 'type' => 'NUMERIC',
106 'compare' => 'BETWEEN',
107 ];
108
109 break;
110
111 case 'lw':
112
113 $query = [
114 'key' => $field,
115 'value' => $value,
116 'compare' => '<',
117 'type' => 'NUMERIC',
118 ];
119
120 break;
121
122 case 'lwq':
123
124 $query = [
125 'key' => $field,
126 'value' => $value,
127 'compare' => '<=',
128 'type' => 'NUMERIC',
129 ];
130
131 break;
132
133 case 'lk':
134
135 $query = [
136 'key' => $field,
137 'value' => $value,
138 'compare' => 'LIKE',
139 ];
140
141 break;
142
143 case 'nlk':
144
145 $query = [
146 'key' => $field,
147 'value' => $value,
148 'compare' => 'NOT LIKE',
149 ];
150
151 break;
152
153 case 'in':
154
155 $values = self::normalize_multi_values($value);
156 if (!count($values)) break;
157
158 $query = [
159 'relation' => 'OR',
160 [
161 'key' => $field,
162 'value' => $values,
163 'compare' => 'IN',
164 ],
165 ];
166
167 foreach ($values as $v)
168 {
169 $query[] = [
170 'key' => $field,
171 'value' => self::regexp_csv_pattern($v),
172 'compare' => 'REGEXP',
173 ];
174 }
175
176 break;
177
178 case 'nin':
179
180 $values = self::normalize_multi_values($value);
181 if (!count($values)) break;
182
183 $query = [
184 'relation' => 'AND',
185 [
186 'key' => $field,
187 'value' => $values,
188 'compare' => 'NOT IN',
189 ],
190 ];
191
192 foreach ($values as $v)
193 {
194 $query[] = [
195 'key' => $field,
196 'value' => self::regexp_csv_pattern($v),
197 'compare' => 'NOT REGEXP',
198 ];
199 }
200
201 break;
202
203 case 'bt':
204
205 $query = [
206 'key' => $field,
207 'value' => explode(':', $value),
208 'type' => 'NUMERIC',
209 'compare' => 'BETWEEN',
210 ];
211
212 break;
213
214 case 'nbt':
215
216 $query = [
217 'key' => $field,
218 'value' => explode(':', $value),
219 'compare' => 'NOT BETWEEN',
220 ];
221
222 break;
223
224 case 'ex':
225
226 $query = [
227 'key' => $field,
228 'compare' => 'EXISTS',
229 ];
230
231 break;
232
233 case 'nex':
234
235 $query = [
236 'key' => $field,
237 'compare' => 'NOT EXISTS',
238 ];
239
240 break;
241 }
242
243 return count($query) ? $query : false;
244 }
245
246 public static function acf_fields($key, $value)
247 {
248 $type = substr($key, -3);
249 $key_field = substr($key, 0, -4);
250
251 $query = [];
252 switch ($type)
253 {
254 case 'atx':
255 case 'dra':
256 case 'trf':
257
258 $query = [
259 'key' => $key_field,
260 'value' => $value,
261 'compare' => 'LIKE',
262 ];
263
264 break;
265
266 case 'nma':
267
268 $query = [
269 'key' => $key_field,
270 'value' => $value,
271 'compare' => '=',
272 ];
273
274 break;
275
276 case 'nmd':
277
278 $query = [
279 'key' => $key_field,
280 'value' => $value,
281 'compare' => '>=',
282 'type' => 'NUMERIC',
283 ];
284
285 break;
286
287 case 'drm':
288
289 // Force to Array
290 if (!is_array($value)) $value = [$value];
291
292 foreach ($value as $v)
293 {
294 $query[] = [
295 'key' => $key_field,
296 'value' => $v,
297 'compare' => 'LIKE',
298 ];
299 }
300
301 break;
302
303 case 'ara':
304 $value = explode(':', rtrim($value, ':'));
305
306 $query = [
307 'key' => $key_field,
308 'value' => $value,
309 'type' => 'NUMERIC',
310 'compare' => 'BETWEEN',
311 ];
312
313 break;
314
315 }
316
317 return count($query) ? $query : false;
318 }
319
320 private static function normalize_multi_values($value): array
321 {
322 if (!is_array($value)) $value = [$value];
323
324 $normalized = [];
325 foreach ($value as $item)
326 {
327 if (!is_scalar($item)) continue;
328
329 $item = trim((string) $item);
330 if ($item === '') continue;
331
332 $normalized[] = $item;
333 }
334
335 return array_values(array_unique($normalized));
336 }
337
338 private static function regexp_csv_pattern(string $value): string
339 {
340 return '(^|,)' . preg_quote($value, '/') . '(,|$)';
341 }
342 }
343