是否有办法强制在日期中对一组Feed进行排序,即使一个Feed缺少时间/日期戳?
如果我理解正确,列表中的一个错误的提要会弄乱排序。从SimplePieWP插件的描述,但可能是一个普遍的问题:
'...该插件还支持我们亲切地称之为“多页进纸”。这允许您将多个Feed合并在一起并按时间和日期对项目进行排序...请注意我说>“按时间和日期对项目进行排序。”那么,如果Feed缺少时间/日期会发生什么 - >戳?他们不会排序。 (Duh。)按日期排序要求所有合并的> Feed中的所有单个项目都有与之关联的时间/日期戳。'
我想我经常在我的网站上看到这个结果; Feed没有按日期排序,数组中顶部Feed的帖子总是位于顶部等。
在我的设置中,无法手动检查每个Feed的时间/日期戳; Feed列表太长和/或不断变化并自动生成。
我是否可以添加代码来过滤掉没有时间/日期戳的Feed?
或者在20世纪70年代给坏的饲料提供一个默认的时间/日期,所以它们排在最后?
或者此问题已修复?我错过了什么吗?
多年来我对此进行了很多搜索,但从来没有弄明白。
答案 0 :(得分:2)
SimplePie对SimplePie :: merge_items()中的每个项进行显式检查,以确定是否有任何项缺少日期。
您必须覆盖此方法才能更改多页进纸的排序行为。下面是对多页进纸进行排序的覆盖,即使项目缺少日期也是如此。如果该项目缺少日期,则会将其排序到底部。 (使用SimplePie 1.3)。
class SimplePieAlwaysSort extends SimplePie
{
public function get_items($start = 0, $end = 0)
{
if (!isset($this->data['items']))
{
if (!empty($this->multifeed_objects))
{
$this->data['items'] = self::merge_items($this->multifeed_objects, $start, $end, $this->item_limit);
}
}
return parent::get_items($start, $end);
}
public static function merge_items($urls, $start = 0, $end = 0, $limit = 0)
{
if (is_array($urls) && sizeof($urls) > 0)
{
$items = array();
foreach ($urls as $arg)
{
if ($arg instanceof SimplePie)
{
$items = array_merge($items, $arg->get_items(0, $limit));
}
else
{
trigger_error('Arguments must be SimplePie objects', E_USER_WARNING);
}
}
usort($items, array(get_class($urls[0]), 'sort_items'));
if ($end === 0)
{
return array_slice($items, $start);
}
else
{
return array_slice($items, $start, $end);
}
}
else
{
trigger_error('Cannot merge zero SimplePie objects', E_USER_WARNING);
return array();
}
}
}
$pie = new SimplePieAlwaysSort();
$pie->set_feed_url(array('http://stackoverflow.com/feeds'));
$pie->init();
foreach ($pie->get_items() as $item)
{
// do stuff
}