还不算是一个答案,而只是我的经验清单-也许您忽略了一些东西。
调试请求及其结果
无需深入研究更新过程,但是WP HTTP API使用WP_HTTP
该类。它还提供了一个好东西:调试钩子。
do_action( 'http_api_debug', $response, 'response', $class, $args, $url );
在哪里$response
还可以是一个WP_Error
可以告诉您更多信息的对象。
注意:从简短的测试来看,如果将过滤器放置在离实际执行请求的位置较近的位置,则该过滤器似乎仅出于某种原因而起作用。因此,也许您需要在以下过滤器之一的回调中调用它。
WP_HTTP
类参数
Classes参数本身是可过滤的,但是某些方法可以通过方法内部将其重置为WP所需要的。
apply_filters( 'http_request_args', $r, $url );
其中一个参数是ssl_verify
,默认情况下为true(但对我来说,从-例如GitHub更新时会引起大量问题)。编辑:调试测试请求后,我发现了另一个参数,该参数设置为验证SSL是否设置为true
。它被称为sslverify
(不下划线分开)。不知道它在游戏中的位置,是否已真正使用或废弃,以及是否有机会影响其价值。我使用'http_api_debug'
过滤器找到了它。
完全定制
您也可以“简单地”覆盖整个内部结构,并进行自定义设置。有一个过滤器。
apply_filters( 'pre_http_request', false, $r, $url );
第一个参数需要设置为true。比起您可以与其中的参数$r
和的结果进行交互parse_url( $url );
。
代理
可能可行的另一件事可能是通过自定义代理运行所有内容。这需要您中的一些设置wp-config.php
。我以前从来没有尝试过这一点,但我通过常量跑了一段时间后,并总结出了一些例子,应该工作,包括一些意见的情况下,我需要一天。您必须定义WP_PROXY_HOST
和WP_PROXY_PORT
最小值。设置。否则,将无济于事,它将绕过您的代理。
# HTTP Proxies
# Used for e.g. in Intranets
# Fixes Feeds as well
# Defines the proxy adresse.
define( 'WP_PROXY_HOST', '127.0.84.1' );
# Defines the proxy port.
define( 'WP_PROXY_PORT', '8080' );
# Defines the proxy username.
define( 'WP_PROXY_USERNAME', 'my_user_name' );
# Defines the proxy password.
define( 'WP_PROXY_PASSWORD', 'my_password' );
# Allows you to define some adresses which
# shouldn't be passed through a proxy.
define( 'WP_PROXY_BYPASS_HOSTS', 'localhost, www.example.com' );
编辑
所述WP_HTTP
类通常作为基类(将延长不同的场景)。延伸WP_HTTP_*
类Fsockopen
,Streams
,Curl
,Proxy
,Cookie
,Encoding
。如果将回调链接到'http_api_debug'
-action,则第三个参数将告诉您哪个类用于您的请求。
在WP_HTTP_curl
类内部,您将找到request()
方法。此方法提供了两个过滤器来拦截SSL行为:一个用于本地请求'https_local_ssl_verify'
,一个用于远程请求'https_ssl_verify'
。WP可能会定义local
as localhost
和您从中得到的回报get_option( 'siteurl' );
。
因此,我要做的是在执行该请求之前(或从挂接到最接近的请求的回调中)尝试以下操作:
add_filter( 'https_ssl_verify', '__return_true' );
# Local requests should be checked with something like
# 'localhost' === $_SERVER['HTTP_HOST'] or similar
# add_filter( 'https_local_ssl_verify', '__return_true' );
旁注:大多数情况下WP_HTTP_curl
将用于处理代理。