/** * check for duplicate entries created in the last minute * @return boolean */ public static function is_duplicate($new_values, $values) { if (defined('WP_IMPORTING') && WP_IMPORTING) { return false; } $duplicate_entry_time = apply_filters('frm_time_to_check_duplicates', 60, $new_values); if (empty($duplicate_entry_time)) { return false; } $check_val = $new_values; $check_val['created_at >'] = date('Y-m-d H:i:s', strtotime($new_values['created_at']) - absint($duplicate_entry_time)); unset($check_val['created_at'], $check_val['updated_at']); unset($check_val['is_draft'], $check_val['id'], $check_val['item_key']); if ($new_values['item_key'] == $new_values['name']) { unset($check_val['name']); } global $wpdb; $entry_exists = FrmDb::get_col($wpdb->prefix . 'frm_items', $check_val, 'id', array('order_by' => 'created_at DESC')); if (!$entry_exists || empty($entry_exists) || !isset($values['item_meta'])) { return false; } $is_duplicate = false; foreach ($entry_exists as $entry_exist) { $is_duplicate = true; //add more checks here to make sure it's a duplicate $metas = FrmEntryMeta::get_entry_meta_info($entry_exist); $field_metas = array(); foreach ($metas as $meta) { $field_metas[$meta->field_id] = $meta->meta_value; } // If prev entry is empty and current entry is not, they are not duplicates $filtered_vals = array_filter($values['item_meta']); if (empty($field_metas) && !empty($filtered_vals)) { return false; } $diff = array_diff_assoc($field_metas, array_map('maybe_serialize', $values['item_meta'])); foreach ($diff as $field_id => $meta_value) { if (!empty($meta_value)) { $is_duplicate = false; continue; } } if ($is_duplicate) { break; } } return $is_duplicate; }
function create($values) { global $wpdb, $frmdb, $frm_entry_meta; $new_values = array(); $new_values['item_key'] = FrmAppHelper::get_unique_key($values['item_key'], $frmdb->entries, 'item_key'); $new_values['name'] = isset($values['name']) ? $values['name'] : $values['item_key']; $new_values['ip'] = $_SERVER['REMOTE_ADDR']; if (isset($values['description']) and !empty($values['description'])) { $new_values['description'] = $values['description']; } else { $referrerinfo = FrmAppHelper::get_referer_info(); $new_values['description'] = serialize(array('browser' => $_SERVER['HTTP_USER_AGENT'], 'referrer' => $referrerinfo)); } $new_values['form_id'] = isset($values['form_id']) ? (int) $values['form_id'] : null; $new_values['created_at'] = $new_values['updated_at'] = isset($values['created_at']) ? $values['created_at'] : current_time('mysql', 1); //if(isset($values['id']) and is_numeric($values['id'])) // $new_values['id'] = $values['id']; if (isset($values['frm_user_id']) and is_numeric($values['frm_user_id'])) { $new_values['user_id'] = $new_values['updated_by'] = $values['frm_user_id']; } else { global $user_ID; if ($user_ID) { $new_values['user_id'] = $new_values['updated_by'] = $user_ID; } } //check for duplicate entries created in the last 5 minutes $create_entry = true; if (!defined('WP_IMPORTING')) { $check_val = $new_values; $check_val['created_at >'] = date('Y-m-d H:i:s', strtotime($new_values['created_at']) - 60 * 60 * 5); unset($check_val['created_at']); unset($check_val['id']); unset($check_val['item_key']); if ($new_values['item_key'] == $new_values['name']) { unset($check_val['name']); } $entry_exists = $frmdb->get_records($frmdb->entries, $check_val, 'created_at DESC', '', 'id'); if ($entry_exists and !empty($entry_exists)) { foreach ($entry_exists as $entry_exist) { if ($create_entry) { $create_entry = false; //add more checks here to make sure it's a duplicate if (isset($values['item_meta'])) { $metas = FrmEntryMeta::get_entry_meta_info($entry_exist->id); $field_metas = array(); foreach ($metas as $meta) { $field_metas[$meta->field_id] = $meta->meta_value; } $diff = array_diff_assoc($field_metas, $values['item_meta']); foreach ($diff as $field_id => $meta_value) { if (!empty($meta_value) and !$create_entry) { $create_entry = true; } } } } } } } if ($create_entry) { $query_results = $wpdb->insert($frmdb->entries, $new_values); } if (isset($query_results) and $query_results) { $entry_id = $wpdb->insert_id; global $frm_saved_entries; $frm_saved_entries[] = (int) $entry_id; if (isset($values['item_meta'])) { $frm_entry_meta->update_entry_metas($entry_id, $values['item_meta']); } do_action('frm_after_create_entry', $entry_id, $new_values['form_id']); return $entry_id; } else { return false; } }