php 如何编辑Contact Form 7 action URL?

ekqde3dh  于 2023-10-15  发布在  PHP
关注(0)|答案(1)|浏览(133)

我正在尝试将操作URL更改为外部URL以将我的发布数据发送到。我目前正在使用下面的代码片段来做到这一点。我试图将POST数据发送到一个谷歌应用程序脚本。我有一个问题,如果用户忘记填写必填字段,POST数据仍然会被发送,当他们再次提交表单时,通常会有重复的条目。

add_filter('wpcf7_form_action_url', 'wpcf7_custom_form_action_url');
function wpcf7_custom_form_action_url($url)
{
    global $post;
    $id_to_change = POST ID;
    if($post->ID === $id_to_change)
        return 'https://script.google.com/macros/s/REDACTED';
    else
        return $url;
}

我想改变这一点,所以它只发送POST数据到该URL后,联系表格7验证所有字段,并确定提交。我也在写email。
有什么建议吗?谢谢!

gv8xihay

gv8xihay1#

默认情况下,CF7通过AJAX POST请求将数据发送到当前URL(这是您的WordPress安装),然后验证数据,如果验证通过,则发送电子邮件,否则返回相应的错误消息。通过将表单操作更改为某些外部URL,用户输入的数据将永远不会到达您的WordPress安装,因此CF7无法执行任何验证或发送电子邮件。
我建议你不要改变表单操作,让CF7来完成它的工作,而是在验证后但在发送任何电子邮件之前进行拦截。通过这种方式,您可以获得经过验证的表单数据,然后您可以将其转发到您喜欢的任何地方:

add_action('wpcf7_mail_sent', 'forward_cf7_post_data' );

function forward_cf7_post_data($contact_form) {
    $submission = WPCF7_Submission::get_instance();
    if($submission) {
        $posted_data = $submission->get_posted_data();
        $post_data = http_build_query($posted_data);
        // You can now POST that data to anywhere you like
        // e.g. using file_get_contents or using cURL
        $opts = ['http' =>
            [
                'method'  => 'POST',
                'header'  => 'Content-Type: application/x-www-form-urlencoded',
                'content' => $post_data
            ]
        ];
        $context  = stream_context_create($opts);
        $result = file_get_contents('https://script.google.com/macros/s/REDACTED', false, $context);
    }
    return true;
}

附带好处:其他CF7插件(如Flamingo)继续以这种方式工作。

相关问题