PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.13
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.13
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 +16 -73 6.256.13 View file →
@@ -107,18 +107,13 @@
107 107
108 108 $value = apply_filters( 'frm_prepare_data_before_db', $value, $atts['field_id'], $atts['entry_id'], array( 'field' => $atts['field'] ) );
109 109 }
110 110
111 - /**
112 - * @param int|string $entry_id
113 - * @param array $values Either indexed by field ID or field key.
114 - * @return void
115 - */
116 111 public static function update_entry_metas( $entry_id, $values ) {
117 112 global $wpdb;
118 113
119 - $previous_field_ids = FrmDb::get_col(
120 - 'frm_item_metas',
114 + $prev_values = FrmDb::get_col(
115 + $wpdb->prefix . 'frm_item_metas',
121 116 array(
122 117 'item_id' => $entry_id,
123 118 'field_id !' => 0,
124 119 ),
@@ -124,30 +119,21 @@
124 119 ),
125 120 'field_id'
126 121 );
127 122
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 - }
123 + foreach ( $values as $field_id => $meta_value ) {
124 + $field = false;
125 + if ( ! empty( $field_id ) ) {
126 + $field = FrmField::getOne( $field_id );
139 127 }
140 128
141 - $values_indexed_by_field_id[ $field_id ] = $meta_value;
142 -
143 129 self::get_value_to_save( compact( 'field', 'field_id', 'entry_id' ), $meta_value );
144 130
145 - if ( $previous_field_ids && in_array( $field_id, $previous_field_ids ) ) {
131 + if ( $prev_values && in_array( $field_id, $prev_values ) ) {
146 132
147 133 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 ] );
134 + // remove blank fields
135 + unset( $values[ $field_id ] );
150 136 } else {
151 137 // if value exists, then update it
152 138 self::update_entry_meta( $entry_id, $field_id, '', $meta_value );
153 139 }
@@ -156,15 +142,15 @@
156 142 self::add_entry_meta( $entry_id, $field_id, '', $meta_value );
157 143 }
158 144 }//end foreach
159 145
160 - if ( empty( $previous_field_ids ) ) {
146 + if ( empty( $prev_values ) ) {
161 147 return;
162 148 }
163 149
164 - $field_ids_to_remove = array_diff( $previous_field_ids, array_keys( $values_indexed_by_field_id ) );
150 + $prev_values = array_diff( $prev_values, array_keys( $values ) );
165 151
166 - if ( ! $field_ids_to_remove ) {
152 + if ( empty( $prev_values ) ) {
167 153 return;
168 154 }
169 155
170 156 // prepare the query
@@ -169,9 +155,9 @@
169 155
170 156 // prepare the query
171 157 $where = array(
172 158 'item_id' => $entry_id,
173 - 'field_id' => $field_ids_to_remove,
159 + 'field_id' => $prev_values,
174 160 );
175 161 FrmDb::get_where_clause_and_values( $where );
176 162
177 163 // Delete any leftovers
@@ -223,18 +209,13 @@
223 209 * @return mixed
224 210 */
225 211 public static function get_meta_value( $entry, $field_id ) {
226 212 if ( isset( $entry->metas ) ) {
227 - return $entry->metas[ $field_id ] ?? false;
213 + return isset( $entry->metas[ $field_id ] ) ? $entry->metas[ $field_id ] : false;
228 214 }
229 215 return self::get_entry_meta_by_field( $entry->id, $field_id );
230 216 }
231 217
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 218 public static function get_entry_meta_by_field( $entry_id, $field_id ) {
238 219 global $wpdb;
239 220
240 221 if ( is_object( $entry_id ) ) {
@@ -254,13 +235,11 @@
254 235
255 236 $get_table = $wpdb->prefix . 'frm_item_metas';
256 237 $query = array( 'item_id' => $entry_id );
257 238 if ( is_numeric( $field_id ) ) {
258 - // Query by field ID.
259 239 $query['field_id'] = $field_id;
260 240 } else {
261 - // Query by field key.
262 - $get_table .= ' it JOIN ' . $wpdb->prefix . 'frm_fields fi ON it.field_id=fi.id';
241 + $get_table .= ' it LEFT OUTER JOIN ' . $wpdb->prefix . 'frm_fields fi ON it.field_id=fi.id';
263 242 $query['fi.field_key'] = $field_id;
264 243 }
265 244
266 245 $result = FrmDb::get_var( $get_table, $query, 'meta_value' );
@@ -399,38 +378,9 @@
399 378 return self::getEntryIds( $query, '', '', true, $args );
400 379 }
401 380
402 381 /**
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 382 * @param array|string $where
408 - * @return bool
409 - */
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 383 * @param string $order_by
434 384 * @param string $limit
435 385 */
436 386 private static function get_ids_query( $where, $order_by, $limit, $unique, $args, array &$query ) {
@@ -453,17 +403,10 @@
453 403 } else {
454 404 $query[] = 'it.item_id';
455 405 }
456 406
457 - $from = 'FROM ' . $wpdb->prefix . 'frm_item_metas it';
407 + $query[] = 'FROM ' . $wpdb->prefix . 'frm_item_metas it LEFT OUTER JOIN ' . $wpdb->prefix . 'frm_fields fi ON it.field_id=fi.id';
458 408
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 409 $query[] = 'INNER JOIN ' . $wpdb->prefix . 'frm_items e ON (e.id=it.item_id)';
467 410 if ( is_array( $where ) ) {
468 411 if ( ! $args['is_draft'] ) {
469 412 $where['e.is_draft'] = 0;