Contact Form 7提交邮箱时如何校验是否已存在于数据库并返回提示
Contact Form 7 提交邮箱重复校验修复方案
原代码失效核心原因
- 第一段代码问题:
- 未绑定邮箱字段专属验证过滤器,通用过滤器触发逻辑不稳定
- CF7 5.0及以上版本中
get_posted_data()传参返回的是对应字段的数组格式,直接赋值给$email无法拿到正确的邮箱字符串 email_exists()仅用于校验WordPress系统用户表的邮箱,如果你要校验的是CF7历史提交记录里的邮箱,这个函数本身不符合需求
- 第二段代码问题:
- 没有添加
add_filter挂载钩子,代码不会被CF7触发执行 - 调用
invalidate方法时传入了未定义的变量$field_name,变量名不匹配导致报错 - SQL查询未做预处理,存在SQL注入风险,且硬编码表前缀
wp_在自定义表前缀的站点中会查询失败
- 没有添加
可直接使用的修复代码
场景1:校验邮箱是否存在于WordPress系统用户表
// 绑定邮箱字段验证过滤器,your-email替换为你CF7表单里的邮箱字段名 add_filter( 'wpcf7_validate_email*', 'check_email_exists_in_wp_users', 20, 2 ); function check_email_exists_in_wp_users( $result, $tag ) { // 匹配字段名,和你CF7里的邮箱字段名保持一致 if ( 'your-email' !== $tag->name ) { return $result; } // 获取提交的邮箱字符串 $submission = WPCF7_Submission::get_instance(); if ( ! $submission ) { return $result; } $email = $submission->get_posted_data( $tag->name ); $email = is_array( $email ) ? reset( $email ) : $email; // 校验邮箱是否存在 if ( email_exists( $email ) ) { $result->invalidate( $tag, '您的邮箱已存在于我们的数据库中' ); } return $result; }
场景2:校验邮箱是否存在于CF7历史提交记录表
add_filter( 'wpcf7_validate_email*', 'check_email_exists_in_cf7_submissions', 20, 2 ); function check_email_exists_in_cf7_submissions( $result, $tag ) { if ( 'your-email' !== $tag->name ) { return $result; } $submission = WPCF7_Submission::get_instance(); if ( ! $submission ) { return $result; } $email = $submission->get_posted_data( $tag->name ); $email = is_array( $email ) ? reset( $email ) : $email; // 全局数据库对象,自动适配表前缀 global $wpdb; // 预处理查询避免SQL注入 $entry = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM {$wpdb->prefix}cf7_vdata_entry WHERE name = %s AND value = %s", $tag->name, $email ) ); if ( $entry > 0 ) { $result->invalidate( $tag, '您的邮箱已存在于我们的数据库中' ); } return $result; }
使用说明
- 把代码添加到你当前主题的
functions.php文件,或者自定义插件的代码文件中即可生效 - 代码里的
your-email要替换为你实际Contact Form 7表单中设置的邮箱字段名
内容的提问来源于stack exchange,提问作者ele
相关产品推荐
相关产品推荐

