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

445 lines 12.9 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 $result = maybe_unserialize( $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 . maybe_serialize( $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 $values[ $k ] = maybe_unserialize( $v );
258 unset( $k, $v );
259 }
260
261 return wp_unslash( $values );
262 }
263
264 /**
265 * @param string $order
266 * @param string $limit
267 */
268 private static function meta_field_query( $field_id, $order, $limit, $args, array &$query ) {
269 global $wpdb;
270 $query[] = 'SELECT';
271 $query[] = $args['unique'] ? 'DISTINCT(em.meta_value)' : 'em.meta_value';
272 $query[] = 'FROM ' . $wpdb->prefix . 'frm_item_metas em ';
273
274 if ( ! $args['is_draft'] ) {
275 $query[] = 'INNER JOIN ' . $wpdb->prefix . 'frm_items e ON (e.id=em.item_id)';
276 }
277
278 if ( is_numeric( $field_id ) ) {
279 $query[] = $wpdb->prepare( 'WHERE em.field_id=%d', $field_id );
280 } else {
281 $query[] = $wpdb->prepare( 'LEFT JOIN ' . $wpdb->prefix . 'frm_fields fi ON (em.field_id = fi.id) WHERE fi.field_key=%s', $field_id );
282 }
283
284 if ( ! $args['is_draft'] ) {
285 $query[] = 'AND e.is_draft=0';
286 }
287
288 if ( $args['value'] ) {
289 $query[] = $wpdb->prepare( ' AND meta_value=%s', $args['value'] );
290 }
291 $query[] = $order . $limit;
292 }
293
294 public static function get_entry_meta_info( $entry_id ) {
295 return FrmDb::get_results( 'frm_item_metas', array( 'item_id' => $entry_id ) );
296 }
297
298 public static function getAll( $where = array(), $order_by = '', $limit = '', $stripslashes = false ) {
299 global $wpdb;
300 $query = 'SELECT it.*, fi.type as field_type, fi.field_key as field_key,
301 fi.required as required, fi.form_id as field_form_id, fi.name as field_name, fi.options as fi_options
302 FROM ' . $wpdb->prefix . 'frm_item_metas it LEFT OUTER JOIN ' . $wpdb->prefix . 'frm_fields fi ON it.field_id=fi.id' .
303 FrmDb::prepend_and_or_where( ' WHERE ', $where ) . $order_by . $limit;
304
305 $cache_key = 'all_' . maybe_serialize( $where ) . $order_by . $limit;
306 $results = FrmDb::check_cache( $cache_key, 'frm_entry', $query, ( $limit == ' LIMIT 1' ? 'get_row' : 'get_results' ) );
307
308 if ( ! $results || ! $stripslashes ) {
309 return $results;
310 }
311
312 foreach ( $results as $k => $result ) {
313 $results[ $k ]->meta_value = wp_unslash( maybe_unserialize( $result->meta_value ) );
314 unset( $k, $result );
315 }
316
317 return $results;
318 }
319
320 public static function getEntryIds( $where = array(), $order_by = '', $limit = '', $unique = true, $args = array() ) {
321 $defaults = array(
322 'is_draft' => false,
323 'user_id' => '',
324 'group_by' => '',
325 );
326 $args = wp_parse_args( $args, $defaults );
327
328 $query = array();
329 self::get_ids_query( $where, $order_by, $limit, $unique, $args, $query );
330 $query = implode( ' ', $query );
331
332 $cache_key = 'ids_' . maybe_serialize( $where ) . $order_by . 'l' . $limit . 'u' . $unique . maybe_serialize( $args );
333
334 return FrmDb::check_cache( $cache_key, 'frm_entry', $query, ( $limit == ' LIMIT 1' ? 'get_var' : 'get_col' ) );
335 }
336
337 /**
338 * @param string|array $where
339 * @param string $order_by
340 * @param string $limit
341 */
342 private static function get_ids_query( $where, $order_by, $limit, $unique, $args, array &$query ) {
343 global $wpdb;
344 $query[] = 'SELECT';
345
346 $defaults = array( 'return_parent_id' => false );
347 $args = array_merge( $defaults, $args );
348
349 if ( $args['return_parent_id'] ) {
350 $query[] = $unique ? 'DISTINCT(e.parent_item_id)' : 'e.parent_item_id';
351 } else {
352 $query[] = $unique ? 'DISTINCT(it.item_id)' : 'it.item_id';
353 }
354
355 $query[] = 'FROM ' . $wpdb->prefix . 'frm_item_metas it LEFT OUTER JOIN ' . $wpdb->prefix . 'frm_fields fi ON it.field_id=fi.id';
356
357 $query[] = 'INNER JOIN ' . $wpdb->prefix . 'frm_items e ON (e.id=it.item_id)';
358 if ( is_array( $where ) ) {
359 if ( ! $args['is_draft'] ) {
360 $where['e.is_draft'] = 0;
361 } elseif ( $args['is_draft'] == 1 ) {
362 $where['e.is_draft'] = 1;
363 }
364
365 if ( ! empty( $args['user_id'] ) ) {
366 $where['e.user_id'] = $args['user_id'];
367 }
368 $query[] = FrmDb::prepend_and_or_where( ' WHERE ', $where ) . $order_by . $limit;
369
370 if ( $args['group_by'] ) {
371 $query[] = ' GROUP BY ' . sanitize_text_field( $args['group_by'] );
372 }
373
374 return;
375 }
376
377 $draft_where = '';
378 $user_where = '';
379 if ( ! $args['is_draft'] ) {
380 $draft_where = $wpdb->prepare( ' AND e.is_draft=%d', 0 );
381 } elseif ( $args['is_draft'] == 1 ) {
382 $draft_where = $wpdb->prepare( ' AND e.is_draft=%d', 1 );
383 }
384
385 if ( ! empty( $args['user_id'] ) ) {
386 $user_where = $wpdb->prepare( ' AND e.user_id=%d', $args['user_id'] );
387 }
388
389 if ( strpos( $where, ' GROUP BY ' ) ) {
390 // don't inject WHERE filtering after GROUP BY
391 $parts = explode( ' GROUP BY ', $where );
392 $where = $parts[0];
393 $where .= $draft_where . $user_where;
394 $where .= ' GROUP BY ' . $parts[1];
395 } else {
396 $where .= $draft_where . $user_where;
397 }
398
399 // The query has already been prepared
400 $query[] = FrmDb::prepend_and_or_where( ' WHERE ', $where ) . $order_by . $limit;
401 }
402
403 public static function search_entry_metas( $search, $field_id = '', $operator ) {
404 $cache_key = 'search_' . maybe_serialize( $search ) . $field_id . $operator;
405 $results = wp_cache_get( $cache_key, 'frm_entry' );
406 if ( false !== $results ) {
407 return $results;
408 }
409
410 global $wpdb;
411 if ( is_array( $search ) ) {
412 $where = '';
413 foreach ( $search as $field => $value ) {
414 if ( $value <= 0 || ! in_array( $field, array( 'year', 'month', 'day' ) ) ) {
415 continue;
416 }
417
418 switch ( $field ) {
419 case 'year':
420 $value = '%' . $value;
421 break;
422 case 'month':
423 $value .= '%';
424 break;
425 case 'day':
426 $value = '%' . $value . '%';
427 }
428 $where .= $wpdb->prepare( ' meta_value ' . $operator . ' %s and', $value ); // WPCS: unprepared SQL ok.
429 }
430 $where .= $wpdb->prepare( ' field_id=%d', $field_id );
431 $query = 'SELECT DISTINCT item_id FROM ' . $wpdb->prefix . 'frm_item_metas' . FrmDb::prepend_and_or_where( ' WHERE ', $where );
432 } else {
433 if ( $operator == 'LIKE' ) {
434 $search = '%' . $search . '%';
435 }
436 $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.
437 }
438
439 $results = $wpdb->get_col( $query, 0 ); // WPCS: unprepared SQL ok.
440 FrmDb::set_cache( $cache_key, $results, 'frm_entry' );
441
442 return $results;
443 }
444 }
445