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发起新请求:
- 调整当前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(); };
- 在
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); }); });
- 在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
相关产品推荐
相关产品推荐

