PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 5.0
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v5.0
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 +41 -147 6.255.0 View file →
@@ -5,13 +5,9 @@
5 5
6 6 class FrmEntryMeta {
7 7
8 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 - * @return int
9 + * @param string $meta_key
14 10 */
15 11 public static function add_entry_meta( $entry_id, $field_id, $meta_key, $meta_value ) {
16 12 global $wpdb;
17 13
@@ -43,11 +39,11 @@
43 39 return $id;
44 40 }
45 41
46 42 /**
47 - * @param int $entry_id
48 - * @param int $field_id
49 - * @param string $meta_key Deprecated.
43 + * @param int $entry_id
44 + * @param int $field_id
45 + * @param string $meta_key deprecated
50 46 * @param array|string $meta_value
51 47 *
52 48 * @return bool|false|int
53 49 */
@@ -107,18 +103,13 @@
107 103
108 104 $value = apply_filters( 'frm_prepare_data_before_db', $value, $atts['field_id'], $atts['entry_id'], array( 'field' => $atts['field'] ) );
109 105 }
110 106
111 - /**
112 - * @param int|string $entry_id
113 - * @param array $values Either indexed by field ID or field key.
114 - * @return void
115 - */
116 107 public static function update_entry_metas( $entry_id, $values ) {
117 108 global $wpdb;
118 109
119 - $previous_field_ids = FrmDb::get_col(
120 - 'frm_item_metas',
110 + $prev_values = FrmDb::get_col(
111 + $wpdb->prefix . 'frm_item_metas',
121 112 array(
122 113 'item_id' => $entry_id,
123 114 'field_id !' => 0,
124 115 ),
@@ -124,30 +115,21 @@
124 115 ),
125 116 'field_id'
126 117 );
127 118
128 - $values_indexed_by_field_id = array();
129 - foreach ( $values as $field_id_or_key => $meta_value ) {
130 - $field_id = $field_id_or_key;
131 - $field = null;
132 -
133 - if ( $field_id_or_key ) {
134 - $field = FrmField::getOne( $field_id_or_key );
135 -
136 - if ( is_object( $field ) ) {
137 - $field_id = $field->id;
138 - }
119 + foreach ( $values as $field_id => $meta_value ) {
120 + $field = false;
121 + if ( ! empty( $field_id ) ) {
122 + $field = FrmField::getOne( $field_id );
139 123 }
140 124
141 - $values_indexed_by_field_id[ $field_id ] = $meta_value;
142 -
143 125 self::get_value_to_save( compact( 'field', 'field_id', 'entry_id' ), $meta_value );
144 126
145 - if ( $previous_field_ids && in_array( $field_id, $previous_field_ids ) ) {
127 + if ( $prev_values && in_array( $field_id, $prev_values ) ) {
146 128
147 129 if ( ( is_array( $meta_value ) && empty( $meta_value ) ) || ( ! is_array( $meta_value ) && trim( $meta_value ) == '' ) ) {
148 - // Remove blank fields.
149 - unset( $values_indexed_by_field_id[ $field_id ] );
130 + // remove blank fields
131 + unset( $values[ $field_id ] );
150 132 } else {
151 133 // if value exists, then update it
152 134 self::update_entry_meta( $entry_id, $field_id, '', $meta_value );
153 135 }
@@ -154,17 +136,17 @@
154 136 } else {
155 137 // if value does not exist, then create it
156 138 self::add_entry_meta( $entry_id, $field_id, '', $meta_value );
157 139 }
158 - }//end foreach
140 + }
159 141
160 - if ( empty( $previous_field_ids ) ) {
142 + if ( empty( $prev_values ) ) {
161 143 return;
162 144 }
163 145
164 - $field_ids_to_remove = array_diff( $previous_field_ids, array_keys( $values_indexed_by_field_id ) );
146 + $prev_values = array_diff( $prev_values, array_keys( $values ) );
165 147
166 - if ( ! $field_ids_to_remove ) {
148 + if ( empty( $prev_values ) ) {
167 149 return;
168 150 }
169 151
170 152 // prepare the query
@@ -169,30 +151,21 @@
169 151
170 152 // prepare the query
171 153 $where = array(
172 154 'item_id' => $entry_id,
173 - 'field_id' => $field_ids_to_remove,
155 + 'field_id' => $prev_values,
174 156 );
175 157 FrmDb::get_where_clause_and_values( $where );
176 158
177 159 // Delete any leftovers
178 - $wpdb->query( $wpdb->prepare( 'DELETE FROM ' . $wpdb->prefix . 'frm_item_metas ' . $where['where'], $where['values'] ) ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
160 + $wpdb->query( $wpdb->prepare( 'DELETE FROM ' . $wpdb->prefix . 'frm_item_metas ' . $where['where'], $where['values'] ) ); // WPCS: unprepared SQL ok.
179 161 self::clear_cache();
180 162 }
181 163
182 164 public static function duplicate_entry_metas( $old_id, $new_id ) {
183 165 $metas = self::get_entry_meta_info( $old_id );
184 -
185 - /**
186 - * Allows changing entry duplicate values before save.
187 - *
188 - * @since 5.4.4
189 - *
190 - * @param array $metas The list of entry meta values.
191 - */
192 - $metas = apply_filters( 'frm_before_duplicate_entry_values', $metas );
193 166 foreach ( $metas as $meta ) {
194 - self::add_entry_meta( $new_id, $meta->field_id, '', $meta->meta_value );
167 + self::add_entry_meta( $new_id, $meta->field_id, null, $meta->meta_value );
195 168 unset( $meta );
196 169 }
197 170 self::clear_cache();
198 171 }
@@ -216,25 +189,17 @@
216 189 }
217 190
218 191 /**
219 192 * @since 2.0.9
220 - *
221 - * @param stdClass $entry
222 - * @param int|string $field_id
223 - * @return mixed
224 193 */
225 194 public static function get_meta_value( $entry, $field_id ) {
226 195 if ( isset( $entry->metas ) ) {
227 - return $entry->metas[ $field_id ] ?? false;
196 + return isset( $entry->metas[ $field_id ] ) ? $entry->metas[ $field_id ] : false;
197 + } else {
198 + return self::get_entry_meta_by_field( $entry->id, $field_id );
228 199 }
229 - return self::get_entry_meta_by_field( $entry->id, $field_id );
230 200 }
231 201
232 - /**
233 - * @param int|object|string $entry_id
234 - * @param int|string $field_id This function supports field keys as field id.
235 - * @return mixed
236 - */
237 202 public static function get_entry_meta_by_field( $entry_id, $field_id ) {
238 203 global $wpdb;
239 204
240 205 if ( is_object( $entry_id ) ) {
@@ -254,21 +219,16 @@
254 219
255 220 $get_table = $wpdb->prefix . 'frm_item_metas';
256 221 $query = array( 'item_id' => $entry_id );
257 222 if ( is_numeric( $field_id ) ) {
258 - // Query by field ID.
259 223 $query['field_id'] = $field_id;
260 224 } else {
261 - // Query by field key.
262 - $get_table .= ' it JOIN ' . $wpdb->prefix . 'frm_fields fi ON it.field_id=fi.id';
225 + $get_table .= ' it LEFT OUTER JOIN ' . $wpdb->prefix . 'frm_fields fi ON it.field_id=fi.id';
263 226 $query['fi.field_key'] = $field_id;
264 227 }
265 228
266 229 $result = FrmDb::get_var( $get_table, $query, 'meta_value' );
267 -
268 - $field_type = FrmField::get_type( $field_id );
269 - FrmFieldsHelper::prepare_field_value( $result, $field_type );
270 -
230 + FrmAppHelper::unserialize_or_decode( $result );
271 231 $result = wp_unslash( $result );
272 232
273 233 return $result;
274 234 }
@@ -302,13 +262,10 @@
302 262 return wp_unslash( $values );
303 263 }
304 264
305 265 /**
306 - * @param int|string $field_id
307 - * @param string $order
308 - * @param string $limit
309 - * @param array $args
310 - * @param array $query
266 + * @param string $order
267 + * @param string $limit
311 268 */
312 269 private static function meta_field_query( $field_id, $order, $limit, $args, array &$query ) {
313 270 global $wpdb;
314 271 $query[] = 'SELECT';
@@ -338,15 +295,8 @@
338 295 public static function get_entry_meta_info( $entry_id ) {
339 296 return FrmDb::get_results( 'frm_item_metas', array( 'item_id' => $entry_id ) );
340 297 }
341 298
342 - /**
343 - * @param array $where
344 - * @param string $order_by
345 - * @param string $limit
346 - * @param bool $stripslashes
347 - * @return array
348 - */
349 299 public static function getAll( $where = array(), $order_by = '', $limit = '', $stripslashes = false ) {
350 300 global $wpdb;
351 301 $query = 'SELECT it.*, fi.type as field_type, fi.field_key as field_key,
352 302 fi.required as required, fi.form_id as field_form_id, fi.name as field_name, fi.options as fi_options
@@ -399,41 +349,12 @@
399 349 return self::getEntryIds( $query, '', '', true, $args );
400 350 }
401 351
402 352 /**
403 - * Returns true if the where clause refers to a field table column that is not form_id. It also updates
404 - * the where clause to refer to the entry table for form_id if fields table should not be joined.
405 - *
406 - * @since 6.16.1
407 - * @param array|string $where
408 - * @return bool
353 + * @param string|array $where
354 + * @param string $order_by
355 + * @param string $limit
409 356 */
410 - private static function should_join_fields_table( &$where ) {
411 - if ( is_string( $where ) ) {
412 - if ( preg_match( '/\bfi\.(?!form_id)\w+/i', $where ) ) {
413 - return true;
414 - }
415 - $where = str_ireplace( 'fi.form_id', 'e.form_id', $where );
416 - return false;
417 - }
418 - $where_fields = array_keys( $where );
419 - foreach ( $where_fields as $where_field ) {
420 - if ( strpos( $where_field, 'fi.' ) === 0 && 'fi.form_id' !== $where_field ) {
421 - return true;
422 - }
423 - }
424 - if ( isset( $where['fi.form_id'] ) ) {
425 - $where['e.form_id'] = $where['fi.form_id'];
426 - unset( $where['fi.form_id'] );
427 - }
428 - return false;
429 - }
430 -
431 - /**
432 - * @param array|string $where
433 - * @param string $order_by
434 - * @param string $limit
435 - */
436 357 private static function get_ids_query( $where, $order_by, $limit, $unique, $args, array &$query ) {
437 358 global $wpdb;
438 359 $query[] = 'SELECT';
439 360 $defaults = array(
@@ -453,44 +374,17 @@
453 374 } else {
454 375 $query[] = 'it.item_id';
455 376 }
456 377
457 - $from = 'FROM ' . $wpdb->prefix . 'frm_item_metas it';
378 + $query[] = 'FROM ' . $wpdb->prefix . 'frm_item_metas it LEFT OUTER JOIN ' . $wpdb->prefix . 'frm_fields fi ON it.field_id=fi.id';
458 379
459 - $should_join_fields_table__where = self::should_join_fields_table( $where );
460 - $should_join_fields_table__order_by = self::should_join_fields_table( $order_by );
461 - if ( $should_join_fields_table__where || $should_join_fields_table__order_by ) {
462 - $from .= ' LEFT OUTER JOIN ' . $wpdb->prefix . 'frm_fields fi ON it.field_id=fi.id';
463 - }
464 -
465 - $query[] = $from;
466 380 $query[] = 'INNER JOIN ' . $wpdb->prefix . 'frm_items e ON (e.id=it.item_id)';
467 381 if ( is_array( $where ) ) {
468 382 if ( ! $args['is_draft'] ) {
469 383 $where['e.is_draft'] = 0;
470 - } elseif ( is_numeric( $args['is_draft'] ) ) {
471 - if ( class_exists( 'FrmAbandonmentHooksController', false ) ) {
472 - $where['e.is_draft'] = absint( $args['is_draft'] );
473 - } else {
474 - $where['e.is_draft'] = 1;
475 - }
476 - } elseif ( 'both' === $args['is_draft'] && class_exists( 'FrmAbandonmentHooksController', false ) ) {
477 - $where['e.is_draft'] = array( 0, 1 );
478 - } elseif ( false !== strpos( $args['is_draft'], ',' ) ) {
479 - $is_draft = array_reduce(
480 - explode( ',', $args['is_draft'] ),
481 - function ( $total, $current ) {
482 - if ( is_numeric( $current ) ) {
483 - $total[] = absint( $current );
484 - }
485 - return $total;
486 - },
487 - array()
488 - );
489 - if ( $is_draft ) {
490 - $where['e.is_draft'] = $is_draft;
491 - }
492 - }//end if
384 + } elseif ( $args['is_draft'] == 1 ) {
385 + $where['e.is_draft'] = 1;
386 + }
493 387
494 388 if ( ! empty( $args['user_id'] ) ) {
495 389 $where['e.user_id'] = $args['user_id'];
496 390 }
@@ -500,9 +394,9 @@
500 394 $query[] = ' GROUP BY ' . sanitize_text_field( $args['group_by'] );
501 395 }
502 396
503 397 return;
504 - }//end if
398 + }
505 399
506 400 $draft_where = '';
507 401 $user_where = '';
508 402 if ( ! $args['is_draft'] ) {
@@ -553,20 +447,20 @@
553 447 break;
554 448 case 'day':
555 449 $value = '%' . $value . '%';
556 450 }
557 - $where .= $wpdb->prepare( ' meta_value ' . $operator . ' %s and', $value ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
451 + $where .= $wpdb->prepare( ' meta_value ' . $operator . ' %s and', $value ); // WPCS: unprepared SQL ok.
558 452 }
559 453 $where .= $wpdb->prepare( ' field_id=%d', $field_id );
560 - $query = 'SELECT DISTINCT item_id FROM ' . $wpdb->prefix . 'frm_item_metas' . FrmDb::prepend_and_or_where( ' WHERE ', $where );
454 + $query = 'SELECT DISTINCT item_id FROM ' . $wpdb->prefix . 'frm_item_metas' . FrmDb::prepend_and_or_where( ' WHERE ', $where );
561 455 } else {
562 - if ( $operator === 'LIKE' ) {
456 + if ( $operator == 'LIKE' ) {
563 457 $search = '%' . $search . '%';
564 458 }
565 - $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
566 - }//end if
459 + $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.
460 + }
567 461
568 - $results = $wpdb->get_col( $query, 0 ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
462 + $results = $wpdb->get_col( $query, 0 ); // WPCS: unprepared SQL ok.
569 463 FrmDb::set_cache( $cache_key, $results, 'frm_entry' );
570 464
571 465 return $results;
572 466 }