Warum gibt Simplepie Feed-Artikel in falscher Reihenfolge zurück?

Ich habe diesen Feed von Picasa (richtig aber willkürlich, gewünschte Reihenfolge).

Das Ergebnis ist durcheinander

Auch mit diesem Feed zum Beispiel.

Es ist in regelmäßigen, nach Datum sortierten Feeds in Ordnung, aber nicht in diesen. In dem Objekt, das ich von Simplepie bekomme, hat es eine verpatzte Ordnung. Ich mache nichts Besonderes, einfach die Ergebnisse überfliegen und sie in der gefundenen Reihenfolge mit meinem kommerziellen Galerie-Plugin anzeigen.

$rss_items = $rss->get_items(0, $rss->get_item_quantity($limit));

Ich habe es versucht (in wp_feed_options ), aber es ändert nichts: $rss->enable_order_by_date(false);

Auch wenn ich var_dump($rss_items); Ich bekomme ein Array, das durch 546503 Textzeilen dargestellt wird. Ich glaube nicht, dass das normal ist, vielleicht leidet es auch an der Erinnerung, aber ich kann diese Daten nicht einmal manuell durchsehen, um zu sehen, ob die Reihenfolge von Natur aus schlecht ist oder sich irgendwo durcheinander bewegt.

Ich kann auch nicht sagen, ob es der Fehler von Simplepie oder WordPress ist.

Solutions Collecting From Web of "Warum gibt Simplepie Feed-Artikel in falscher Reihenfolge zurück?"

Am Ende der class-simplepie.php gibt es diese Zeile:

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

Welche Kraft-Sortierung Futterelemente, im Falle von Multifeed .

Der $feed->enable_order_by_date(false); ist in der Tat sehr wichtig und der Schlüssel zu den Dingen, aber es wird ignoriert (was ich erlebt habe), wenn ich Multifeed verwenden . Quelle: in get_items() der class-simplepie.php gibt es das:

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

Ich habe Multifeed versehentlich auch für einzelne URLs verwendet. Denken Sie daran, dass es ein Plugin ist, bei dem ich nicht wusste, ob es einzelne oder mehrere URLs sein würde, daher schien es praktisch, ein Array immer an fetch_feed() .

Es sieht jetzt ungefähr so ​​aus:

 $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); 

Und die Aktion ist:

 function jig_add_force_rss($feed,$url){ $feed->force_feed(true); $feed->enable_order_by_date(false); } 

Ihre Lösungen funktionieren, da Sie die RSS-URL als String und nicht als ein Ein-Element-Array übergeben haben. Ich verglich sie damit, wie ich die Methoden benutzte und das war der Unterschied. Jetzt funktioniert es mit und ohne Abfragezeichenfolge in der Picasa-Feed-URL, immer so wie es im Browser aussieht.

Ich denke, du musst einfach ersetzen:

 $feed->enable_order_by_date(false); 

mit

 $rss->enable_order_by_date(false); 

um die absteigende Datumsreihenfolge zu deaktivieren.

Bei einem Feed-Fehler gibt die function fetch_feed() eine Instanz der class \WP_Error . Andernfalls ist die Ausgabe eine Instanz der class \SimplePie und diese class enthält die öffentliche Methode enable_order_by_date ().

Also solltest du es so benutzen:

 // 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 ... } 

wo wir (implizit) sicherstellen, dass wir eine Instanz der class \SimplePie .

Ich habe keine Ahnung, was mit diesem Feed passiert, aber mit diesem Code

 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 ''; } } 

Ich bekomme die gleiche Reihenfolge, die ich beim Öffnen dieses Feeds mit meinem Browser erhalte. Wenn ich die ?alt=rss&kind=photo&hl=en_US in der URL ?alt=rss&kind=photo&hl=en_US , werden die beschriebenen Probleme ?alt=rss&kind=photo&hl=en_US und die Artikel sind in der falschen Reihenfolge.

Keine Ahnung warum, aber vielleicht kannst du von hier aus weiterarbeiten.

Edit: Kurz gesagt, vielleicht war das Problem die URL des Feeds?


Hier ist ein hacky Weg, um den richtigen Feed zu bekommen:

 $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 ''; } $i++; } } 

Also wechselte ich zu json feed und analysiere es irgendwie hässlich. Aber es macht den Job erledigt: D der $entry->content gibt sowohl den image type als auch die source, weshalb es das extra if($i % 2 != 0) , um nur jeden anderen Knoten zu bekommen.

Dennoch habe ich keine Ahnung, warum der RSS das tut, aber hier ist sowieso ein alternativer Weg.

edit: Zum nochmaligen Hinzufügen hast du gesagt, du könntest den rss nicht manuell parsen, also sage ich einfach, dass du &prettyprint=true zur URL hinzufügen &prettyprint=true , um einen schöneren Feed zu bekommen, wenn du ihn lesen &prettyprint=true .


Nummer tausend bearbeiten: Alternativer Weg!

 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().'
'; echo ''; } }

durch Hinzufügen von ?alt=rss&fields=item(media:group(media:content(@url))) Ich habe die beiden Feeds, die Sie bisher bereitgestellt haben, um richtig zu arbeiten! Ich habe all die lustigen Informationen, die ich hier ausprobieren kann.

Die einfachste Lösung für jemanden, bei dem dieses Problem auftritt, ist Folgendes:

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

Wenn Sie dies in Ihre functions.php einfügen, wird jeder Feed in der Reihenfolge angezeigt, in der er empfangen wurde.