Chia sẻ cách để mỗi số điện thoại, email chỉ được đăng ký một lần duy nhất khi dùng Contact Form 7 (CF7)

Cập nhật lần cuối 08/04/2024 by trong WordPress vào 08/04/2024 có 689 Views

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

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!

2.7/5 - (8 votes)
  • Bình luận
Sản phẩm nổi bật của Toản
x