首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用接口后Wordpress使cf7无效

调用接口后Wordpress使cf7无效
EN

Stack Overflow用户
提问于 2016-04-21 23:27:40
回答 1查看 2.5K关注 0票数 6

这是我的问题,我已经安装了wordpress的联系表单7,在wpcf7_before_send_mail期间我调用了一个API,我需要使表单无效,如果API返回一个错误,那么我需要使请求无效,并返回从API调用返回的错误。

我在API失败时设置了一个标志为false,错误消息也会被存储,但是尽管我导致了失败,我的表单还是成功了。

代码语言:javascript
复制
add_action("wpcf7_before_send_mail", "wpcf7_send_contact_builder");
function wpcf7_send_contact_builder($form) {
    $submission = WPCF7_Submission::get_instance();
    $wpcf7_data = $submission->get_posted_data();
    ... api call and set $success to true if ok and false if not ...
    if (!$success) {
        $form->status = 'validation_failed (statuscode:' . $xml->status->statuscode[0] . ').';
        $form->valid = false;
        $form->response = $xml->status->statusdesc[0];
        return $forml
    }
}

我也尝试过使用:

代码语言:javascript
复制
$form->invalidate('validation_failed (statuscode:' . $xml->status->statuscode[0] . ').', $xml->status->statusdesc[0]);

但无论以哪种方式,我都无法阻止成功电子邮件的发送和表单的验证为成功。调试证明if语句中的!success是有效的,并且包含的代码已添加到变量中。我还尝试将form看作是一个数组($ form‘’valid‘= false),但这也不起作用,表单提交成功。你知道我这里漏掉了什么吗?我省略了API调用本身和确定正确的表单id的代码,这两个都可以正常工作,只有我想要的表单会被解析,并且API调用会返回预期的数据。

EN

回答 1

Stack Overflow用户

发布于 2018-03-13 03:36:29

我也需要同样的东西。在浏览完CF7插件文件后,我找到了以下解决方案:

代码语言:javascript
复制
//To make it working, we must need at least CF7-v5.0;
add_action( 'wpcf7_before_send_mail', 'cf7_validate_api', 15, 3 );

function cf7_validate_api($cf7, &$abort, $submission){

    if ( $cf7->id() !== 789 ) //CF7 post-id from admin settings;
        return;

    $errMsg = '';

    //$submission = WPCF7_Submission::get_instance();
    $postedData = $submission->get_posted_data();
    //$postedData['more-data'] = 'something';
    unset($postedData['not-sending-data']);

    //-----API posting------
    $url = "http://my-web.com/wp-admin/admin-ajax.php?action=get-something";
    $username = 'apiUserName';
    $password = 'apiUserPass';

    $args = [
        'headers' => [
            'Authorization' => "Basic ".base64_encode( $username . ':' . $password ),
            'Accept' => 'application/json; charset=utf-8', // The API returns JSON
            //'Content-Type' => 'application/json; charset=utf-8'
        ],
        'body' => $postedData
    ];
    $response = wp_remote_post( $url, $args );
    //------------------

    if( is_wp_error( $response ) ){
        $error_message = $response->get_error_message();
        $errMsg = "Something went wrong:\n{$error_message}";

    } else {
        $response_body = wp_remote_retrieve_body( $response );
        $data = json_decode( $response_body );

        if( empty($data) || $data->status==0 ){ //API validation error!
            $errMsg = $data->msg->title."\n".$data->msg->description;
        }
    }

    if( $errMsg ){ //do not send mail;
        //$cf7->skip_mail = true; //for older versions!
        $abort = true; //==> Here, it is with 'called by reference' since CF7-v5.0 :)
        $submission->set_status( 'validation_failed' );
        //$submission->set_response( $cf7->message( 'validation_error' ) ); //msg from admin settings;
        $submission->set_response( $cf7->filter_message($errMsg) ); //custom msg;
    }
}

希望它能帮助一些人。快乐编码:)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36774134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档