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

wp_send_json执行后后续PHP代码无法继续运行的问题求助

解决wp_send_json后PHP代码停止执行的问题

wp_send_json()函数的本质是输出JSON格式响应后,立即调用wp_die()终止PHP脚本运行,所以你在它之后编写的所有代码都不会被执行——这是WordPress该函数的设计特性。

以下分两种场景给出解决方案:

场景1:需要先完成所有PHP逻辑再返回JSON响应

把wp_send_json()移到所有服务器端代码的最后,确保所有PHP逻辑执行完毕后再返回JSON:

if (isset($this->acsUrl)) {
    error_log('entro ');
    wp_enqueue_script('netpay3ds-confirm');
    $messages .= "<script src='../../wordpress/wp-content/plugins/netpay-checkout/assets/javascripts/netpay3ds-confirm.js' type='text/javascript'>
    </script>
    <script>
        Cardinal.OneConnect.start('{$this->status}', '{$this->responseCode}', '{$this->acsUrl}', '{$this->paReq}', '{$this->authenticationTransactionID}');
        console.log('sleep');
        </script>";
    error_log('salio del js');
};

// 先执行后续PHP逻辑
$netpay_card_processor_transaction_id = isset( $_POST['netpay_card_processor_transaction_id'] ) ? wc_clean( $_POST['netpay_card_processor_transaction_id'] ) : '';
$netpay_status_3ds_id = isset( $_POST['netpay_status_3ds_id'] ) ? wc_clean( $_POST['netpay_status_3ds_id'] ) : '';
error_log($netpay_card_processor_transaction_id);
error_log($netpay_status_3ds_id);

// 最后返回JSON响应
if (isset($this->acsUrl)) {
    wp_send_json( array( 'messages' => $messages ) );
}

场景2:JavaScript执行完成后触发后续PHP逻辑

PHP是服务器端代码,在页面请求阶段就已执行;JavaScript是客户端代码,在浏览器中运行,两者属于异步关系。如果需要在Cardinal.OneConnect.start()执行完成后处理PHP逻辑,需通过AJAX发起新请求:

  1. 调整当前PHP代码,规范传递参数给JS:
if (isset($this->acsUrl)) {
    error_log('entro ');
    // 注册脚本并指定路径
    wp_enqueue_script('netpay3ds-confirm', plugin_dir_url(__FILE__) . 'assets/javascripts/netpay3ds-confirm.js', array(), false, true);
    // 通过wp_localize_script传递参数,避免字符串拼接风险
    wp_localize_script('netpay3ds-confirm', 'NetPay3DSData', array(
        'status' => $this->status,
        'responseCode' => $this->responseCode,
        'acsUrl' => $this->acsUrl,
        'paReq' => $this->paReq,
        'authenticationTransactionID' => $this->authenticationTransactionID,
        'ajaxUrl' => admin_url('admin-ajax.php'),
        'nonce' => wp_create_nonce('netpay_3ds_nonce') // 用于AJAX验证
    ));
    wp_send_json_success();
};
  1. 在netpay3ds-confirm.js中完成逻辑后发起AJAX请求:
Cardinal.OneConnect.start(
    NetPay3DSData.status,
    NetPay3DSData.responseCode,
    NetPay3DSData.acsUrl,
    NetPay3DSData.paReq,
    NetPay3DSData.authenticationTransactionID
).then(function() {
    // 逻辑完成后调用后端处理函数
    fetch(NetPay3DSData.ajaxUrl, {
        method: 'POST',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        },
        body: new URLSearchParams({
            action: 'handle_netpay_3ds_complete',
            nonce: NetPay3DSData.nonce,
            netpay_card_processor_transaction_id: '此处传入实际值',
            netpay_status_3ds_id: '此处传入实际值'
        })
    }).then(response => response.json())
      .then(data => {
          console.log('后端处理完成:', data);
      });
});
  1. 在PHP中注册AJAX处理函数:
add_action('wp_ajax_handle_netpay_3ds_complete', 'handle_netpay_3ds_complete');
add_action('wp_ajax_nopriv_handle_netpay_3ds_complete', 'handle_netpay_3ds_complete');

function handle_netpay_3ds_complete() {
    // 验证请求合法性
    check_ajax_referer('netpay_3ds_nonce', 'nonce');
    
    $netpay_card_processor_transaction_id = isset( $_POST['netpay_card_processor_transaction_id'] ) ? wc_clean( $_POST['netpay_card_processor_transaction_id'] ) : '';
    $netpay_status_3ds_id = isset( $_POST['netpay_status_3ds_id'] ) ? wc_clean( $_POST['netpay_status_3ds_id'] ) : '';
    error_log($netpay_card_processor_transaction_id);
    error_log($netpay_status_3ds_id);
    
    wp_send_json_success('处理完成');
}

内容的提问来源于stack exchange,提问作者Alex Navedo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:51:56