将Contact Form 7表单数据存储至自定义数据库而非WordPress数据库
嘿,我来帮你把这个功能补全!你已经选对了wpcf7_before_send_mail这个钩子,这是拦截CF7表单提交并处理自定义逻辑的最佳时机。下面是完整的代码,包含数据库连接、数据安全处理和存储逻辑:
add_action('wpcf7_before_send_mail', 'save_form_to_custom_db'); function save_form_to_custom_db($wpcf7) { // 跳过AJAX重复触发(避免数据重复存储) if (isset($_POST['_wpcf7_is_ajax_call']) && $_POST['_wpcf7_is_ajax_call'] === '1') { return; } // 获取CF7的提交实例,没有的话直接返回 $submission = WPCF7_Submission::get_instance(); if (!$submission) { return; } // 提取表单提交的所有数据(键对应CF7表单里的name属性) $form_data = $submission->get_posted_data(); // 自定义数据库配置,替换成你的真实信息 $db_config = [ 'user' => 'your_db_username', 'pass' => 'your_db_password', 'host' => 'localhost', 'name' => 'custom_db' ]; // 建立数据库连接(用mysqli,兼容大部分环境) $conn = new mysqli($db_config['host'], $db_config['user'], $db_config['pass'], $db_config['name']); // 检查连接是否成功,失败就记录错误日志 if ($conn->connect_error) { error_log("CF7自定义数据库连接失败: " . $conn->connect_error); return; } // 从表单数据里提取需要的字段,记得替换成你实际的表单name和数据库字段 // 用real_escape_string防止SQL注入,或者用下面的预处理语句更安全 $user_name = isset($form_data['your-name']) ? $conn->real_escape_string($form_data['your-name']) : ''; $user_email = isset($form_data['your-email']) ? $conn->real_escape_string($form_data['your-email']) : ''; $user_message = isset($form_data['your-message']) ? $conn->real_escape_string($form_data['your-message']) : ''; $submit_time = current_time('mysql'); // 用WP的时间函数获取统一时区的时间 // -------------------------- // 方式1:基础SQL插入(适合简单场景) // -------------------------- $sql = "INSERT INTO cf7_submissions (name, email, message, submitted_at) VALUES ('$user_name', '$user_email', '$user_message', '$submit_time')"; if ($conn->query($sql)) { error_log("CF7表单数据已成功存入自定义数据库"); } else { error_log("CF7数据存储失败: " . $conn->error); } // -------------------------- // 方式2:预处理语句(更安全,强烈推荐) // -------------------------- // $stmt = $conn->prepare("INSERT INTO cf7_submissions (name, email, message, submitted_at) VALUES (?, ?, ?, ?)"); // $stmt->bind_param("ssss", $user_name, $user_email, $user_message, $submit_time); // if ($stmt->execute()) { // error_log("CF7表单数据已通过预处理存入自定义数据库"); // } else { // error_log("CF7预处理存储失败: " . $stmt->error); // } // $stmt->close(); // 关闭数据库连接 $conn->close(); // 可选:如果不想发送CF7默认的邮件,取消下面注释 // $wpcf7->skip_mail = true; }
几个重要的注意事项:
- 替换配置信息:把
your_db_username、your_db_password和数据库名换成你自己的,确保数据库用户有INSERT权限 - 匹配表结构:
cf7_submissions是假设的表名,你要改成自己的自定义表名,字段也要和你的表对应(比如name、email这些) - 表单name对应:
your-name、your-email是CF7表单标签里的name属性(比如[text* your-name]),必须和你实际表单里的一致 - 安全问题:强烈推荐使用预处理语句(方式2),能有效防止SQL注入攻击
- 调试排查:如果出现问题,打开WordPress的调试模式(在
wp-config.php里设置WP_DEBUG = true),查看wp-content/debug.log里的错误日志
内容的提问来源于stack exchange,提问作者manini
相关产品推荐
相关产品推荐

