1

有没有办法强制一组提要按日期排序,即使一个提要缺少时间/日期戳?

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

'...该插件还支持我们亲切地称为“Multifeeds”的功能。这使您可以 > 将多个提要合并在一起并按时间和日期对项目进行排序……请注意我说过 >“按时间和日期对项目进行排序”。那么,如果提要缺少时间/日期-> 戳记会怎样?他们不会排序。(Duh。)按日期排序需要所有合并的>提要中的所有单个项目都具有与之关联的时间/日期戳。

我想我经常在我的网站上看到这个结果;提要未按日期排序,来自数组顶部提要的帖子始终位于顶部等。

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

有没有我可以在某处添加的代码来过滤掉没有时间/日期戳的提要?

或者在 1970 年代给不良的提要一个默认的时间/日期,所以它们在底部排序?

还是这个问题已经解决了?我错过了什么吗?

这些年来,我对此进行了很多搜索,但从未弄清楚。

4

1 回答 1

3

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
}
于 2013-01-25T02:54:25.830 回答