Contact Form 7:实现支持多邮箱地址的邮箱字段验证
Contact Form 7:实现支持多邮箱地址的邮箱字段验证
嗨,这个需求我之前折腾过,刚好可以给你分享两种实用的方案,都能实现支持多邮箱地址验证的CF7字段:
方案一:自定义多邮箱字段短代码+验证规则
这个方法会新增一个专属的多邮箱字段类型,和默认字段区分开,逻辑更清晰:
- 打开主题目录下的
functions.php文件,添加以下代码创建自定义短代码:
add_shortcode( 'email_multiple', 'cf7_multiple_email_field' ); function cf7_multiple_email_field( $atts ) { $atts = shortcode_atts( array( 'name' => 'multiple-emails', 'id' => '', 'class' => '', 'placeholder' => '', ), $atts ); $html = sprintf( '<input type="email" name="%s" id="%s" class="%s wpcf7-form-control wpcf7-text wpcf7-email wpcf7-validates-as-email" placeholder="%s" />', esc_attr( $atts['name'] ), esc_attr( $atts['id'] ), esc_attr( $atts['class'] ), esc_attr( $atts['placeholder'] ) ); return $html; }
- 接着添加验证规则,让这个字段支持多邮箱格式检查:
add_filter( 'wpcf7_validate_email', 'cf7_multiple_email_validation', 10, 2 ); add_filter( 'wpcf7_validate_email*', 'cf7_multiple_email_validation', 10, 2 ); function cf7_multiple_email_validation( $result, $tag ) { $name = $tag->name; $value = isset( $_POST[$name] ) ? trim( $_POST[$name] ) : ''; if ( empty( $value ) ) { return $result; // 空值交给CF7默认的必填验证处理 } // 拆分逗号分隔的邮箱,同时清理每个邮箱前后的空格 $emails = array_map( 'trim', explode( ',', $value ) ); foreach ( $emails as $email ) { if ( ! is_email( $email ) ) { $result->invalidate( $tag, '请输入有效的邮箱地址,多个邮箱请用逗号分隔' ); break; } } return $result; }
- 在CF7表单编辑器里使用这个自定义字段:
直接添加短代码[email_multiple name="recipient-emails" placeholder="请输入邮箱,多个用逗号分隔"],如果要设置为必填,就加星号[email_multiple* name="recipient-emails" ...]
方案二:修改默认邮箱字段的验证逻辑
如果你不想新增字段类型,直接改造默认的邮箱字段,让它支持多邮箱验证,只需在functions.php中添加以下代码:
add_filter( 'wpcf7_validate_email', 'cf7_modify_default_email_validation', 10, 2 ); add_filter( 'wpcf7_validate_email*', 'cf7_modify_default_email_validation', 10, 2 ); function cf7_modify_default_email_validation( $result, $tag ) { $name = $tag->name; $value = isset( $_POST[$name] ) ? trim( $_POST[$name] ) : ''; if ( empty( $value ) ) { return $result; } // 处理逗号分隔的多个邮箱,自动清理空格 $emails = array_map( 'trim', explode( ',', $value ) ); foreach ( $emails as $email ) { if ( ! is_email( $email ) ) { $result->invalidate( $tag, '包含无效的邮箱格式,多个邮箱请用逗号分隔' ); break; } } return $result; }
这样原来的默认邮箱字段 [email* recipient-emails placeholder="多个邮箱用逗号分隔"] 就可以直接支持多邮箱验证了,不需要改短代码。
最后补充:发送邮件的设置
不管用哪种方案,在CF7的「邮件」设置里,收件人一栏直接填写字段的短代码标记(比如[recipient-emails])即可,CF7会自动识别逗号分隔的多个邮箱地址并发送邮件。
测试的时候可以试试输入 test1@example.com, test2@example.com(带空格也没问题),如果输入无效格式比如test@example,表单会弹出错误提示,完全符合需求~
备注:内容来源于stack exchange,提问作者Christer Fernstrom




