PHP对接WordPress/WooCommerce REST API遇白屏,var_dump未执行求助
问题:WordPress插件调用第三方物流REST API出现白屏无输出
我正在尝试用PHP编写首个REST API对接,需要向物流公司发送运单数据并获取打印面单,对方已提供测试API凭证。编写的WordPress插件代码如下:
$url = "https://mywebsite/endpoint/"; $username = "myusername"; $password = "mypassword"; $data = array( 'key1' => 'value1', 'key2' => 'value2' ); $response = wp_remote_post( $url, array( 'body' => $data, 'headers' => array( 'Authorization' => 'Basic ' . base64_encode( $username . ':' . $password ), ), ) ); var_dump($response); // not being called
运行代码后出现白屏,无任何报错信息,最后一行的var_dump($response)未执行。不清楚是凭证错误、数据格式问题,还是请求未送达服务器?尝试过多种代码变体,甚至在WordPress外运行,均未解决问题。物流公司明确要求HTTP方法为POST,认证方式为Basic Authentication(用户名/密码),按要求编写却出现问题,求问原因。
排查与解决步骤
1. 开启WordPress错误调试
白屏的核心原因是WordPress默认屏蔽了致命错误输出,先开启调试模式获取具体错误信息:
在wp-config.php中添加以下代码:
define('WP_DEBUG', true); define('WP_DEBUG_DISPLAY', true);
重新运行代码后,就能看到具体的错误提示(比如函数未加载、内存不足、语法错误等)。
2. 确保代码在WordPress环境初始化后执行
wp_remote_post是WordPress核心函数,直接在插件根文件裸写代码会因为核心未加载完成而报错。必须将代码挂在合适的钩子上执行,示例正确的插件结构:
<?php /** * Plugin Name: Logistics Waybill Integration */ // 挂在admin_init钩子(后台执行)或init钩子(前台/后台都执行) add_action('admin_init', 'send_logistics_waybill'); function send_logistics_waybill() { $url = "https://mywebsite/endpoint/"; $username = "myusername"; $password = "mypassword"; $data = array( 'key1' => 'value1', 'key2' => 'value2' ); $response = wp_remote_post( $url, array( 'body' => $data, 'headers' => array( 'Authorization' => 'Basic ' . base64_encode( $username . ':' . $password ), ), )); var_dump($response); exit; // 临时添加,确保输出能在页面显示 }
3. 验证Basic Auth格式与有效性
手动生成认证字符串进行测试,避免编码逻辑问题:
// 单独执行这段代码,复制输出的字符串替换到请求头中 echo base64_encode("myusername:mypassword");
同时用curl命令直接测试第三方API,排除网络或凭证问题:
curl -X POST -u "myusername:mypassword" -d "key1=value1&key2=value2" https://mywebsite/endpoint/
如果curl能返回正常响应,说明问题出在WordPress代码执行环境;如果curl也失败,直接联系物流公司确认API地址、凭证或数据格式。
4. 调整请求超时与内存限制
默认超时时间可能过短,或服务器内存不足导致请求中断,可在wp_remote_post参数中增加配置:
$response = wp_remote_post( $url, array( 'body' => $data, 'headers' => array( 'Authorization' => 'Basic ' . base64_encode( $username . ':' . $password ), ), 'timeout' => 30, // 设置30秒超时 'httpversion' => '1.1', 'sslverify' => false, // 测试环境可临时关闭SSL验证(生产环境不建议) ));
内容的提问来源于stack exchange,提问作者Mister Woyng
相关产品推荐
相关产品推荐

