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
formidable / classes / models / FrmEntryMeta.php

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

440 lines 13.6 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 $values['meta_value'] = $field_obj->set_value_before_save( $values['meta_value'] );
85 }
86 }
87
88 /**
89 * @since 3.0
90 */
91 private static function get_value_to_save( $atts, &$value ) {
92 if ( is_object( $atts['field'] ) ) {
93 $field_obj = FrmFieldFactory::get_field_object( $atts['field'] );
94 $value = $field_obj->get_value_to_save(
95 $value,
96 array(
97 'entry_id' => $atts['entry_id'],
98 'field_id' => $atts['field_id'],
99 )
100 );
101 }
102
103 $value = apply_filters( 'frm_prepare_data_before_db', $value, $atts['field_id'], $atts['entry_id'], array( 'field' => $atts['field'] ) );
104 }
105
106 public static function update_entry_metas( $entry_id, $values ) {
107 global $wpdb;
108
109 $prev_values = FrmDb::get_col(
110 $wpdb->prefix . 'frm_item_metas',
111 array(
112 'item_id' => $entry_id,
113 'field_id !' => 0,
114 ),
115 'field_id'
116 );
117
118 foreach ( $values as $field_id => $meta_value ) {
119 $field = false;
120 if ( ! empty( $field_id ) ) {
121 $field = FrmField::getOne( $field_id );
122 }
123
124 self::get_value_to_save( compact( 'field', 'field_id', 'entry_id' ), $meta_value );
125
126 if ( $prev_values && in_array( $field_id, $prev_values ) ) {
127
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 }
135 } else {
136 // if value does not exist, then create it
137 self::add_entry_meta( $entry_id, $field_id, '', $meta_value );
138 }
139 }
140
141 if ( empty( $prev_values ) ) {
142 return;
143 }
144
145 $prev_values = array_diff( $prev_values, array_keys( $values ) );
146
147 if ( empty( $prev_values ) ) {
148 return;
149 }
150
151 // prepare the query
152 $where = array(
153 'item_id' => $entry_id,
154 'field_id' => $prev_values,
155 );
156 FrmDb::get_where_clause_and_values( $where );
157
158 // Delete any leftovers
159 $wpdb->query( $wpdb->prepare( 'DELETE FROM ' . $wpdb->prefix . 'frm_item_metas ' . $where['where'], $where['values'] ) ); // WPCS: unprepared SQL ok.
160 self::clear_cache();
161 }
162
163 public static function duplicate_entry_metas( $old_id, $new_id ) {
164 $metas = self::get_entry_meta_info( $old_id );
165 foreach ( $metas as $meta ) {
166 self::add_entry_meta( $new_id, $meta->field_id, null, $meta->meta_value );
167 unset( $meta );
168 }
169 self::clear_cache();
170 }
171
172 public static function delete_entry_meta( $entry_id, $field_id ) {
173 global $wpdb;
174 self::clear_cache();
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 ) );
176 }
177
178 /**
179 * Clear entry meta caching
180 * Called when a meta is added or changed
181 *
182 * @since 2.0.5
183 */
184 public static function clear_cache() {
185 FrmDb::cache_delete_group( 'frm_entry_meta' );
186 FrmDb::cache_delete_group( 'frm_item_meta' );
187 }
188
189 /**
190 * @since 2.0.9
191 */
192 public static function get_meta_value( $entry, $field_id ) {
193 if ( isset( $entry->metas ) ) {
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 );
197 }
198 }
199
200 public static function get_entry_meta_by_field( $entry_id, $field_id ) {
201 global $wpdb;
202
203 if ( is_object( $entry_id ) ) {
204 $entry = $entry_id;
205 $entry_id = $entry->id;
206 $cached = $entry;
207 } else {
208 $entry_id = (int) $entry_id;
209 $cached = FrmDb::check_cache( $entry_id, 'frm_entry' );
210 }
211
212 if ( $cached && isset( $cached->metas ) && isset( $cached->metas[ $field_id ] ) ) {
213 $result = $cached->metas[ $field_id ];
214 return stripslashes_deep( $result );
215 }
216
217 $get_table = $wpdb->prefix . 'frm_item_metas';
218 $query = array( 'item_id' => $entry_id );
219 if ( is_numeric( $field_id ) ) {
220 $query['field_id'] = $field_id;
221 } else {
222 $get_table .= ' it LEFT OUTER JOIN ' . $wpdb->prefix . 'frm_fields fi ON it.field_id=fi.id';
223 $query['fi.field_key'] = $field_id;
224 }
225
226 $result = FrmDb::get_var( $get_table, $query, 'meta_value' );
227 $result = maybe_unserialize( $result );
228 $result = stripslashes_deep( $result );
229
230 return $result;
231 }
232
233 public static function get_entry_metas_for_field( $field_id, $order = '', $limit = '', $args = array() ) {
234 $defaults = array(
235 'value' => false,
236 'unique' => false,
237 'stripslashes' => true,
238 'is_draft' => false,
239 );
240 $args = wp_parse_args( $args, $defaults );
241
242 $query = array();
243 self::meta_field_query( $field_id, $order, $limit, $args, $query );
244 $query = implode( ' ', $query );
245
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' );
248
249 if ( ! $args['stripslashes'] ) {
250 return $values;
251 }
252
253 foreach ( $values as $k => $v ) {
254 $values[ $k ] = maybe_unserialize( $v );
255 unset( $k, $v );
256 }
257
258 return stripslashes_deep( $values );
259 }
260
261 /**
262 * @param string $order
263 * @param string $limit
264 */
265 private static function meta_field_query( $field_id, $order, $limit, $args, array &$query ) {
266 global $wpdb;
267 $query[] = 'SELECT';
268 $query[] = $args['unique'] ? 'DISTINCT(em.meta_value)' : 'em.meta_value';
269 $query[] = 'FROM ' . $wpdb->prefix . 'frm_item_metas em ';
270
271 if ( ! $args['is_draft'] ) {
272 $query[] = 'INNER JOIN ' . $wpdb->prefix . 'frm_items e ON (e.id=em.item_id)';
273 }
274
275 if ( is_numeric( $field_id ) ) {
276 $query[] = $wpdb->prepare( 'WHERE em.field_id=%d', $field_id );
277 } else {
278 $query[] = $wpdb->prepare( 'LEFT JOIN ' . $wpdb->prefix . 'frm_fields fi ON (em.field_id = fi.id) WHERE fi.field_key=%s', $field_id );
279 }
280
281 if ( ! $args['is_draft'] ) {
282 $query[] = 'AND e.is_draft=0';
283 }
284
285 if ( $args['value'] ) {
286 $query[] = $wpdb->prepare( ' AND meta_value=%s', $args['value'] );
287 }
288 $query[] = $order . $limit;
289 }
290
291 public static function get_entry_meta_info( $entry_id ) {
292 return FrmDb::get_results( 'frm_item_metas', array( 'item_id' => $entry_id ) );
293 }
294
295 public static function getAll( $where = array(), $order_by = '', $limit = '', $stripslashes = false ) {
296 global $wpdb;
297 $query = 'SELECT it.*, fi.type as field_type, fi.field_key as field_key,
298 fi.required as required, fi.form_id as field_form_id, fi.name as field_name, fi.options as fi_options
299 FROM ' . $wpdb->prefix . 'frm_item_metas it LEFT OUTER JOIN ' . $wpdb->prefix . 'frm_fields fi ON it.field_id=fi.id' .
300 FrmDb::prepend_and_or_where( ' WHERE ', $where ) . $order_by . $limit;
301
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' ) );
304
305 if ( ! $results || ! $stripslashes ) {
306 return $results;
307 }
308
309 foreach ( $results as $k => $result ) {
310 $results[ $k ]->meta_value = stripslashes_deep( maybe_unserialize( $result->meta_value ) );
311 unset( $k, $result );
312 }
313
314 return $results;
315 }
316
317 public static function getEntryIds( $where = array(), $order_by = '', $limit = '', $unique = true, $args = array() ) {
318 $defaults = array(
319 'is_draft' => false,
320 'user_id' => '',
321 'group_by' => '',
322 );
323 $args = wp_parse_args( $args, $defaults );
324
325 $query = array();
326 self::get_ids_query( $where, $order_by, $limit, $unique, $args, $query );
327 $query = implode( ' ', $query );
328
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 }
332
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';
341
342 $defaults = array( 'return_parent_id' => false );
343 $args = array_merge( $defaults, $args );
344
345 if ( $args['return_parent_id'] ) {
346 $query[] = $unique ? 'DISTINCT(e.parent_item_id)' : 'e.parent_item_id';
347 } else {
348 $query[] = $unique ? 'DISTINCT(it.item_id)' : 'it.item_id';
349 }
350
351 $query[] = 'FROM ' . $wpdb->prefix . 'frm_item_metas it LEFT OUTER JOIN ' . $wpdb->prefix . 'frm_fields fi ON it.field_id=fi.id';
352
353 $query[] = 'INNER JOIN ' . $wpdb->prefix . 'frm_items e ON (e.id=it.item_id)';
354 if ( is_array( $where ) ) {
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 }
360
361 if ( ! empty( $args['user_id'] ) ) {
362 $where['e.user_id'] = $args['user_id'];
363 }
364 $query[] = FrmDb::prepend_and_or_where( ' WHERE ', $where ) . $order_by . $limit;
365
366 if ( $args['group_by'] ) {
367 $query[] = ' GROUP BY ' . sanitize_text_field( $args['group_by'] );
368 }
369 return;
370 }
371
372 $draft_where = '';
373 $user_where = '';
374 if ( ! $args['is_draft'] ) {
375 $draft_where = $wpdb->prepare( ' AND e.is_draft=%d', 0 );
376 } else if ( $args['is_draft'] == 1 ) {
377 $draft_where = $wpdb->prepare( ' AND e.is_draft=%d', 1 );
378 }
379
380 if ( ! empty( $args['user_id'] ) ) {
381 $user_where = $wpdb->prepare( ' AND e.user_id=%d', $args['user_id'] );
382 }
383
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;
389 $where .= ' GROUP BY ' . $parts[1];
390 } else {
391 $where .= $draft_where . $user_where;
392 }
393
394 // The query has already been prepared
395 $query[] = FrmDb::prepend_and_or_where( ' WHERE ', $where ) . $order_by . $limit;
396 }
397
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 }
404
405 global $wpdb;
406 if ( is_array( $search ) ) {
407 $where = '';
408 foreach ( $search as $field => $value ) {
409 if ( $value <= 0 || ! in_array( $field, array( 'year', 'month', 'day' ) ) ) {
410 continue;
411 }
412
413 switch ( $field ) {
414 case 'year':
415 $value = '%' . $value;
416 break;
417 case 'month':
418 $value .= '%';
419 break;
420 case 'day':
421 $value = '%' . $value . '%';
422 }
423 $where .= $wpdb->prepare( ' meta_value ' . $operator . ' %s and', $value ); // WPCS: unprepared SQL ok.
424 }
425 $where .= $wpdb->prepare( ' field_id=%d', $field_id );
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 . '%';
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 }
433
434 $results = $wpdb->get_col( $query, 0 ); // WPCS: unprepared SQL ok.
435 FrmDb::set_cache( $cache_key, $results, 'frm_entry' );
436
437 return $results;
438 }
439 }
440