PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 3.06.06
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v3.06.06
6.35 6.34 6.33.1 6.33 6.32.1 6.32 6.31 6.25 6.25.1 6.26 6.26.1 6.27 6.28 6.29 6.3 6.3.1 6.3.2 6.30 6.4 6.4.1 6.4.2 6.5 6.5.1 6.5.2 6.5.3 All 141 releases
← All changes | classes/models/FrmEntryMeta.php +199 -409 6.293.06.06 View file →
@@ -4,65 +4,63 @@
4 4 }
5 5
6 6 class FrmEntryMeta {
7 7
8 - /**
9 - * @param int $entry_id
10 - * @param int $field_id
11 - * @param string $meta_key usually set to '' as this parameter is no longer used.
12 - * @param mixed $meta_value
13 - *
14 - * @return int
15 - */
16 - public static function add_entry_meta( $entry_id, $field_id, $meta_key, $meta_value ) {
17 - global $wpdb;
8 + /**
9 + * @param string $meta_key
10 + */
11 + public static function add_entry_meta( $entry_id, $field_id, $meta_key = null, $meta_value ) {
12 + global $wpdb;
18 13
19 - if ( FrmAppHelper::is_empty_value( $meta_value ) ) {
20 - // Don't save blank fields
21 - return 0;
22 - }
14 + if ( FrmAppHelper::is_empty_value( $meta_value ) ) {
15 + // don't save blank fields
16 + return 0;
17 + }
23 18
24 - $new_values = array(
25 - 'meta_value' => is_array( $meta_value ) ? serialize( array_filter( $meta_value, 'FrmAppHelper::is_not_empty_value' ) ) : trim( $meta_value ),
26 - 'item_id' => $entry_id,
27 - 'field_id' => $field_id,
28 - 'created_at' => current_time( 'mysql', 1 ),
29 - );
19 + $new_values = array(
20 + 'meta_value' => is_array( $meta_value ) ? serialize( array_filter( $meta_value, 'FrmAppHelper::is_not_empty_value' ) ) : trim( $meta_value ),
21 + 'item_id' => $entry_id,
22 + 'field_id' => $field_id,
23 + 'created_at' => current_time( 'mysql', 1 ),
24 + );
30 25
31 26 self::set_value_before_save( $new_values );
32 - $new_values = apply_filters( 'frm_add_entry_meta', $new_values );
27 + $new_values = apply_filters( 'frm_add_entry_meta', $new_values );
28 +
33 29 $query_results = $wpdb->insert( $wpdb->prefix . 'frm_item_metas', $new_values );
34 30
35 31 if ( $query_results ) {
36 32 self::clear_cache();
37 33 wp_cache_delete( $entry_id, 'frm_entry' );
38 - return $wpdb->insert_id;
34 + $id = $wpdb->insert_id;
35 + } else {
36 + $id = 0;
39 37 }
40 38
41 - return 0;
42 - }
39 + return $id;
40 + }
43 41
44 42 /**
45 - * @param int $entry_id
46 - * @param int $field_id
47 - * @param string $meta_key Deprecated.
43 + * @param int $entry_id
44 + * @param int $field_id
45 + * @param string $meta_key deprecated
48 46 * @param array|string $meta_value
49 47 *
50 - * @return bool|int
48 + * @return bool|false|int
51 49 */
52 - public static function update_entry_meta( $entry_id, $field_id, $meta_key, $meta_value ) {
53 - if ( ! $field_id ) {
54 - return false;
55 - }
50 + public static function update_entry_meta( $entry_id, $field_id, $meta_key = null, $meta_value ) {
51 + if ( ! $field_id ) {
52 + return false;
53 + }
56 54
57 - global $wpdb;
55 + global $wpdb;
58 56
59 - $values = array(
57 + $values = array(
60 58 'item_id' => $entry_id,
61 59 'field_id' => $field_id,
62 60 );
63 - $where_values = $values;
64 - $values['meta_value'] = $meta_value;
61 + $where_values = $values;
62 + $values['meta_value'] = $meta_value;
65 63 self::set_value_before_save( $values );
66 64 $values = apply_filters( 'frm_update_entry_meta', $values );
67 65
68 66 if ( is_array( $values['meta_value'] ) ) {
@@ -67,9 +65,8 @@
67 65
68 66 if ( is_array( $values['meta_value'] ) ) {
69 67 $values['meta_value'] = array_filter( $values['meta_value'], 'FrmAppHelper::is_not_empty_value' );
70 68 }
71 -
72 69 $meta_value = maybe_serialize( $values['meta_value'] );
73 70
74 71 wp_cache_delete( $entry_id, 'frm_entry' );
75 72 self::clear_cache();
@@ -74,40 +71,28 @@
74 71 wp_cache_delete( $entry_id, 'frm_entry' );
75 72 self::clear_cache();
76 73
77 74 return $wpdb->update( $wpdb->prefix . 'frm_item_metas', array( 'meta_value' => $meta_value ), $where_values );
78 - }
75 + }
79 76
80 77 /**
81 78 * @since 3.0
82 - *
83 - * @param array $values
84 - *
85 - * @return void
86 79 */
87 80 private static function set_value_before_save( &$values ) {
88 81 $field = FrmField::getOne( $values['field_id'] );
89 -
90 - if ( ! $field ) {
91 - return;
82 + if ( $field ) {
83 + $field_obj = FrmFieldFactory::get_field_object( $field );
84 + $values['meta_value'] = $field_obj->set_value_before_save( $values['meta_value'] );
92 85 }
93 -
94 - $field_obj = FrmFieldFactory::get_field_object( $field );
95 - $values['meta_value'] = $field_obj->set_value_before_save( $values['meta_value'] );
96 86 }
97 87
98 88 /**
99 89 * @since 3.0
100 - *
101 - * @param array $atts
102 - * @param mixed $value
103 - *
104 - * @return void
105 90 */
106 91 private static function get_value_to_save( $atts, &$value ) {
107 92 if ( is_object( $atts['field'] ) ) {
108 93 $field_obj = FrmFieldFactory::get_field_object( $atts['field'] );
109 - $value = $field_obj->get_value_to_save(
94 + $value = $field_obj->get_value_to_save(
110 95 $value,
111 96 array(
112 97 'entry_id' => $atts['entry_id'],
113 98 'field_id' => $atts['field_id'],
@@ -117,19 +102,13 @@
117 102
118 103 $value = apply_filters( 'frm_prepare_data_before_db', $value, $atts['field_id'], $atts['entry_id'], array( 'field' => $atts['field'] ) );
119 104 }
120 105
121 - /**
122 - * @param int|string $entry_id
123 - * @param array $values Either indexed by field ID or field key.
124 - *
125 - * @return void
126 - */
127 106 public static function update_entry_metas( $entry_id, $values ) {
128 - global $wpdb;
107 + global $wpdb;
129 108
130 - $previous_field_ids = FrmDb::get_col(
131 - 'frm_item_metas',
109 + $prev_values = FrmDb::get_col(
110 + $wpdb->prefix . 'frm_item_metas',
132 111 array(
133 112 'item_id' => $entry_id,
134 113 'field_id !' => 0,
135 114 ),
@@ -135,100 +114,67 @@
135 114 ),
136 115 'field_id'
137 116 );
138 117
139 - $values_indexed_by_field_id = array();
140 -
141 - foreach ( $values as $field_id_or_key => $meta_value ) {
142 - $field_id = $field_id_or_key;
143 - $field = null;
144 -
145 - if ( $field_id_or_key ) {
146 - $field = FrmField::getOne( $field_id_or_key );
147 -
148 - if ( is_object( $field ) ) {
149 - $field_id = $field->id;
150 - }
118 + foreach ( $values as $field_id => $meta_value ) {
119 + $field = false;
120 + if ( ! empty( $field_id ) ) {
121 + $field = FrmField::getOne( $field_id );
151 122 }
152 123
153 - $values_indexed_by_field_id[ $field_id ] = $meta_value;
154 -
155 124 self::get_value_to_save( compact( 'field', 'field_id', 'entry_id' ), $meta_value );
156 125
157 - if ( ! $previous_field_ids || ! in_array( $field_id, $previous_field_ids, true ) ) {
158 - // If value does not exist, then create it
159 - self::add_entry_meta( $entry_id, $field_id, '', $meta_value );
160 - continue;
161 - }
126 + if ( $prev_values && in_array( $field_id, $prev_values ) ) {
162 127
163 - if ( $meta_value === array() || ( ! is_array( $meta_value ) && trim( $meta_value ) === '' ) ) {
164 - // Remove blank fields.
165 - unset( $values_indexed_by_field_id[ $field_id ] );
128 + if ( ( is_array( $meta_value ) && empty( $meta_value ) ) || ( ! is_array( $meta_value ) && trim( $meta_value ) == '' ) ) {
129 + // remove blank fields
130 + unset( $values[ $field_id ] );
131 + } else {
132 + // if value exists, then update it
133 + self::update_entry_meta( $entry_id, $field_id, '', $meta_value );
134 + }
166 135 } else {
167 - // If value exists, then update it
168 - self::update_entry_meta( $entry_id, $field_id, '', $meta_value );
136 + // if value does not exist, then create it
137 + self::add_entry_meta( $entry_id, $field_id, '', $meta_value );
169 138 }
170 - }//end foreach
139 + }
171 140
172 - if ( ! $previous_field_ids ) {
141 + if ( empty( $prev_values ) ) {
173 142 return;
174 143 }
175 144
176 - $field_ids_to_remove = array_diff( $previous_field_ids, array_keys( $values_indexed_by_field_id ) );
145 + $prev_values = array_diff( $prev_values, array_keys( $values ) );
177 146
178 - if ( ! $field_ids_to_remove ) {
147 + if ( empty( $prev_values ) ) {
179 148 return;
180 149 }
181 150
182 - // Prepare the query
151 + // prepare the query
183 152 $where = array(
184 153 'item_id' => $entry_id,
185 - 'field_id' => $field_ids_to_remove,
154 + 'field_id' => $prev_values,
186 155 );
187 156 FrmDb::get_where_clause_and_values( $where );
188 157
189 158 // Delete any leftovers
190 - $wpdb->query( $wpdb->prepare( 'DELETE FROM ' . $wpdb->prefix . 'frm_item_metas ' . $where['where'], $where['values'] ) ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, SlevomatCodingStandard.Files.LineLength.LineTooLong
159 + $wpdb->query( $wpdb->prepare( 'DELETE FROM ' . $wpdb->prefix . 'frm_item_metas ' . $where['where'], $where['values'] ) ); // WPCS: unprepared SQL ok.
191 160 self::clear_cache();
192 - }
161 + }
193 162
194 - /**
195 - * @param int $old_id
196 - * @param int $new_id
197 - *
198 - * @return void
199 - */
200 163 public static function duplicate_entry_metas( $old_id, $new_id ) {
201 164 $metas = self::get_entry_meta_info( $old_id );
202 -
203 - /**
204 - * Allows changing entry duplicate values before save.
205 - *
206 - * @since 5.4.4
207 - *
208 - * @param array $metas The list of entry meta values.
209 - */
210 - $metas = apply_filters( 'frm_before_duplicate_entry_values', $metas );
211 -
212 165 foreach ( $metas as $meta ) {
213 - self::add_entry_meta( $new_id, $meta->field_id, '', $meta->meta_value );
166 + self::add_entry_meta( $new_id, $meta->field_id, null, $meta->meta_value );
214 167 unset( $meta );
215 168 }
216 169 self::clear_cache();
217 170 }
218 171
219 - /**
220 - * @param int $entry_id
221 - * @param int $field_id
222 - *
223 - * @return false|int
224 - */
225 172 public static function delete_entry_meta( $entry_id, $field_id ) {
226 - global $wpdb;
173 + global $wpdb;
227 174 self::clear_cache();
228 -
229 175 return $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}frm_item_metas WHERE field_id=%d AND item_id=%d", $field_id, $entry_id ) );
230 - }
176 + }
231 177
232 178 /**
233 179 * Clear entry meta caching
234 180 * Called when a meta is added or changed
@@ -233,10 +179,8 @@
233 179 * Clear entry meta caching
234 180 * Called when a meta is added or changed
235 181 *
236 182 * @since 2.0.5
237 - *
238 - * @return void
239 183 */
240 184 public static function clear_cache() {
241 185 FrmDb::cache_delete_group( 'frm_entry_meta' );
242 186 FrmDb::cache_delete_group( 'frm_item_meta' );
@@ -243,162 +187,121 @@
243 187 }
244 188
245 189 /**
246 190 * @since 2.0.9
247 - *
248 - * @param stdClass $entry
249 - * @param int|string $field_id
250 - *
251 - * @return mixed
252 191 */
253 192 public static function get_meta_value( $entry, $field_id ) {
254 193 if ( isset( $entry->metas ) ) {
255 - return $entry->metas[ $field_id ] ?? false;
194 + return isset( $entry->metas[ $field_id ] ) ? $entry->metas[ $field_id ] : false;
195 + } else {
196 + return self::get_entry_meta_by_field( $entry->id, $field_id );
256 197 }
257 - return self::get_entry_meta_by_field( $entry->id, $field_id );
258 198 }
259 199
260 - /**
261 - * @param int|object|string $entry_id
262 - * @param int|string $field_id This function supports field keys as field id.
263 - *
264 - * @return mixed
265 - */
266 200 public static function get_entry_meta_by_field( $entry_id, $field_id ) {
267 - global $wpdb;
201 + global $wpdb;
268 202
269 203 if ( is_object( $entry_id ) ) {
270 - $entry = $entry_id;
204 + $entry = $entry_id;
271 205 $entry_id = $entry->id;
272 - $cached = $entry;
206 + $cached = $entry;
273 207 } else {
274 208 $entry_id = (int) $entry_id;
275 - $cached = FrmDb::check_cache( $entry_id, 'frm_entry' );
209 + $cached = FrmDb::check_cache( $entry_id, 'frm_entry' );
276 210 }
277 211
278 212 if ( $cached && isset( $cached->metas ) && isset( $cached->metas[ $field_id ] ) ) {
279 213 $result = $cached->metas[ $field_id ];
280 - return wp_unslash( $result );
281 - }
214 + return stripslashes_deep( $result );
215 + }
282 216
283 217 $get_table = $wpdb->prefix . 'frm_item_metas';
284 - $query = array( 'item_id' => $entry_id );
285 -
218 + $query = array( 'item_id' => $entry_id );
286 219 if ( is_numeric( $field_id ) ) {
287 - // Query by field ID.
288 220 $query['field_id'] = $field_id;
289 - } else {
290 - // Query by field key.
291 - $get_table .= ' it JOIN ' . $wpdb->prefix . 'frm_fields fi ON it.field_id=fi.id';
221 + } else {
222 + $get_table .= ' it LEFT OUTER JOIN ' . $wpdb->prefix . 'frm_fields fi ON it.field_id=fi.id';
292 223 $query['fi.field_key'] = $field_id;
293 - }
224 + }
294 225
295 - $result = FrmDb::get_var( $get_table, $query, 'meta_value' );
296 - $field_type = FrmField::get_type( $field_id );
297 - FrmFieldsHelper::prepare_field_value( $result, $field_type );
226 + $result = FrmDb::get_var( $get_table, $query, 'meta_value' );
227 + $result = maybe_unserialize( $result );
228 + $result = stripslashes_deep( $result );
298 229
299 - return wp_unslash( $result );
300 - }
230 + return $result;
231 + }
301 232
302 - /**
303 - * @param int|string $field_id
304 - * @param string $order
305 - * @param string $limit
306 - * @param array $args
307 - *
308 - * @return array
309 - */
310 - public static function get_entry_metas_for_field( $field_id, $order = '', $limit = '', $args = array() ) {
233 + public static function get_entry_metas_for_field( $field_id, $order = '', $limit = '', $args = array() ) {
311 234 $defaults = array(
312 - 'value' => false,
313 - 'unique' => false,
235 + 'value' => false,
236 + 'unique' => false,
314 237 'stripslashes' => true,
315 - 'is_draft' => false,
238 + 'is_draft' => false,
316 239 );
317 - $args = wp_parse_args( $args, $defaults );
318 - $query = array();
240 + $args = wp_parse_args( $args, $defaults );
241 +
242 + $query = array();
319 243 self::meta_field_query( $field_id, $order, $limit, $args, $query );
320 - $query = implode( ' ', $query );
321 - $cache_key = 'entry_metas_for_field_' . $field_id . $order . $limit . FrmAppHelper::maybe_json_encode( $args );
322 - $values = FrmDb::check_cache( $cache_key, 'frm_entry', $query, 'get_col' );
244 + $query = implode( ' ', $query );
323 245
324 - if ( ! $args['stripslashes'] ) {
325 - return $values;
326 - }
246 + $cache_key = 'entry_metas_for_field_' . $field_id . $order . $limit . maybe_serialize( $args );
247 + $values = FrmDb::check_cache( $cache_key, 'frm_entry', $query, 'get_col' );
327 248
249 + if ( ! $args['stripslashes'] ) {
250 + return $values;
251 + }
252 +
328 253 foreach ( $values as $k => $v ) {
329 - FrmAppHelper::unserialize_or_decode( $v );
330 - $values[ $k ] = $v;
254 + $values[ $k ] = maybe_unserialize( $v );
331 255 unset( $k, $v );
332 - }
256 + }
333 257
334 - return wp_unslash( $values );
335 - }
258 + return stripslashes_deep( $values );
259 + }
336 260
337 - /**
338 - * @param int|string $field_id
339 - * @param string $order
340 - * @param string $limit
341 - * @param array $args
342 - * @param array $query
343 - *
344 - * @return void
345 - */
261 + /**
262 + * @param string $order
263 + * @param string $limit
264 + */
346 265 private static function meta_field_query( $field_id, $order, $limit, $args, array &$query ) {
347 - global $wpdb;
348 - $query[] = 'SELECT';
349 - $query[] = $args['unique'] ? 'DISTINCT(em.meta_value)' : 'em.meta_value';
266 + global $wpdb;
267 + $query[] = 'SELECT';
268 + $query[] = $args['unique'] ? 'DISTINCT(em.meta_value)' : 'em.meta_value';
350 269 $query[] = 'FROM ' . $wpdb->prefix . 'frm_item_metas em ';
351 270
352 - if ( ! $args['is_draft'] ) {
271 + if ( ! $args['is_draft'] ) {
353 272 $query[] = 'INNER JOIN ' . $wpdb->prefix . 'frm_items e ON (e.id=em.item_id)';
354 - }
273 + }
355 274
356 275 if ( is_numeric( $field_id ) ) {
357 276 $query[] = $wpdb->prepare( 'WHERE em.field_id=%d', $field_id );
358 277 } else {
359 278 $query[] = $wpdb->prepare( 'LEFT JOIN ' . $wpdb->prefix . 'frm_fields fi ON (em.field_id = fi.id) WHERE fi.field_key=%s', $field_id );
360 - }
279 + }
361 280
362 - if ( ! $args['is_draft'] ) {
363 - $query[] = 'AND e.is_draft=0';
364 - }
281 + if ( ! $args['is_draft'] ) {
282 + $query[] = 'AND e.is_draft=0';
283 + }
365 284
366 - if ( $args['value'] ) {
285 + if ( $args['value'] ) {
367 286 $query[] = $wpdb->prepare( ' AND meta_value=%s', $args['value'] );
368 - }
287 + }
288 + $query[] = $order . $limit;
289 + }
369 290
370 - $query[] = $order . $limit;
371 - }
372 -
373 - /**
374 - * @param int|string $entry_id
375 - *
376 - * @return array
377 - */
378 291 public static function get_entry_meta_info( $entry_id ) {
379 292 return FrmDb::get_results( 'frm_item_metas', array( 'item_id' => $entry_id ) );
380 - }
293 + }
381 294
382 - /**
383 - * @param array $where
384 - * @param string $order_by
385 - * @param string $limit
386 - * @param bool $stripslashes
387 - *
388 - * @return mixed
389 - */
390 295 public static function getAll( $where = array(), $order_by = '', $limit = '', $stripslashes = false ) {
391 - global $wpdb;
392 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
393 - $query = 'SELECT it.*, fi.type as field_type, fi.field_key as field_key,
296 + global $wpdb;
297 + $query = 'SELECT it.*, fi.type as field_type, fi.field_key as field_key,
394 298 fi.required as required, fi.form_id as field_form_id, fi.name as field_name, fi.options as fi_options
395 299 FROM ' . $wpdb->prefix . 'frm_item_metas it LEFT OUTER JOIN ' . $wpdb->prefix . 'frm_fields fi ON it.field_id=fi.id' .
396 300 FrmDb::prepend_and_or_where( ' WHERE ', $where ) . $order_by . $limit;
397 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
398 301
399 - $cache_key = 'all_' . FrmAppHelper::maybe_json_encode( $where ) . $order_by . $limit;
400 - $results = FrmDb::check_cache( $cache_key, 'frm_entry', $query, $limit === ' LIMIT 1' ? 'get_row' : 'get_results' );
302 + $cache_key = 'all_' . maybe_serialize( $where ) . $order_by . $limit;
303 + $results = FrmDb::check_cache( $cache_key, 'frm_entry', $query, ( $limit == ' LIMIT 1' ? 'get_row' : 'get_results' ) );
401 304
402 305 if ( ! $results || ! $stripslashes ) {
403 306 return $results;
404 307 }
@@ -403,247 +306,134 @@
403 306 return $results;
404 307 }
405 308
406 309 foreach ( $results as $k => $result ) {
407 - FrmAppHelper::unserialize_or_decode( $result->meta_value );
408 - $results[ $k ]->meta_value = wp_unslash( $result->meta_value );
310 + $results[ $k ]->meta_value = stripslashes_deep( maybe_unserialize( $result->meta_value ) );
409 311 unset( $k, $result );
410 312 }
411 313
412 314 return $results;
413 - }
315 + }
414 316
415 - /**
416 - * @param array|string $where
417 - * @param string $order_by
418 - * @param string $limit
419 - * @param bool $unique
420 - * @param array $args
421 - *
422 - * @return array|string|null
423 - */
424 - public static function getEntryIds( $where = array(), $order_by = '', $limit = '', $unique = true, $args = array() ) {
317 + public static function getEntryIds( $where = array(), $order_by = '', $limit = '', $unique = true, $args = array() ) {
425 318 $defaults = array(
426 319 'is_draft' => false,
427 320 'user_id' => '',
428 321 'group_by' => '',
429 322 );
430 - $args = wp_parse_args( $args, $defaults );
431 - $query = array();
323 + $args = wp_parse_args( $args, $defaults );
324 +
325 + $query = array();
432 326 self::get_ids_query( $where, $order_by, $limit, $unique, $args, $query );
433 - $query = implode( ' ', $query );
434 - $cache_key = 'ids_' . FrmAppHelper::maybe_json_encode( $where ) . $order_by . 'l' . $limit . 'u' . $unique . FrmAppHelper::maybe_json_encode( $args );
435 - $type = 'get_' . ( ' LIMIT 1' === $limit ? 'var' : 'col' );
436 - return FrmDb::check_cache( $cache_key, 'frm_entry', $query, $type );
437 - }
327 + $query = implode( ' ', $query );
438 328
439 - /**
440 - * Given a query including a form id and its child form ids, output an array of matching entry ids
441 - * If a child entry id is matched, its parent will be returned in its place
442 - *
443 - * @param array $query
444 - * @param array $args
445 - *
446 - * @return array
447 - */
448 - public static function get_top_level_entry_ids( $query, $args ) {
449 - $args['return_parent_id_if_0_return_id'] = true;
450 - return self::getEntryIds( $query, '', '', true, $args );
451 - }
329 + $cache_key = 'ids_' . maybe_serialize( $where ) . $order_by . 'l' . $limit . 'u' . $unique . maybe_serialize( $args );
330 + return FrmDb::check_cache( $cache_key, 'frm_entry', $query, ( $limit == ' LIMIT 1' ? 'get_var' : 'get_col' ) );
331 + }
452 332
453 - /**
454 - * Returns true if the where clause refers to a field table column that is not form_id. It also updates
455 - * the where clause to refer to the entry table for form_id if fields table should not be joined.
456 - *
457 - * @since 6.16.1
458 - *
459 - * @param array|string $where
460 - *
461 - * @return bool
462 - */
463 - private static function should_join_fields_table( &$where ) {
464 - if ( is_string( $where ) ) {
465 - if ( preg_match( '/\bfi\.(?!form_id)\w+/i', $where ) ) {
466 - return true;
467 - }
333 + /**
334 + * @param string|array $where
335 + * @param string $order_by
336 + * @param string $limit
337 + */
338 + private static function get_ids_query( $where, $order_by, $limit, $unique, $args, array &$query ) {
339 + global $wpdb;
340 + $query[] = 'SELECT';
468 341
469 - $where = str_ireplace( 'fi.form_id', 'e.form_id', $where );
470 - return false;
471 - }
342 + $defaults = array( 'return_parent_id' => false );
343 + $args = array_merge( $defaults, $args );
472 344
473 - $where_fields = array_keys( $where );
474 -
475 - foreach ( $where_fields as $where_field ) {
476 - if ( str_starts_with( $where_field, 'fi.' ) && 'fi.form_id' !== $where_field ) {
477 - return true;
478 - }
479 - }
480 -
481 - if ( isset( $where['fi.form_id'] ) ) {
482 - $where['e.form_id'] = $where['fi.form_id'];
483 - unset( $where['fi.form_id'] );
484 - }
485 -
486 - return false;
487 - }
488 -
489 - /**
490 - * @param array|string $where
491 - * @param string $order_by
492 - * @param string $limit
493 - * @param bool $unique
494 - * @param array $args
495 - * @param array $query
496 - *
497 - * @return void
498 - */
499 - private static function get_ids_query( $where, $order_by, $limit, $unique, $args, array &$query ) { // phpcs:ignore SlevomatCodingStandard.Complexity.Cognitive.ComplexityTooHigh, SlevomatCodingStandard.Files.LineLength.LineTooLong
500 - global $wpdb;
501 - $query[] = 'SELECT';
502 - $defaults = array(
503 - 'return_parent_id' => false,
504 - 'return_parent_id_if_0_return_id' => false,
505 - );
506 - $args = array_merge( $defaults, $args );
507 -
508 - if ( $unique ) {
509 - $query[] = 'DISTINCT';
510 - }
511 -
512 - if ( $args['return_parent_id_if_0_return_id'] ) {
513 - $query[] = 'IF ( e.parent_item_id = 0, it.item_id, e.parent_item_id )';
514 - } elseif ( $args['return_parent_id'] ) {
515 - $query[] = 'e.parent_item_id';
345 + if ( $args['return_parent_id'] ) {
346 + $query[] = $unique ? 'DISTINCT(e.parent_item_id)' : 'e.parent_item_id';
516 347 } else {
517 - $query[] = 'it.item_id';
348 + $query[] = $unique ? 'DISTINCT(it.item_id)' : 'it.item_id';
518 349 }
519 350
520 - $from = 'FROM ' . $wpdb->prefix . 'frm_item_metas it';
521 - $should_join_fields_table__where = self::should_join_fields_table( $where );
522 - $should_join_fields_table__order_by = self::should_join_fields_table( $order_by );
351 + $query[] = 'FROM ' . $wpdb->prefix . 'frm_item_metas it LEFT OUTER JOIN ' . $wpdb->prefix . 'frm_fields fi ON it.field_id=fi.id';
523 352
524 - if ( $should_join_fields_table__where || $should_join_fields_table__order_by ) {
525 - $from .= ' LEFT OUTER JOIN ' . $wpdb->prefix . 'frm_fields fi ON it.field_id=fi.id';
526 - }
527 -
528 - $query[] = $from;
529 353 $query[] = 'INNER JOIN ' . $wpdb->prefix . 'frm_items e ON (e.id=it.item_id)';
530 -
531 354 if ( is_array( $where ) ) {
532 - if ( ! $args['is_draft'] ) {
533 - $where['e.is_draft'] = 0;
534 - } elseif ( is_numeric( $args['is_draft'] ) ) {
535 - $where['e.is_draft'] = class_exists( 'FrmAbandonmentHooksController', false ) ? absint( $args['is_draft'] ) : 1;
536 - } elseif ( 'both' === $args['is_draft'] && class_exists( 'FrmAbandonmentHooksController', false ) ) {
537 - $where['e.is_draft'] = array( 0, 1 );
538 - } elseif ( str_contains( $args['is_draft'], ',' ) ) {
539 - $is_draft = array_reduce(
540 - explode( ',', $args['is_draft'] ),
541 - function ( $total, $current ) {
542 - if ( is_numeric( $current ) ) {
543 - $total[] = absint( $current );
544 - }
545 - return $total;
546 - },
547 - array()
548 - );
355 + if ( ! $args['is_draft'] ) {
356 + $where['e.is_draft'] = 0;
357 + } else if ( $args['is_draft'] == 1 ) {
358 + $where['e.is_draft'] = 1;
359 + }
549 360
550 - if ( $is_draft ) {
551 - $where['e.is_draft'] = $is_draft;
552 - }
553 - }//end if
554 -
555 361 if ( ! empty( $args['user_id'] ) ) {
556 - $where['e.user_id'] = $args['user_id'];
557 - }
558 -
362 + $where['e.user_id'] = $args['user_id'];
363 + }
559 364 $query[] = FrmDb::prepend_and_or_where( ' WHERE ', $where ) . $order_by . $limit;
560 365
561 366 if ( $args['group_by'] ) {
562 367 $query[] = ' GROUP BY ' . sanitize_text_field( $args['group_by'] );
563 368 }
369 + return;
370 + }
564 371
565 - return;
566 - }//end if
567 -
568 372 $draft_where = '';
569 - $user_where = '';
570 -
571 - if ( ! $args['is_draft'] ) {
373 + $user_where = '';
374 + if ( ! $args['is_draft'] ) {
572 375 $draft_where = $wpdb->prepare( ' AND e.is_draft=%d', 0 );
573 - } elseif ( $args['is_draft'] == 1 ) { // phpcs:ignore Universal.Operators.StrictComparisons
376 + } else if ( $args['is_draft'] == 1 ) {
574 377 $draft_where = $wpdb->prepare( ' AND e.is_draft=%d', 1 );
575 - }
378 + }
576 379
577 380 if ( ! empty( $args['user_id'] ) ) {
578 381 $user_where = $wpdb->prepare( ' AND e.user_id=%d', $args['user_id'] );
579 382 }
580 383
581 - if ( str_contains( $where, ' GROUP BY ' ) ) {
582 - // Don't inject WHERE filtering after GROUP BY
583 - $parts = explode( ' GROUP BY ', $where );
584 - $where = $parts[0];
585 - $where .= $draft_where . $user_where;
384 + if ( strpos( $where, ' GROUP BY ' ) ) {
385 + // don't inject WHERE filtering after GROUP BY
386 + $parts = explode( ' GROUP BY ', $where );
387 + $where = $parts[0];
388 + $where .= $draft_where . $user_where;
586 389 $where .= ' GROUP BY ' . $parts[1];
587 - } else {
588 - $where .= $draft_where . $user_where;
589 - }
390 + } else {
391 + $where .= $draft_where . $user_where;
392 + }
590 393
591 394 // The query has already been prepared
592 395 $query[] = FrmDb::prepend_and_or_where( ' WHERE ', $where ) . $order_by . $limit;
593 - }
396 + }
594 397
595 - /**
596 - * @param array|string $search
597 - * @param int|string $field_id
598 - * @param string $operator
599 - *
600 - * @return array
601 - */
602 - public static function search_entry_metas( $search, $field_id, $operator ) {
603 - $cache_key = 'search_' . FrmAppHelper::maybe_json_encode( $search ) . $field_id . $operator;
604 - $results = wp_cache_get( $cache_key, 'frm_entry' );
398 + public static function search_entry_metas( $search, $field_id = '', $operator ) {
399 + $cache_key = 'search_' . maybe_serialize( $search ) . $field_id . $operator;
400 + $results = wp_cache_get( $cache_key, 'frm_entry' );
401 + if ( false !== $results ) {
402 + return $results;
403 + }
605 404
606 - if ( false !== $results ) {
607 - return $results;
608 - }
609 -
610 - global $wpdb;
611 -
405 + global $wpdb;
612 406 if ( is_array( $search ) ) {
613 - $where = '';
614 -
407 + $where = '';
615 408 foreach ( $search as $field => $value ) {
616 - if ( $value <= 0 || ! in_array( $field, array( 'year', 'month', 'day' ), true ) ) {
617 - continue;
618 - }
409 + if ( $value <= 0 || ! in_array( $field, array( 'year', 'month', 'day' ) ) ) {
410 + continue;
411 + }
619 412
620 - switch ( $field ) {
621 - case 'year':
413 + switch ( $field ) {
414 + case 'year':
622 415 $value = '%' . $value;
623 416 break;
624 - case 'month':
625 - $value .= '%';
417 + case 'month':
418 + $value .= '%';
626 419 break;
627 - case 'day':
420 + case 'day':
628 421 $value = '%' . $value . '%';
629 - }
630 -
631 - $where .= $wpdb->prepare( ' meta_value ' . $operator . ' %s and', $value ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
632 - }
633 -
422 + }
423 + $where .= $wpdb->prepare( ' meta_value ' . $operator . ' %s and', $value ); // WPCS: unprepared SQL ok.
424 + }
634 425 $where .= $wpdb->prepare( ' field_id=%d', $field_id );
635 - $query = 'SELECT DISTINCT item_id FROM ' . $wpdb->prefix . 'frm_item_metas' . FrmDb::prepend_and_or_where( ' WHERE ', $where );
636 - } else {
637 - if ( $operator === 'LIKE' ) {
638 - $search = '%' . $search . '%';
426 + $query = 'SELECT DISTINCT item_id FROM ' . $wpdb->prefix . 'frm_item_metas' . FrmDb::prepend_and_or_where( ' WHERE ', $where );
427 + } else {
428 + if ( $operator == 'LIKE' ) {
429 + $search = '%' . $search . '%';
639 430 }
431 + $query = $wpdb->prepare( "SELECT DISTINCT item_id FROM {$wpdb->prefix}frm_item_metas WHERE meta_value {$operator} %s and field_id = %d", $search, $field_id ); // WPCS: unprepared SQL ok.
432 + }
640 433
641 - $query = $wpdb->prepare( "SELECT DISTINCT item_id FROM {$wpdb->prefix}frm_item_metas WHERE meta_value {$operator} %s and field_id = %d", $search, $field_id ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, SlevomatCodingStandard.Files.LineLength.LineTooLong
642 - }//end if
643 -
644 - $results = $wpdb->get_col( $query, 0 ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
434 + $results = $wpdb->get_col( $query, 0 ); // WPCS: unprepared SQL ok.
645 435 FrmDb::set_cache( $cache_key, $results, 'frm_entry' );
646 436
647 - return $results;
648 - }
437 + return $results;
438 + }
649 439 }