Yêu cầu: Trong một dự án gần đây khách có yêu cầu form đăng ký trải nghiệm, mỗi SĐT hay Email chỉ được đăng ký 1 lần duy nhất. Nếu khách đã đăng ký rồi thì thông báo cho khách biết và không cho submit form nữa
Hướng giải quyết: Mình sẽ cần lưu các đăng ký vào sql, sau đó mỗi khi có submit sẽ hook vào wpcf7_validate để kiểm tra xem sđt hoặc email đó đã đăng ký hay chưa và đưa ra thông báo phù hợp
Cách làm như sau
Để duy trì blog nên mình có làm aff cho 1 số bên hosting. Nhưng dù aff mình cũng chọn 1 số nhà cung cấp uy tín về chất lượng và support nên các bạn cứ yên tâm nhé.
Nếu có mua hosting mà có trong list dưới đây các bạn click vào link trước khi mua để ủng hộ mình nhé. Mình cảm ơn nhiều
- Azdigi: Giá rẻ thì dùng gói Pro Gold Hosting còn chất lượng hơn thì em khuyên dùng Business Hosting. Có điều kiện thì lên VPS nhé
- Tino hosting
- iNet
- Nước ngoài thì Vultr
Lưu dữ liệu mỗi khi có khách submit trong CF7
Để lưu dữ liệu mình sẽ cần code rất nhiều, nên mình sẽ sử dụng plugin “Contact Form 7 Database Addon – CFDB7” cho nhanh nhé. Plugin này cũng khá hay
Để cài plugin này bạn hãy vào menu Plugin > Thêm mới. Sau đó tìm tên Contact Form 7 Database Addon – CFDB7 và cài đặt > kích hoạt
Cách xác định SĐT hoặc Email đã đăng ký hay chưa
Sau khi cài xong plugin. Bạn chỉ cần thêm code sau vào wp-content/themes/{your-theme}/functions.php là được nhé. Code được chia sẻ trên levantoan.com
/*
* Code giới hạn sđt hoặc email chỉ được đăng ký 1 lần duy nhất trong CF7
* Author: levantoan.com
*/
function devvn_litmit_by_phone_email_validation($result, $tags) {
global $wpdb;
$cfdb = apply_filters('cfdb7_database', $wpdb);
$table_name = $cfdb->prefix . 'db7_forms';
$_wpcf7 = isset($_POST['_wpcf7']) && $_POST['_wpcf7'] ? intval($_POST['_wpcf7']) : '';
if($_wpcf7) {
foreach ($tags as $tag) {
if (in_array($tag['type'], array('tel', 'tel*')) && $tag['name'] == 'your-phone') {
$value = isset($_POST[$tag['name']]) && $_POST[$tag['name']] ? sanitize_text_field(wp_unslash($_POST[$tag['name']])) : '';
if ($value) {
$results = $cfdb->get_results(
$cfdb->prepare(
"SELECT form_id FROM $table_name WHERE form_post_id = $_wpcf7 AND form_value LIKE %s LIMIT 1",
'%' . $cfdb->esc_like( $tag['name'] . '";s:' . strlen( $value ) . ':"' . $value . '"' ) . '%'
)
);
if (!empty($results)) {
$result->invalidate($tag, 'Số điện thoại của bạn đã đăng ký rồi!');
}
}
}
if (in_array($tag['type'], array('email', 'email*')) && $tag['name'] == 'your-email') {
$value = isset($_POST[$tag['name']]) && $_POST[$tag['name']] ? sanitize_text_field(wp_unslash($_POST[$tag['name']])) : '';
if ($value) {
$results = $cfdb->get_results(
$cfdb->prepare(
"SELECT form_id FROM $table_name WHERE form_post_id = $_wpcf7 AND form_value LIKE %s LIMIT 1",
'%' . $cfdb->esc_like( $tag['name'] . '";s:' . strlen( $value ) . ':"' . $value . '"' ) . '%'
)
);
if (!empty($results)) {
$result->invalidate($tag, 'Email của bạn đã đăng ký rồi!');
}
}
}
}
}
return $result;
}
add_filter('wpcf7_validate', 'devvn_litmit_by_phone_email_validation', 10, 2);
Chú ý: Các giá trị trong form như sau
- Đoạn code trên sẽ hoạt động trên tất cả các form cf7
- Trường tel hoặc tel* với name là your-phone . Ví dụ [tel* your-phone placeholder “Số điện thoại”]
- Trường email hoặc email* có name là your-email. Ví dụ [email* your-email placeholder “Email”]
Chúc các bạn thành công!
- Bình luận