1

1つのフィードに時刻/日付スタンプがない場合でも、フィードの配列を強制的に日付で並べ替える方法はありますか?

私が正しく理解していれば、リスト内の1つの悪いフィードが並べ替えを台無しにします。SimplePieWPプラグインの説明からですが、おそらく一般的な問題です。

'...プラグインは、愛情を込めて「マルチフィード」と呼ぶものもサポートしています。これにより、複数のフィードをマージして、時間と日付でアイテムを並べ替えることができます...「時間と日付でアイテムを並べ替える」と言ったことに注意してください。では、フィードに時刻/日付->スタンプがない場合はどうなりますか?彼らは分類しません。(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 に答える