| @@ -68,11 +68,8 @@ | ||
| 68 | 68 | if ( ! $entry_exists || ! isset( $values['item_meta'] ) ) { |
| 69 | 69 | return false; |
| 70 | 70 | } |
| 71 | 71 | |
| 72 | - global $frm_vars; | |
| 73 | - $frm_vars['checking_duplicates'] = true; | |
| 74 | - | |
| 75 | 72 | $is_duplicate = false; |
| 76 | 73 | foreach ( $entry_exists as $entry_exist ) { |
| 77 | 74 | $is_duplicate = true; |
| 78 | 75 | |
| @@ -118,10 +115,8 @@ | ||
| 118 | 115 | break; |
| 119 | 116 | } |
| 120 | 117 | } |
| 121 | 118 | |
| 122 | - $frm_vars['checking_duplicates'] = false; | |
| 123 | - | |
| 124 | 119 | return $is_duplicate; |
| 125 | 120 | } |
| 126 | 121 | |
| 127 | 122 | /** |
| @@ -250,30 +245,19 @@ | ||
| 250 | 245 | |
| 251 | 246 | return $query_results; |
| 252 | 247 | } |
| 253 | 248 | |
| 254 | - /** | |
| 255 | - * Delete an entry. | |
| 256 | - * | |
| 257 | - * @param string|int $id | |
| 258 | - * @return bool True on success, false if nothing was deleted. | |
| 259 | - */ | |
| 260 | 249 | public static function destroy( $id ) { |
| 261 | 250 | global $wpdb; |
| 262 | 251 | $id = (int) $id; |
| 263 | 252 | |
| 264 | - $entry = self::getOne( $id, true ); // Item meta is required for conditional logic in actions with 'delete' events. | |
| 253 | + $entry = self::getOne( $id ); | |
| 265 | 254 | if ( ! $entry ) { |
| 266 | 255 | $result = false; |
| 256 | + | |
| 267 | 257 | return $result; |
| 268 | 258 | } |
| 269 | 259 | |
| 270 | - /** | |
| 271 | - * Trigger an action to run custom logic before the entry is deleted. | |
| 272 | - * | |
| 273 | - * @param int $id The id of the entry that was destroyed. | |
| 274 | - * @param stdClass $entry The entry object. | |
| 275 | - */ | |
| 276 | 260 | do_action( 'frm_before_destroy_entry', $id, $entry ); |
| 277 | 261 | |
| 278 | 262 | $wpdb->query( $wpdb->prepare( 'DELETE FROM ' . $wpdb->prefix . 'frm_item_metas WHERE item_id=%d', $id ) ); |
| 279 | 263 | $result = $wpdb->query( $wpdb->prepare( 'DELETE FROM ' . $wpdb->prefix . 'frm_items WHERE id=%d', $id ) ); |
| @@ -279,19 +263,8 @@ | ||
| 279 | 263 | $result = $wpdb->query( $wpdb->prepare( 'DELETE FROM ' . $wpdb->prefix . 'frm_items WHERE id=%d', $id ) ); |
| 280 | 264 | |
| 281 | 265 | self::clear_cache(); |
| 282 | 266 | |
| 283 | - /** | |
| 284 | - * Trigger an action to run custom logic after the entry is deleted. | |
| 285 | - * Use this hook if you need to update caching after an entry is deleted. | |
| 286 | - * | |
| 287 | - * @since 5.4.1 | |
| 288 | - * | |
| 289 | - * @param int $id The id of the entry that was destroyed. | |
| 290 | - * @param stdClass $entry The entry object. | |
| 291 | - */ | |
| 292 | - do_action( 'frm_after_destroy_entry', $id, $entry ); | |
| 293 | - | |
| 294 | 267 | return $result; |
| 295 | 268 | } |
| 296 | 269 | |
| 297 | 270 | public static function update_form( $id, $value, $form_id ) { |
| @@ -355,9 +328,9 @@ | ||
| 355 | 328 | LEFT OUTER JOIN {$wpdb->prefix}frm_forms fr ON it.form_id=fr.id WHERE "; |
| 356 | 329 | |
| 357 | 330 | $query .= is_numeric( $id ) ? 'it.id=%d' : 'it.item_key=%s'; |
| 358 | 331 | $query_args = array( $id ); |
| 359 | - $query = $wpdb->prepare( $query, $query_args ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared | |
| 332 | + $query = $wpdb->prepare( $query, $query_args ); // WPCS: unprepared SQL ok. | |
| 360 | 333 | |
| 361 | 334 | if ( ! $meta ) { |
| 362 | 335 | $entry = FrmDb::check_cache( $id . '_nometa', 'frm_entry', $query, 'get_row' ); |
| 363 | 336 | self::prepare_entry( $entry ); |
| @@ -369,9 +342,9 @@ | ||
| 369 | 342 | self::prepare_entry( $entry ); |
| 370 | 343 | return $entry; |
| 371 | 344 | } |
| 372 | 345 | |
| 373 | - $entry = $wpdb->get_row( $query ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared | |
| 346 | + $entry = $wpdb->get_row( $query ); // WPCS: unprepared SQL ok. | |
| 374 | 347 | $entry = self::get_meta( $entry ); |
| 375 | 348 | self::prepare_entry( $entry ); |
| 376 | 349 | |
| 377 | 350 | return $entry; |
| @@ -414,9 +387,9 @@ | ||
| 414 | 387 | array( |
| 415 | 388 | 'item_id' => $entry->id, |
| 416 | 389 | 'field_id !' => 0, |
| 417 | 390 | ), |
| 418 | - 'field_id, meta_value, field_key, item_id, f.type' | |
| 391 | + 'field_id, meta_value, field_key, item_id' | |
| 419 | 392 | ); |
| 420 | 393 | |
| 421 | 394 | $entry->metas = array(); |
| 422 | 395 | |
| @@ -421,11 +394,10 @@ | ||
| 421 | 394 | $entry->metas = array(); |
| 422 | 395 | |
| 423 | 396 | $include_key = apply_filters( 'frm_include_meta_keys', false, array( 'form_id' => $entry->form_id ) ); |
| 424 | 397 | foreach ( $metas as $meta_val ) { |
| 425 | - FrmFieldsHelper::prepare_field_value( $meta_val->meta_value, $meta_val->type ); | |
| 426 | - | |
| 427 | 398 | if ( $meta_val->item_id == $entry->id ) { |
| 399 | + FrmAppHelper::unserialize_or_decode( $meta_val->meta_value ); | |
| 428 | 400 | $entry->metas[ $meta_val->field_id ] = $meta_val->meta_value; |
| 429 | 401 | if ( $include_key ) { |
| 430 | 402 | $entry->metas[ $meta_val->field_key ] = $entry->metas[ $meta_val->field_id ]; |
| 431 | 403 | } |
| @@ -436,8 +408,9 @@ | ||
| 436 | 408 | if ( ! isset( $entry->metas[ $meta_val->field_id ] ) ) { |
| 437 | 409 | $entry->metas[ $meta_val->field_id ] = array(); |
| 438 | 410 | } |
| 439 | 411 | |
| 412 | + FrmAppHelper::unserialize_or_decode( $meta_val->meta_value ); | |
| 440 | 413 | $entry->metas[ $meta_val->field_id ][] = $meta_val->meta_value; |
| 441 | 414 | |
| 442 | 415 | unset( $meta_val ); |
| 443 | 416 | } |
| @@ -478,9 +451,9 @@ | ||
| 478 | 451 | $cache_key = FrmAppHelper::maybe_json_encode( $where ) . $order_by . $limit . $inc_form; |
| 479 | 452 | $entries = wp_cache_get( $cache_key, 'frm_entry' ); |
| 480 | 453 | |
| 481 | 454 | if ( false === $entries ) { |
| 482 | - $fields = 'it.id, it.item_key, it.name, it.ip, it.form_id, it.post_id, it.user_id, it.parent_item_id, it.updated_by, it.created_at, it.updated_at, it.is_draft, it.description'; | |
| 455 | + $fields = 'it.id, it.item_key, it.name, it.ip, it.form_id, it.post_id, it.user_id, it.parent_item_id, it.updated_by, it.created_at, it.updated_at, it.is_draft'; | |
| 483 | 456 | $table = $wpdb->prefix . 'frm_items it '; |
| 484 | 457 | |
| 485 | 458 | if ( $inc_form ) { |
| 486 | 459 | $fields = 'it.*, fr.name as form_name,fr.form_key as form_key'; |
| @@ -487,16 +460,18 @@ | ||
| 487 | 460 | $table .= 'LEFT OUTER JOIN ' . $wpdb->prefix . 'frm_forms fr ON it.form_id=fr.id '; |
| 488 | 461 | } |
| 489 | 462 | |
| 490 | 463 | if ( preg_match( '/ meta_([0-9]+)/', $order_by, $order_matches ) ) { |
| 491 | - $fields .= self::sort_by_field( $order_matches[1] ); | |
| 492 | - unset( $order_matches ); | |
| 464 | + // sort by a requested field | |
| 465 | + $field_id = (int) $order_matches[1]; | |
| 466 | + $fields .= ', (SELECT meta_value FROM ' . $wpdb->prefix . 'frm_item_metas WHERE field_id = ' . $field_id . ' AND item_id = it.id) as meta_' . $field_id; | |
| 467 | + unset( $order_matches, $field_id ); | |
| 493 | 468 | } |
| 494 | 469 | |
| 495 | 470 | // prepare the query |
| 496 | 471 | $query = 'SELECT ' . $fields . ' FROM ' . $table . FrmDb::prepend_and_or_where( ' WHERE ', $where ) . $order_by . $limit; |
| 497 | 472 | |
| 498 | - $entries = $wpdb->get_results( $query, OBJECT_K ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared | |
| 473 | + $entries = $wpdb->get_results( $query, OBJECT_K ); // WPCS: unprepared SQL ok. | |
| 499 | 474 | unset( $query ); |
| 500 | 475 | |
| 501 | 476 | FrmDb::set_cache( $cache_key, $entries, 'frm_entry' ); |
| 502 | 477 | } |
| @@ -517,13 +492,9 @@ | ||
| 517 | 492 | } else { |
| 518 | 493 | $meta_where['item_id'] = array_keys( $entries ); |
| 519 | 494 | } |
| 520 | 495 | |
| 521 | - $metas = FrmDb::get_results( | |
| 522 | - $wpdb->prefix . 'frm_item_metas it LEFT OUTER JOIN ' . $wpdb->prefix . 'frm_fields fi ON it.field_id = fi.id', | |
| 523 | - $meta_where, | |
| 524 | - 'item_id, meta_value, field_id, field_key, form_id, fi.type' | |
| 525 | - ); | |
| 496 | + $metas = FrmDb::get_results( $wpdb->prefix . 'frm_item_metas it LEFT OUTER JOIN ' . $wpdb->prefix . 'frm_fields fi ON (it.field_id = fi.id)', $meta_where, 'item_id, meta_value, field_id, field_key, form_id' ); | |
| 526 | 497 | |
| 527 | 498 | unset( $meta_where ); |
| 528 | 499 | |
| 529 | 500 | if ( ! $metas ) { |
| @@ -539,9 +510,9 @@ | ||
| 539 | 510 | if ( ! isset( $entries[ $meta_val->item_id ]->metas ) ) { |
| 540 | 511 | $entries[ $meta_val->item_id ]->metas = array(); |
| 541 | 512 | } |
| 542 | 513 | |
| 543 | - FrmFieldsHelper::prepare_field_value( $meta_val->meta_value, $meta_val->type ); | |
| 514 | + FrmAppHelper::unserialize_or_decode( $meta_val->meta_value ); | |
| 544 | 515 | $entries[ $meta_val->item_id ]->metas[ $meta_val->field_id ] = $meta_val->meta_value; |
| 545 | 516 | unset( $m_key, $meta_val ); |
| 546 | 517 | } |
| 547 | 518 | |
| @@ -555,28 +526,8 @@ | ||
| 555 | 526 | self::prepare_entries( $entries ); |
| 556 | 527 | return $entries; |
| 557 | 528 | } |
| 558 | 529 | |
| 559 | - /** | |
| 560 | - * @param int $field_id | |
| 561 | - * @return string | |
| 562 | - */ | |
| 563 | - private static function sort_by_field( $field_id ) { | |
| 564 | - global $wpdb; | |
| 565 | - $field_id = (int) $field_id; | |
| 566 | - | |
| 567 | - $field_options = FrmDb::get_var( 'frm_fields', array( 'id' => $field_id ), 'field_options' ); | |
| 568 | - FrmAppHelper::unserialize_or_decode( $field_options ); | |
| 569 | - | |
| 570 | - if ( empty( $field_options['post_field'] ) ) { | |
| 571 | - $sort = ', (SELECT meta_value FROM ' . $wpdb->prefix . 'frm_item_metas WHERE field_id = ' . $field_id . ' AND item_id = it.id) as meta_' . $field_id; | |
| 572 | - } else { | |
| 573 | - $sort = ''; | |
| 574 | - } | |
| 575 | - | |
| 576 | - return apply_filters( 'frm_handle_field_column_sort', $sort, $field_id, $field_options ); | |
| 577 | - } | |
| 578 | - | |
| 579 | 530 | // Pagination Methods |
| 580 | 531 | /** |
| 581 | 532 | * @param int|array|string If int, use the form id. |
| 582 | 533 | */ |
| @@ -754,13 +705,9 @@ | ||
| 754 | 705 | * |
| 755 | 706 | * @return int |
| 756 | 707 | */ |
| 757 | 708 | private static function get_is_draft_value( $values ) { |
| 758 | - if ( isset( $values['frm_saving_draft'] ) && FrmEntriesHelper::DRAFT_ENTRY_STATUS === (int) $values['frm_saving_draft'] ) { | |
| 759 | - return FrmEntriesHelper::DRAFT_ENTRY_STATUS; | |
| 760 | - } | |
| 761 | - | |
| 762 | - return isset( $values['is_draft'] ) ? absint( $values['is_draft'] ) : FrmEntriesHelper::SUBMITTED_ENTRY_STATUS; | |
| 709 | + return ( ( isset( $values['frm_saving_draft'] ) && $values['frm_saving_draft'] == 1 ) || ( isset( $values['is_draft'] ) && $values['is_draft'] == 1 ) ) ? 1 : 0; | |
| 763 | 710 | } |
| 764 | 711 | |
| 765 | 712 | /** |
| 766 | 713 | * Get the created_at value for a new entry |
| @@ -884,29 +831,12 @@ | ||
| 884 | 831 | * @since 2.0.16 |
| 885 | 832 | * |
| 886 | 833 | * @param array $values |
| 887 | 834 | * @param int $entry_id |
| 888 | - * @return void | |
| 889 | 835 | */ |
| 890 | 836 | private static function maybe_add_entry_metas( $values, $entry_id ) { |
| 891 | 837 | if ( isset( $values['item_meta'] ) ) { |
| 892 | 838 | FrmEntryMeta::update_entry_metas( $entry_id, $values['item_meta'] ); |
| 893 | - } | |
| 894 | - self::maybe_add_captcha_meta( (int) $values['form_id'], (int) $entry_id ); | |
| 895 | - } | |
| 896 | - | |
| 897 | - /** | |
| 898 | - * @since 5.0.15 | |
| 899 | - * | |
| 900 | - * @param int $form_id | |
| 901 | - * @param int $entry_id | |
| 902 | - * @return void | |
| 903 | - */ | |
| 904 | - private static function maybe_add_captcha_meta( $form_id, $entry_id ) { | |
| 905 | - global $frm_vars; | |
| 906 | - if ( array_key_exists( 'captcha_scores', $frm_vars ) && array_key_exists( $form_id, $frm_vars['captcha_scores'] ) ) { | |
| 907 | - $captcha_score_meta = array( 'captcha_score' => $frm_vars['captcha_scores'][ $form_id ] ); | |
| 908 | - FrmEntryMeta::add_entry_meta( $entry_id, 0, '', maybe_serialize( $captcha_score_meta ) ); | |
| 909 | 839 | } |
| 910 | 840 | } |
| 911 | 841 | |
| 912 | 842 | /** |