如何让WordPress的wp_remote_get忽略已设置的代理执行?
解决特定wp_remote_get请求绕过全局CURL代理的问题
针对你通过http_api_curl钩子全局设置代理,但需要让特定wp_remote_get请求跳过代理的场景,有三种可行方案:
方案一:临时移除全局代理钩子
执行目标请求前先移除代理钩子,请求完成后重新添加,确保后续请求不受影响:
// 移除全局代理钩子(注意优先级要和添加时一致,这里是10) remove_action('http_api_curl', array(__CLASS__, 'addProxy'), 10); // 执行不需要代理的请求 $response = wp_remote_get( $url, array( 'headers' => array( 'Authorization' => 'Bearer ' . $api_key, ), 'timeout' => self::CURL_TIMEOUT, ) ); // 重新添加代理钩子,恢复全局代理设置 add_action('http_api_curl', array(__CLASS__, 'addProxy'), 10, 3); return $response;
方案二:在代理函数中添加跳过逻辑
给目标请求添加自定义标记,让代理函数识别并跳过代理设置:
首先修改wp_remote_get的调用,加入自定义参数:
return wp_remote_get( $url, array( 'headers' => array( 'Authorization' => 'Bearer ' . $api_key, ), 'timeout' => self::CURL_TIMEOUT, 'skip_proxy' => true, // 自定义跳过标记 ) );
然后修改你的addProxy函数,检查标记并跳过代理设置:
public static function addProxy($handle, $request_args, $url) { // 检查是否存在跳过代理的标记 if (!empty($request_args['skip_proxy'])) { return; // 直接返回,不执行代理设置逻辑 } // 原有代理相关设置代码 curl_setopt($handle, CURLOPT_USERAGENT, $agent); // 其他代理配置(如CURLOPT_PROXY等)... }
方案三:直接在请求参数中覆盖CURL代理选项
通过wp_remote_get的curl参数,直接清空代理相关的CURL选项,无需修改全局钩子:
return wp_remote_get( $url, array( 'headers' => array( 'Authorization' => 'Bearer ' . $api_key, ), 'timeout' => self::CURL_TIMEOUT, 'curl' => array( CURLOPT_PROXY => '', CURLOPT_PROXYTYPE => '', CURLOPT_PROXYUSERPWD => '', // 如果有代理认证,也一并清空 ), ) );
方案选型建议
- 方案一适合临时单个请求,实现简单,但在并发场景下可能影响其他请求;
- 方案二更灵活,适合多个请求需要跳过代理的场景,代码扩展性更好;
- 方案三无需修改全局代理逻辑,适合快速处理单个请求的情况。
内容的提问来源于stack exchange,提问作者Edu Rafael
相关产品推荐
相关产品推荐

