我正在尝试使用Wordpress的内置SimplePie加载RSS提要。
include_once(ABSPATH . WPINC . '/feed.php');
$rssURL = 'http://missionstkitts.blogspot.com//feeds/posts/default';
$rss = fetch_feed($rssURL);
要调试,我使用了print_r($ rss);我得到一个WordPress错误对象:
WP_Error Object
(
[errors] => Array
(
[simplepie-error] => Array
(
[0] => WP HTTP Error: A valid URL was not provided.
)
)
[error_data] => Array
(
)
)
但令人沮丧的是,如果我打印$ rssURL然后复制并粘贴,它会直接转到正确的Feed。发生了什么事?
答案 0 :(得分:4)
由于这是谷歌的第一次热播,可能值得我添加这个可能的解决方案:
对于我们的实例 - 一个Intranet站点,从另一个内部页面提取rss源,然后由于安全原因,WordPress的URL检查器会阻止该源进入RFC1918私有地址。
我的实例中最简单的修复是将以下内容添加到functions.php中,但这确实有安全隐患,所以请确保在添加之前了解它:
add_filter( 'http_request_args', function( $args ) {
$args['reject_unsafe_urls'] = false;
return $args;
} );
进一步讨论和更多信息 - https://core.trac.wordpress.org/ticket/24646
答案 1 :(得分:1)
通过为特定网址添加preg_match,我们可以最大限度地减少已解析的无人值守网址的数量:
function http_request_local( $args, $url ) {
if ( preg_match('/xml|rss|feed/', $url) ){
$args['reject_unsafe_urls'] = false;
}
return $args;
}
add_filter( 'http_request_args', 'http_request_local', 5, 2 );
答案 2 :(得分:0)
因此,尽管上述回答有效,但我认为有一种方法可以更好地确保限制发送URL请求的范围,而不是允许所有操作。因此,我向遇到这种情况的任何人证明以下信息,以防万一。
如果最终的呼叫是针对内部服务器在私有IP上进行交叉通信但仍可公开访问的,则此答案很有用。
下面的代码段将在调用RSS feed的网站上运行。提供提要的网站不需要此。
add_filter('http_request_host_is_external', function($bool, $host, $url){
if($url === 'https://www.example.com/news/feed/' && $host === 'www.example.com'){
return true;
}
}, 10, 3);