05 March, 2018

Kiểm tra thông tin đăng ký đã tồn tại trong Contact Form 7 | Wordpress

 Với những bạn yêu thích mã nguồn mở Wordpress thì chắc chắn các bạn sẽ biết Plugin Contact Form 7 (CF7) với tính năng quan trọng giúp tương tác và lưu trữ thông tin khách hàng. Còn rất nhiều thú vị từ plugin này mà có lẽ nhiều bạn chưa khám phá hết.
Biểu mẫu đăng ký được tạo từ Contact Form 7 đơn thuần chỉ là một mẫu đăng ký giúp lưu lại thông tin khách hàng. Nhưng đôi khi trong những trường hợp đặc biệt, ví dụ mẫu đăng ký dành cho các cuộc thi/sự kiện đòi hỏi một hoặc một số trường thông tin là duy nhất (không trùng lặp với thông tin đã đăng ký trước đó)... liệu Contact Form 7 có xử lý được yêu cầu này? Câu trả lời là Có, tuy nhiên cần thêm sự can thiệp từ code.
Ở bài viết này mình xin được chia sẻ một tính năng thú vị khi Contact Form 7 kết hợp cùng với những plugin mở rộng khác để "Kiểm tra thông tin đăng ký đã tồn tại trong Contact Form 7". Hướng dẫn này khá đơn giản, bạn không biết nhiều về code cũng có thể làm được.


Nêu lại đầu bài:
Thạnh tổ chức một cuộc thi và yêu cầu người tham gia đăng ký vào một mẫu đăng ký trên website với các thông tin cần thiết, mỗi người chỉ được đăng ký 1 lần để tránh trùng lặp thông tin đăng ký. Để làm được điều đó hệ thống yêu cầu các trường nhập vào là số điện thoại và email phải là duy nhất chưa được đăng ký trên hệ thống. Nếu một người đăng ký điền trùng số điện thoại hoặc email thì hệ thống thông báo rằng thông tin nhập vào đã tồn tại.


Chuẩn bị:
- Cài đặt Plugin Contact Form 7 và tạo 1 biểu mẫu như bình thường (nếu chưa biết thì comment hỏi mình)
- Tải về và cài đặt plugin Contact Form DB
- Cài đặt Plugin Add Shortcodes Actions And Filters


Cài đặt và tạo biểu mẫu trên Contact Form 7 mình sẽ không hướng dẫn lại nữa, các bạn có thể tìm kiếm trên mạng rất nhiều hoặc comment bên dưới mình hướng dẫn.

* Plugin Contact Form DB: đây được hiểu là một plugin mở rộng cho CF7 nhằm mục đích xử lý dữ liệu thu được từ Contact Form 7. Contact Form DB cũng có khả năng xuất thông tin đã đăng ký ra file excel hoặc một số định dạng khác. Mặc định CF7 sẽ không có chức năng tạo dữ liệu như vậy.

* Plugin Add Shortcodes Actions And Filters (ASAAF): giúp ta thêm các bộ lọc và các hành động. Cụ thể ở đây chúng ta sẽ dùng nó để thêm các bộ lọc dựa trên dữ liệu được xây dựng bởi Contact Form DB, thực hiện hành động cho phép nhập dữ liệu nếu thỏa mãn điều khiện hoặc thông báo lỗi nếu phát hiện dữ liệu trùng lặp.
Sau khi cài đặt và kích hoạt ASAAF, bạn mở nó ra trong trang Quản trị >> Công cụ (Tools) >> Shortcodes, Actions and Filters 

Tạo mới một Action và nhập code sau vào
/**
 * @param $formName string
 * @param $fieldName string
 * @param $fieldValue string
 * @return bool
 */
function is_already_submitted($formName, $fieldName, $fieldValue) {
    require_once(ABSPATH . 'wp-content/plugins/contact-form-7-to-database-extension/CFDBFormIterator.php');
    $exp = new CFDBFormIterator();
    $atts = array();
    $atts['show'] = $fieldName;
    $atts['filter'] = "$fieldName=$fieldValue";
    $atts['unbuffered'] = 'true';
    $exp->export($formName, $atts);
    $found = false;
    while ($row = $exp->nextRow()) {
        $found = true;
    }
    return $found;
}
 
/**
 * @param $result WPCF7_Validation
 * @param $tag array
 * @return WPCF7_Validation
 */
function my_validate_email($result, $tag) {
    $formName = 'email_form'; // Chỉnh thành tên biểu mẫu đăng ký
    $fieldName = 'email_123'; // Trường cần kiểm tra trên biểu mẫu
    $errorMessage = 'Email has already been submitted'; // Thông báo lỗi
    $name = $tag['name'];
    if ($name == $fieldName) {
        if (is_already_submitted($formName, $fieldName, $_POST[$name])) {
            $result->invalidate($tag, $errorMessage);
        }
    }
    return $result;
}
 
// Sử dụng lệnh này nếu trường kiểm tra dạng email và là bắt buộc
add_filter('wpcf7_validate_email*', 'my_validate_email', 10, 2);
// Sử dụng lệnh này nếu trường kiểm tra dạng email và không bắt buộc
add_filter('wpcf7_validate_email', 'my_validate_email', 10, 2);
 
// Sử dụng lệnh này nếu trường kiểm tra dạng text và là bắt buộc
add_filter('wpcf7_validate_text*', 'my_validate_email', 10, 2);
// Sử dụng lệnh này nếu trường kiểm tra dạng text và không bắt buộc 
add_filter('wpcf7_validate_text', 'my_validate_email', 10, 2);
Trong đó:
- Bạn cần chỉnh sửa lại các trường formName, fieldName, errorMessage theo đúng tên biểu mẫu và các trường mình đã tạo (phần tô đỏ)
- Sử dụng 1 add_filter tương ứng với 1 action. (nếu kiểm tra 2 trường dữ liệu thì nhân đôi action lên và sử dụng 2 filter)
(Trong CF7 có các loại dữ liệu xác minh chính là: validate_email, validate_text, validate_tel bạn cần thay đổi cho phù hợp với các trường dữ liệu cần kiểm tra)



Bây giờ lưu lại, kích hoạt hành động và kiểm tra kết quả nhé. Chúc bạn thành công!

0 nhận xét:

Post a Comment