RSS WordPress SimplePie声称有效的URL无效

时间:2012-12-18 18:08:11

标签: wordpress rss simplepie

我正在尝试使用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。发生了什么事?

3 个答案:

答案 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);