web-dev-qa-db-ja.com

Simplepieが間違った順序でフィールド項目を返すのはなぜですか?

私はこの feed from picasa を持っています(正しいが任意、望ましい順序)。

結果は めちゃくちゃ -

また、 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のラッパーのせいなのかもわかりません。

3

class-simplepie.phpの最後にこの行があります。

usort($items, array(get_class($urls[0]), 'sort_items'));

重送 の場合、フィード要素を強制ソートします。

$feed->enable_order_by_date(false);は確かに非常に重要であり、物事の鍵ですが、 multifeed を使用した場合は無視されます(私が経験していたこと)。出典:class-simplepie.phpget_items()にこれがあります:

// 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))

私は 重送 を単一の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を文字列として渡し、1要素の配列として渡さなかったのでうまくいっていました。私はそれらを私が方法を使っていた方法と比較しました、そして、これは違いでした。 PicasaフィードURLのクエリ文字列の有無にかかわらず機能するようになりました。ブラウザの外観と同じです。

3

このフィードで何が起こっているのかわかりませんが、このコードでは

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フィードに切り替えてちょっと醜くそれを解析します。 $entry->contentはイメージタイプとソースの両方を与えるので、他のすべてのノードだけを取得するための追加のif($i % 2 != 0)があります。

それでも、RSSがなぜそうしているのか私にはわかりませんが、とにかくここに別の方法があります。

edit: 再度追加するには、手動でRSSを解析できないと言ったので、読みたい場合は&prettyprint=trueをurlに追加してもよいとしています。


編集番号1000: 代替方法!

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)))を追加することで、これまでに提供した2つのフィードが正しく機能するようになりました。 here から試してみると面白い情報が全部手に入りました。

1
jimihenrik

私はあなたが単に置き換える必要があると思います:

$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クラスのインスタンスがあることを確認します。

1
birgire

この問題が発生している人のための最も簡単な修正はこれです:

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に入れると、フィードは受け取った順に表示されます。

1
Marc