SimplePie排序多个Feed - 没有时间/日期戳,没有排序?

时间:2013-01-25 00:26:14

标签: php simplepie

是否有办法强制在日期中对一组Feed进行排序,即使一个Feed缺少时间/日期戳?

如果我理解正确,列表中的一个错误的提要会弄乱排序。从SimplePieWP插件的描述,但可能是一个普遍的问题:

  

'...该插件还支持我们亲切地称之为“多页进纸”。这允许您将多个Feed合并在一起并按时间和日期对项目进行排序...请注意我说>“按时间和日期对项目进行排序。”那么,如果Feed缺少时间/日期会发生什么 - >戳?他们不会排序。 (Duh。)按日期排序要求所有合并的> Feed中的所有单个项目都有与之关联的时间/日期戳。'

我想我经常在我的网站上看到这个结果; Feed没有按日期排序,数组中顶部Feed的帖子总是位于顶部等。

在我的设置中,无法手动检查每个Feed的时间/日期戳; Feed列表太长和/或不断变化并自动生成。

我是否可以添加代码来过滤掉没有时间/日期戳的Feed?

或者在20世纪70年代给坏的饲料提供一个默认的时间/日期,所以它们排在最后?

或者此问题已修复?我错过了什么吗?

多年来我对此进行了很多搜索,但从来没有弄明白。

1 个答案:

答案 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
}
相关问题