私はhttp_request_Host_is_external
フィルタを使用しようとして本当に苦労しています。背景として、プライベートプラグインとテーマの更新を処理するために別のサーバーを設定しようとしています。問題は、それが別のサーバー上にあるということです。そのためWordpressのwp_http_validate_url
(wp-includes/http.php)関数はリクエストを殺します。以下はそのファイルの481 - 503行目です。
if ( $ip ) {
$parts = array_map( 'intval', explode( '.', $ip ) );
if ( '127.0.0.1' === $ip
|| ( 10 === $parts[0] )
|| ( 172 === $parts[0] && 16 <= $parts[1] && 31 >= $parts[1] )
|| ( 192 === $parts[0] && 168 === $parts[1] )
) {
// If Host appears local, reject unless specifically allowed.
/**
* Check if HTTP request is external or not.
*
* Allows to change and allow external requests for the HTTP request.
*
* @since 3.6.0
*
* @param bool false Whether HTTP request is external or not.
* @param string $Host IP of the requested Host.
* @param string $url URL of the requested Host.
*/
if ( ! apply_filters( 'http_request_Host_is_external', false, $Host, $url ) )
return false;
}
}
そこには、フィルタを適用して外部からのリクエストを行うことができるはずであるというコメントがあることに気付くでしょうが、私が試しているものはうまくいかないようです。
require 'plugin_update_checker.php';
apply_filters( 'http_request_Host_is_external', true, "my-update-server.com", 'http://my-update-server.com/update/8b6b28f1a2604deea192076cb2343ff4/' );
$MyUpdateChecker = new PluginUpdateChecker_1_3(
'http://my-update-server/update/8b6b28f1a2604deea192076cb2343ff4/',
__FILE__,
'testslug'
);
私は自分のプラグインのメインファイルにフィルタを設定すればそれで大丈夫だと思いましたが、問題はWordpressのアップデータで外部からのリクエストが行われていることなので、フィルタは適用されないのでしょうか。
あなたはこれを行うことができます:
add_filter( 'http_request_Host_is_external', '__return_true' );
ただし、これによりこのセキュリティ機能が無効になります。あなたがHostやurlが変わることはなく、常にそうなることを知っているのなら、それを明示的にチェックすることでより安全になることができます。
add_filter( 'http_request_Host_is_external', 'allow_my_custom_Host', 10, 3 );
function allow_my_custom_Host( $allow, $Host, $url ) {
if ( $Host == 'my-update-server' )
$allow = true;
return $allow;
}
私はどうやら少し錆びています。これは私のためにそれを大事にした:
add_filter( 'http_request_Host_is_external', function() { return true; });