PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 4.02.04
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v4.02.04
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
formidable / classes / models / FrmEntryMeta.php

FrmEntryMeta.php in Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More 4.02.04, at classes/models/FrmEntryMeta.php

447 lines 13.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 if ( ! defined( 'ABSPATH' ) ) {
3 die( 'You are not allowed to call this page directly.' );
4 }
5
6 class FrmEntryMeta {
7
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;
13
14 if ( FrmAppHelper::is_empty_value( $meta_value ) ) {
15 // don't save blank fields
16 return 0;
17 }
18
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 );
25
26 self::set_value_before_save( $new_values );
27 $new_values = apply_filters( 'frm_add_entry_meta', $new_values );
28
29 $query_results = $wpdb->insert( $wpdb->prefix . 'frm_item_metas', $new_values );
30
31 if ( $query_results ) {
32 self::clear_cache();
33 wp_cache_delete( $entry_id, 'frm_entry' );
34 $id = $wpdb->insert_id;
35 } else {
36 $id = 0;
37 }
38
39 return $id;
40 }
41
42 /**
43 * @param int $entry_id
44 * @param int $field_id
45 * @param string $meta_key deprecated
46 * @param array|string $meta_value
47 *
48 * @return bool|false|int
49 */
50 public static function update_entry_meta( $entry_id, $field_id, $meta_key = null, $meta_value ) {
51 if ( ! $field_id ) {
52 return false;
53 }
54
55 global $wpdb;
56
57 $values = array(
58 'item_id' => $entry_id,
59 'field_id' => $field_id,
60 );
61 $where_values = $values;
62 $values['meta_value'] = $meta_value;
63 self::set_value_before_save( $values );
64 $values = apply_filters( 'frm_update_entry_meta', $values );
65
66 if ( is_array( $values['meta_value'] ) ) {
67 $values['meta_value'] = array_filter( $values['meta_value'], 'FrmAppHelper::is_not_empty_value' );
68 }
69 $meta_value = maybe_serialize( $values['meta_value'] );
70
71 wp_cache_delete( $entry_id, 'frm_entry' );
72 self::clear_cache();
73
74 return $wpdb->update( $wpdb->prefix . 'frm_item_metas', array( 'meta_value' => $meta_value ), $where_values );
75 }
76
77 /**
78 * @since 3.0
79 */
80 private static function set_value_before_save( &$values ) {
81 $field = FrmField::getOne( $values['field_id'] );
82 if ( $field ) {
83 $field_obj = FrmFieldFactory::get_field_object( $field );
84
85 $values['meta_value'] = $field_obj->set_value_before_save( $values['meta_value'] );
86 }
87 }
88
89 /**
90 * @since 3.0
91 */
92 private static function get_value_to_save( $atts, &$value ) {
93 if ( is_object( $atts['field'] ) ) {
94 $field_obj = FrmFieldFactory::get_field_object( $atts['field'] );
95 $value = $field_obj->get_value_to_save(
96 $value,
97 array(
98 'entry_id' => $atts['entry_id'],
99 'field_id' => $atts['field_id'],
100 )
101 );
102 }
103
104 $value = apply_filters( 'frm_prepare_data_before_db', $value, $atts['field_id'], $atts['entry_id'], array( 'field' => $atts['field'] ) );
105 }
106
107 public static function update_entry_metas( $entry_id, $values ) {
108 global $wpdb;
109
110 $prev_values = FrmDb::get_col(
111 $wpdb->prefix . 'frm_item_metas',
112 array(
113 'item_id' => $entry_id,
114 'field_id !' => 0,
115 ),
116 'field_id'
117 );
118
119 foreach ( $values as $field_id => $meta_value ) {
120 $field = false;
121 if ( ! empty( $field_id ) ) {
122 $field = FrmField::getOne( $field_id );
123 }
124
125 self::get_value_to_save( compact( 'field', 'field_id', 'entry_id' ), $meta_value );
126
127 if ( $prev_values && in_array( $field_id, $prev_values ) ) {
128
129 if ( ( is_array( $meta_value ) && empty( $meta_value ) ) || ( ! is_array( $meta_value ) && trim( $meta_value ) == '' ) ) {
130 // remove blank fields
131 unset( $values[ $field_id ] );
132 } else {
133 // if value exists, then update it
134 self::update_entry_meta( $entry_id, $field_id, '', $meta_value );
135 }
136 } else {
137 // if value does not exist, then create it
138 self::add_entry_meta( $entry_id, $field_id, '', $meta_value );
139 }
140 }
141
142 if ( empty( $prev_values ) ) {
143 return;
144 }
145
146 $prev_values = array_diff( $prev_values, array_keys( $values ) );
147
148 if ( empty( $prev_values ) ) {
149 return;
150 }
151
152 // prepare the query
153 $where = array(
154 'item_id' => $entry_id,
155 'field_id' => $prev_values,
156 );
157 FrmDb::get_where_clause_and_values( $where );
158
159 // Delete any leftovers
160 $wpdb->query( $wpdb->prepare( 'DELETE FROM ' . $wpdb->prefix . 'frm_item_metas ' . $where['where'], $where['values'] ) ); // WPCS: unprepared SQL ok.
161 self::clear_cache();
162 }
163
164 public static function duplicate_entry_metas( $old_id, $new_id ) {
165 $metas = self::get_entry_meta_info( $old_id );
166 foreach ( $metas as $meta ) {
167 self::add_entry_meta( $new_id, $meta->field_id, null, $meta->meta_value );
168 unset( $meta );
169 }
170 self::clear_cache();
171 }
172
173 public static function delete_entry_meta( $entry_id, $field_id ) {
174 global $wpdb;
175 self::clear_cache();
176
177 return $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}frm_item_metas WHERE field_id=%d AND item_id=%d", $field_id, $entry_id ) );
178 }
179
180 /**
181 * Clear entry meta caching
182 * Called when a meta is added or changed
183 *
184 * @since 2.0.5
185 */
186 public static function clear_cache() {
187 FrmDb::cache_delete_group( 'frm_entry_meta' );
188 FrmDb::cache_delete_group( 'frm_item_meta' );
189 }
190
191 /**
192 * @since 2.0.9
193 */
194 public static function get_meta_value( $entry, $field_id ) {
195 if ( isset( $entry->metas ) ) {
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 );
199 }
200 }
201
202 public static function get_entry_meta_by_field( $entry_id, $field_id ) {
203 global $wpdb;
204
205 if ( is_object( $entry_id ) ) {
206 $entry = $entry_id;
207 $entry_id = $entry->id;
208 $cached = $entry;
209 } else {
210 $entry_id = (int) $entry_id;
211 $cached = FrmDb::check_cache( $entry_id, 'frm_entry' );
212 }
213
214 if ( $cached && isset( $cached->metas ) && isset( $cached->metas[ $field_id ] ) ) {
215 $result = $cached->metas[ $field_id ];
216
217 return wp_unslash( $result );
218 }
219
220 $get_table = $wpdb->prefix . 'frm_item_metas';
221 $query = array( 'item_id' => $entry_id );
222 if ( is_numeric( $field_id ) ) {
223 $query['field_id'] = $field_id;
224 } else {
225 $get_table .= ' it LEFT OUTER JOIN ' . $wpdb->prefix . 'frm_fields fi ON it.field_id=fi.id';
226 $query['fi.field_key'] = $field_id;
227 }
228
229 $result = FrmDb::get_var( $get_table, $query, 'meta_value' );
230 FrmAppHelper::unserialize_or_decode( $result );
231 $result = wp_unslash( $result );
232
233 return $result;
234 }
235
236 public static function get_entry_metas_for_field( $field_id, $order = '', $limit = '', $args = array() ) {
237 $defaults = array(
238 'value' => false,
239 'unique' => false,
240 'stripslashes' => true,
241 'is_draft' => false,
242 );
243 $args = wp_parse_args( $args, $defaults );
244
245 $query = array();
246 self::meta_field_query( $field_id, $order, $limit, $args, $query );
247 $query = implode( ' ', $query );
248
249 $cache_key = 'entry_metas_for_field_' . $field_id . $order . $limit . FrmAppHelper::maybe_json_encode( $args );
250 $values = FrmDb::check_cache( $cache_key, 'frm_entry', $query, 'get_col' );
251
252 if ( ! $args['stripslashes'] ) {
253 return $values;
254 }
255
256 foreach ( $values as $k => $v ) {
257 FrmAppHelper::unserialize_or_decode( $v );
258 $values[ $k ] = $v;
259 unset( $k, $v );
260 }
261
262 return wp_unslash( $values );
263 }
264
265 /**
266 * @param string $order
267 * @param string $limit
268 */
269 private static function meta_field_query( $field_id, $order, $limit, $args, array &$query ) {
270 global $wpdb;
271 $query[] = 'SELECT';
272 $query[] = $args['unique'] ? 'DISTINCT(em.meta_value)' : 'em.meta_value';
273 $query[] = 'FROM ' . $wpdb->prefix . 'frm_item_metas em ';
274
275 if ( ! $args['is_draft'] ) {
276 $query[] = 'INNER JOIN ' . $wpdb->prefix . 'frm_items e ON (e.id=em.item_id)';
277 }
278
279 if ( is_numeric( $field_id ) ) {
280 $query[] = $wpdb->prepare( 'WHERE em.field_id=%d', $field_id );
281 } else {
282 $query[] = $wpdb->prepare( 'LEFT JOIN ' . $wpdb->prefix . 'frm_fields fi ON (em.field_id = fi.id) WHERE fi.field_key=%s', $field_id );
283 }
284
285 if ( ! $args['is_draft'] ) {
286 $query[] = 'AND e.is_draft=0';
287 }
288
289 if ( $args['value'] ) {
290 $query[] = $wpdb->prepare( ' AND meta_value=%s', $args['value'] );
291 }
292 $query[] = $order . $limit;
293 }
294
295 public static function get_entry_meta_info( $entry_id ) {
296 return FrmDb::get_results( 'frm_item_metas', array( 'item_id' => $entry_id ) );
297 }
298
299 public static function getAll( $where = array(), $order_by = '', $limit = '', $stripslashes = false ) {
300 global $wpdb;
301 $query = 'SELECT it.*, fi.type as field_type, fi.field_key as field_key,
302 fi.required as required, fi.form_id as field_form_id, fi.name as field_name, fi.options as fi_options
303 FROM ' . $wpdb->prefix . 'frm_item_metas it LEFT OUTER JOIN ' . $wpdb->prefix . 'frm_fields fi ON it.field_id=fi.id' .
304 FrmDb::prepend_and_or_where( ' WHERE ', $where ) . $order_by . $limit;
305
306 $cache_key = 'all_' . FrmAppHelper::maybe_json_encode( $where ) . $order_by . $limit;
307 $results = FrmDb::check_cache( $cache_key, 'frm_entry', $query, ( $limit == ' LIMIT 1' ? 'get_row' : 'get_results' ) );
308
309 if ( ! $results || ! $stripslashes ) {
310 return $results;
311 }
312
313 foreach ( $results as $k => $result ) {
314 FrmAppHelper::unserialize_or_decode( $result->meta_value );
315 $results[ $k ]->meta_value = wp_unslash( $result->meta_value );
316 unset( $k, $result );
317 }
318
319 return $results;
320 }
321
322 public static function getEntryIds( $where = array(), $order_by = '', $limit = '', $unique = true, $args = array() ) {
323 $defaults = array(
324 'is_draft' => false,
325 'user_id' => '',
326 'group_by' => '',
327 );
328 $args = wp_parse_args( $args, $defaults );
329
330 $query = array();
331 self::get_ids_query( $where, $order_by, $limit, $unique, $args, $query );
332 $query = implode( ' ', $query );
333
334 $cache_key = 'ids_' . FrmAppHelper::maybe_json_encode( $where ) . $order_by . 'l' . $limit . 'u' . $unique . FrmAppHelper::maybe_json_encode( $args );
335
336 return FrmDb::check_cache( $cache_key, 'frm_entry', $query, ( $limit == ' LIMIT 1' ? 'get_var' : 'get_col' ) );
337 }
338
339 /**
340 * @param string|array $where
341 * @param string $order_by
342 * @param string $limit
343 */
344 private static function get_ids_query( $where, $order_by, $limit, $unique, $args, array &$query ) {
345 global $wpdb;
346 $query[] = 'SELECT';
347
348 $defaults = array( 'return_parent_id' => false );
349 $args = array_merge( $defaults, $args );
350
351 if ( $args['return_parent_id'] ) {
352 $query[] = $unique ? 'DISTINCT(e.parent_item_id)' : 'e.parent_item_id';
353 } else {
354 $query[] = $unique ? 'DISTINCT(it.item_id)' : 'it.item_id';
355 }
356
357 $query[] = 'FROM ' . $wpdb->prefix . 'frm_item_metas it LEFT OUTER JOIN ' . $wpdb->prefix . 'frm_fields fi ON it.field_id=fi.id';
358
359 $query[] = 'INNER JOIN ' . $wpdb->prefix . 'frm_items e ON (e.id=it.item_id)';
360 if ( is_array( $where ) ) {
361 if ( ! $args['is_draft'] ) {
362 $where['e.is_draft'] = 0;
363 } elseif ( $args['is_draft'] == 1 ) {
364 $where['e.is_draft'] = 1;
365 }
366
367 if ( ! empty( $args['user_id'] ) ) {
368 $where['e.user_id'] = $args['user_id'];
369 }
370 $query[] = FrmDb::prepend_and_or_where( ' WHERE ', $where ) . $order_by . $limit;
371
372 if ( $args['group_by'] ) {
373 $query[] = ' GROUP BY ' . sanitize_text_field( $args['group_by'] );
374 }
375
376 return;
377 }
378
379 $draft_where = '';
380 $user_where = '';
381 if ( ! $args['is_draft'] ) {
382 $draft_where = $wpdb->prepare( ' AND e.is_draft=%d', 0 );
383 } elseif ( $args['is_draft'] == 1 ) {
384 $draft_where = $wpdb->prepare( ' AND e.is_draft=%d', 1 );
385 }
386
387 if ( ! empty( $args['user_id'] ) ) {
388 $user_where = $wpdb->prepare( ' AND e.user_id=%d', $args['user_id'] );
389 }
390
391 if ( strpos( $where, ' GROUP BY ' ) ) {
392 // don't inject WHERE filtering after GROUP BY
393 $parts = explode( ' GROUP BY ', $where );
394 $where = $parts[0];
395 $where .= $draft_where . $user_where;
396 $where .= ' GROUP BY ' . $parts[1];
397 } else {
398 $where .= $draft_where . $user_where;
399 }
400
401 // The query has already been prepared
402 $query[] = FrmDb::prepend_and_or_where( ' WHERE ', $where ) . $order_by . $limit;
403 }
404
405 public static function search_entry_metas( $search, $field_id = '', $operator ) {
406 $cache_key = 'search_' . FrmAppHelper::maybe_json_encode( $search ) . $field_id . $operator;
407 $results = wp_cache_get( $cache_key, 'frm_entry' );
408 if ( false !== $results ) {
409 return $results;
410 }
411
412 global $wpdb;
413 if ( is_array( $search ) ) {
414 $where = '';
415 foreach ( $search as $field => $value ) {
416 if ( $value <= 0 || ! in_array( $field, array( 'year', 'month', 'day' ) ) ) {
417 continue;
418 }
419
420 switch ( $field ) {
421 case 'year':
422 $value = '%' . $value;
423 break;
424 case 'month':
425 $value .= '%';
426 break;
427 case 'day':
428 $value = '%' . $value . '%';
429 }
430 $where .= $wpdb->prepare( ' meta_value ' . $operator . ' %s and', $value ); // WPCS: unprepared SQL ok.
431 }
432 $where .= $wpdb->prepare( ' field_id=%d', $field_id );
433 $query = 'SELECT DISTINCT item_id FROM ' . $wpdb->prefix . 'frm_item_metas' . FrmDb::prepend_and_or_where( ' WHERE ', $where );
434 } else {
435 if ( $operator == 'LIKE' ) {
436 $search = '%' . $search . '%';
437 }
438 $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.
439 }
440
441 $results = $wpdb->get_col( $query, 0 ); // WPCS: unprepared SQL ok.
442 FrmDb::set_cache( $cache_key, $results, 'frm_entry' );
443
444 return $results;
445 }
446 }
447