我想您的意思是使用HTTP身份验证获取外部提要。
使用HTTP身份验证获取提要请注意fetch_rss()
使用WordPress中不推荐使用的MagPie库。
改用fetch_feed()
它使用SimplePie库。
看起来它不支持这种url:
http://user:[email protected]/feed/
就像我们可以使用
curl
在命令行中,例如:
# curl -i http://user:[email protected]/feed/
The
fetch_feed()
函数调用
wp_safe_remote_request()
函数,以获取提要。这是在
WP_SimplePie_File
类,这是
SimplePie_File
班
这是个好消息,因为这意味着我们可以使用http_request_args
过滤器,以修改请求标头。如果我们查看HTTP API, 我们在外部参考资料中看到,有一个链接指向约翰·布莱克本(JohnBlackbourn)关于Basic Authentication with the WordPress HTTP API. 在这里,他给出了以下示例:
$args = array(
\'headers\' => array(
\'Authorization\' => \'Basic \' . base64_encode( YOUR_USERNAME . \':\' . YOUR_PASSWORD )
)
);
wp_remote_request( $url, $args );
将正确的身份验证标头与请求一起发送。
演示插件现在可以添加对以下url类型的支持:
$rss = fetch_feed( \'http://user:[email protected]/feed/\' );
使用此演示插件:
<?php
/**
* Plugin Name: Fetch Feeds with http authentication
* Description: Allows feeds urls like http://user:[email protected]/feed/
* Plugin URI: http://wordpress.stackexchange.com/a/199101/26350
*/
add_action( \'wp_feed_options\', function( $feed, $url )
{
$user = parse_url( $feed->feed_url, PHP_URL_USER );
$pass = parse_url( $feed->feed_url, PHP_URL_PASS );
// Nothing to do
if( ! $user || ! $pass )
return;
// Remove the user:pass@ part from the feed url
$feed->feed_url = str_replace(
sprintf( \'%s:%s@\', $user, $pass ),
\'\',
$feed->feed_url
);
add_filter( \'http_request_args\', function( $r, $url ) use ( $user, $pass )
{
// Add the user & pass to the request\'s header
if( $user && $pass )
$r[\'headers\'][\'Authorization\'] = \'Basic \' . base64_encode( $user . \':\' . $pass );
return $r;
}, 10, 2 );
}, 10, 2 );
更新:错误如下:
WP HTTP Error: A valid URL was not provided.
当我们运行时:
$rss = fetch_feed( \'http://user:[email protected]/feed/\' );
它来自
WP_Http::request()
method:
if ( empty( $url ) || empty( $arrURL[\'scheme\'] ) )
return new WP_Error(\'http_request_failed\', __(\'A valid URL was not provided.\'));
以下是
wp_safe_remote_request()
函数为
defined:
function wp_safe_remote_request( $url, $args = array() ) {
$args[\'reject_unsafe_urls\'] = true;
$http = _wp_http_get_object();
return $http->request( $url, $args );
}
我只是在玩它并测试:
$args[\'reject_unsafe_urls\'] = false;
通过:
add_action( \'wp_feed_options\', function( $feed )
{
$user = parse_url( $feed->feed_url, PHP_URL_USER );
$pass = parse_url( $feed->feed_url, PHP_URL_PASS );
if( ! $user || ! $pass )
return;
add_filter( \'http_request_args\', function( $r, $url ) use ( $user, $pass )
{
if( $user && $pass )
$r[\'reject_unsafe_urls\'] = false;
return $r;
}, 10, 2 );
} );
然后这就奏效了:
$rss = fetch_feed( \'http://user:[email protected]/feed/\' );
内部
WP_Http::request()
方法我们得到这个条件:
if ( $r[\'reject_unsafe_urls\'] )
$url = wp_http_validate_url( $url );
所以看起来
wp_http_validate_url()
未验证此url:
http://user:[email protected]/feed/
按设置
reject_unsafe_urls
若为false,则跳过该检查。
实际上有一个过滤器可用于此:http_request_reject_unsafe_urls
, 但我不建议使用:
add_filter( `http_request_reject_unsafe_urls`, \'__return_false\' );
我认为上面的演示插件通常是更好的选择,因为它仍然使用
wp_http_validate_url()
在授权剥离url上。
注:
This part:
if ( isset( $parsed_url[\'user\'] ) || isset( $parsed_url[\'pass\'] ) )
return false;
在
wp_http_validate_url()
功能,似乎是
fetch_feed()
对于带有用户:pass的URL。