GDPR合规插件开发:Contact Form 7表单检测与字段添加问题
解决方案:检测并修改Contact Form 7表单适配GDPR
刚帮客户处理过类似的GDPR适配需求,下面是针对你场景的完整代码实现,包含详细的逻辑注释,直接就能用到你的WordPress插件里:
// 确保加载插件检测所需的核心文件 include_once(ABSPATH . 'wp-admin/includes/plugin.php'); function juvo_gdpr_update_cf7_form() { // 第一步:检测Contact Form 7是否已激活 if (!is_plugin_active('contact-form-7/wp-contact-form-7.php')) { return; // CF7未安装/激活,直接退出 } // 第二步:查找标题为'Kontakt'的CF7表单 $target_forms = get_posts(array( 'post_type' => 'wpcf7_contact_form', 'post_title' => 'Kontakt', 'posts_per_page' => 1, 'post_status' => 'publish' )); if (empty($target_forms)) { return; // 找不到目标表单,退出 } $cf7_post = $target_forms[0]; $form_content = $cf7_post->post_content; // 检查是否已经处理过该表单,避免重复修改 if (get_post_meta($cf7_post->ID, '_juvo_gdpr_updated', true)) { return; } // 第三步:检测表单内容中的关键字段 $has_submit = strpos($form_content, '[submit') !== false; // 检测提交按钮短代码 $has_acceptance = strpos($form_content, '[acceptance') !== false; // 检测同意字段短代码 // 第四步:仅当有提交按钮但无同意字段时,修改表单 if ($has_submit && !$has_acceptance) { // 定义GDPR同意字段的短代码,可根据需求调整文本和属性 $gdpr_acceptance = '[acceptance gdpr required]我同意按照GDPR法规处理我的个人数据[/acceptance]'; // 将同意字段插入到提交按钮之前(也可以改成插在之后,调整替换逻辑即可) $updated_content = str_replace('[submit', $gdpr_acceptance . '[submit', $form_content); // 更新表单内容 wp_update_post(array( 'ID' => $cf7_post->ID, 'post_content' => $updated_content )); // 添加标记,避免重复处理 update_post_meta($cf7_post->ID, '_juvo_gdpr_updated', '1'); // 调试用:可以在后台看到修改日志(上线后可删除) error_log("GDPR同意字段已添加到Kontakt表单,ID:{$cf7_post->ID}"); } } // 选择合适的钩子触发逻辑,比如插件激活时执行一次,或者每次后台加载时检查 // 插件激活钩子:register_activation_hook(__FILE__, 'juvo_gdpr_update_cf7_form'); // 或者后台初始化时检查(适合需要定期同步的场景): add_action('admin_init', 'juvo_gdpr_update_cf7_form');
关键逻辑说明
- CF7激活检测:用
is_plugin_active确保只有在CF7安装并激活时才执行后续逻辑,避免报错 - 目标表单定位:通过
get_posts精准筛选标题为Kontakt的CF7自定义文章类型 - 重复修改防护:用自定义文章元字段
_juvo_gdpr_updated标记已处理的表单,防止每次加载都重复修改 - 字段检测:通过字符串匹配快速判断表单是否包含提交按钮和同意字段(CF7的短代码格式固定,这个方法高效可靠)
- 内容修改:用
str_replace把同意字段插入到提交按钮之前,你也可以根据需求调整插入位置(比如放在表单末尾)
注意事项
- 你可以修改
$gdpr_acceptance里的文本内容,或者调整required属性控制是否强制用户勾选 - 测试前建议备份网站数据库,避免意外修改
- 如果需要批量处理多个表单,可以调整
get_posts的参数,或者遍历所有CF7表单进行检测 - 若要在前端触发检测(比如用户访问时),可以把钩子改成
init,但更推荐在后台执行,减少前端性能消耗
内容的提问来源于stack exchange,提问作者JUVO_Webdes
相关产品推荐
相关产品推荐

