为什么Simplepie以错误的顺序返回提要项?

时间:2015-03-20 作者:Firsh - justifiedgrid.com

我有这个feed 从…起picasa (正确但任意的、所需的顺序)。

结果是messed up

此外,使用this feed, 例如

这在常规的、按日期排序的提要中是可以的,但在这些提要中则不行。在我从Simplepie得到的对象中,它有一个混乱的顺序。我不做任何花哨的事情,只是使用我的商业图库插件循环结果并按找到的顺序显示它们。

$rss_items = $rss->get_items(0, $rss->get_item_quantity($limit));

我已经试过了wp_feed_options) 但这并没有改变任何事情:$rss->enable_order_by_date(false);

还有,当我这样做的时候var_dump($rss_items); 我得到一个数组,它由546503 文本行。我不认为这是正常的,也许它也占用了内存,但我甚至无法手动查看这些数据,以查看顺序是否本质上是错误的,或者只是在某个地方混淆了。

而且我也不知道这是Simplepie还是WordPress的包装器的错。

4 个回复
最合适的回答,由SO网友:Firsh - justifiedgrid.com 整理而成

在…的结尾class-simplepie.php 有一行:

usort($items, array(get_class($urls[0]), \'sort_items\'));
在以下情况下,该力对进给元件进行排序:multifeed.

这个$feed->enable_order_by_date(false); 确实非常重要,是事情的关键,但如果我使用multifeed. 来源:inget_items() 属于class-simplepie.php 这是:

// If we want to order it by date, check if all items have a date, and then sort it
if ($this->order_by_date && empty($this->multifeed_objects))
我用过multifeed 对于单个URL也是意外的。记住,这是一个插件,我不知道它是一个URL还是多个URL,所以总是将数组传递给fetch_feed().

现在看起来是这样的:

$rss_url = explode(\',\',$rss_url); // Accept multiple URLs

if(count($rss_url) == 1){ // New code
    $rss_url = $rss_url[0];
}

add_action(\'wp_feed_options\', array($this, \'jig_add_force_rss\'), 10,2);
$rss = fetch_feed($rss_url);
remove_action(\'wp_feed_options\', array($this, \'jig_add_force_rss\'), 10);
行动是:

function jig_add_force_rss($feed,$url){
    $feed->force_feed(true);
    $feed->enable_order_by_date(false);
}
您的解决方案可以正常工作,因为您将RSS url作为字符串而不是单元素数组传递。我将它们与我使用这些方法的方式进行了比较,这就是区别所在。现在,它可以在Picasa提要URL中使用或不使用查询字符串,始终与它在浏览器中的外观相同。

SO网友:Marc

对于遇到此问题的人,最简单的修复方法是:

function my_add_force_rss($feed,$url){
   $feed->force_feed(true);
   $feed->enable_order_by_date(false);
}
add_action(\'wp_feed_options\', \'my_add_force_rss\', 10,2);
将此放置在functions.php 将强制按接收顺序显示任何馈送。

SO网友:birgire

我认为您只需更换:

$feed->enable_order_by_date(false);
使用

$rss->enable_order_by_date(false);
禁用降序日期排序。

在馈送错误的情况下fetch_feed() 函数返回\\WP_Error 班否则,输出是\\SimplePie 类,该类包含enable_order_by_date()公共方法。

所以你应该这样使用它:

// Fetch the feed:
$rss = fetch_feed( $feed_url );

// Make sure we don\'t have and WP_Error instance:
if ( ! is_wp_error( $rss ) )   
{
    // Disable the date ordering:
    $rss->enable_order_by_date( false );

    // ... etc ...
}
其中,我们(隐式地)确保有\\SimplePie

SO网友:jimihenrik

我不知道这个feed发生了什么,但是这个代码

include_once( ABSPATH . WPINC . \'/feed.php\' );
$rss = fetch_feed( \'https://picasaweb.google.com/data/feed/base/user/110981376645512804522/albumid/5638371435917293985\' );

foreach ($rss->get_items() as $item) {
    if ($enclosure = $item->get_enclosure()) {
        echo \'<img src="\'.$enclosure->get_link().\'">\';
    }
}
我得到的顺序与用浏览器打开提要时得到的顺序相同。如果我离开?alt=rss&kind=photo&hl=en_US 在url中,它给出了您描述的问题,并且项目的顺序错误。

不知道为什么,但也许你可以从这里继续努力。

编辑:那么简而言之,问题可能是提要的url?

以下是一种获取正确提要的简便方法:

$url = \'https://picasaweb.google.com/data/feed/base/user/110981376645512804522/albumid/5638371435917293985?alt=json\';
// or https://picasaweb.google.com/data/feed/base/user/117541338986679044195/albumid/6129832223894216561?alt=json&kind=photo&hl=en_US&imgmax=800
$json = json_decode(file_get_contents($url));
$feed = (array)$json->feed;
foreach ($feed[\'entry\'] as $entry) {
    $i = 0;
    foreach ($entry->content as $image) {
        if($i % 2 != 0) { echo \'<img src="\'.$image.\'" />\'; }
        $i++;
    }
}
所以我切换到json提要,并对其进行了一些笨拙的解析。但它完成了任务:D$entry->content 提供图像类型和源,这就是为什么有额外的if($i % 2 != 0) 仅获取其他节点。

尽管如此,我仍然不知道RSS为什么会这样做,但这里有另一种方法。

edit: 要再次添加,您说过您确实无法手动解析rss,所以我只想说您可以添加&prettyprint=true 如果您想阅读,请访问url以获取更漂亮的提要。

<小时>edit number thousand: 另一种方式!

include_once( ABSPATH . WPINC . \'/feed.php\' );
$rss = fetch_feed( \'https://picasaweb.google.com/data/feed/base/user/117541338986679044195/albumid/6129832223894216561?alt=rss&fields=item(media:group(media:content(@url)))\' );

foreach ($rss->get_items() as $item) {
    if ($enclosure = $item->get_enclosure()) {
        //echo $enclosure->get_link().\'<br>\';
      echo \'<img src="\'.$enclosure->get_link().\'">\';
    }
}
通过添加?alt=rss&fields=item(media:group(media:content(@url))) 我得到了您迄今为止提供的两个提要,可以正常工作!我得到了所有有趣的信息here.

结束

相关推荐

从插件生成自定义RSS

使用this tutorial 我能够创建基本的自定义RSS提要。但我希望有一个从插件生成的自定义RSS,而我的Google Fu在特定搜索上让我失望。是否有任何方法可以从插件(而不是“从”模板)正确生成自定义提要?