You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:13:39