it-swarm.com.de

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

Ich habe diese feed from picasa (richtige aber willkürliche, 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. Bei dem Objekt, das ich von Simplepie bekomme, ist die Reihenfolge durcheinander. Ich mache keine Lust, einfach eine Schleife über die Ergebnisse zu machen und sie mit meinem kommerziellen Galerie-Plugin in der gefundenen Reihenfolge anzuzeigen.

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

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

Außerdem erhalte ich, wenn ich var_dump($rss_items); mache, ein Array, das durch 546503 Textzeilen dargestellt wird. Ich glaube nicht, dass das normal ist, vielleicht belastet es auch den Speicher, aber ich kann diese Daten nicht einmal manuell durchsehen, um festzustellen, ob die Reihenfolge von Natur aus schlecht ist oder nur irgendwo durcheinander gerät.

Ich kann auch nicht sagen, ob es die Schuld von Simplepie's oder WordPress Wrapper ist.

3

Am Ende von class-simplepie.php steht diese Zeile:

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

Welche Vorschubelemente zwangssortieren, bei Mehrfacheinzug .

Die $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 verwende. Quelle: in get_items() von class-simplepie.php gibt es folgendes:

// 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 aus Versehen auch für einzelne URLs verwendet. Denken Sie daran, dass es sich um ein Plugin handelt, bei dem ich nicht wusste, ob es sich um eine einzelne oder mehrere URLs handelt. Es schien daher angebracht, ein Array immer an fetch_feed() zu übergeben.

So sieht es 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 haben funktioniert, weil Sie die RSS-URL als Zeichenfolge und nicht als Array mit einem Element übergeben haben. Ich verglich sie damit, wie ich die Methoden verwendete, und das war der Unterschied. Jetzt funktioniert es mit und ohne Abfragezeichenfolge in der Picasa-Feed-URL, immer so, wie es im Browser aussieht.

3

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 '<img src="'.$Enclosure->get_link().'">';
    }
}

Ich erhalte die gleiche Reihenfolge, die ich erhalte, wenn ich diesen Feed mit meinem Browser öffne. Wenn ich den ?alt=rss&kind=photo&hl=en_US in der URL belasse, werden die von Ihnen beschriebenen Probleme angezeigt und die Artikel befinden sich in der falschen Reihenfolge.

Keine Ahnung warum, aber vielleicht können Sie von hier aus weiterarbeiten.

Edit: Also kurz, vielleicht lag das Problem an der URL des Feeds?


Hier ist ein hackiger 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 '<img src="'.$image.'" />'; }
        $i++;
    }
}

Also habe ich zu json feed gewechselt und es irgendwie hässlich analysiert. Aber es wird die Arbeit erledigt: D der $entry->content gibt sowohl Bildtyp als auch Quelle an, weshalb es diese zusätzliche if($i % 2 != 0) gibt, um nur jeden zweiten Knoten zu erhalten.

Trotzdem habe ich keine Ahnung, warum das RSS so ist, aber hier ist eine alternative Möglichkeit.

edit: um noch einmal hinzuzufügen, hast du gesagt, dass du den RSS-Code wirklich nicht manuell analysieren kannst. Ich sage nur, dass du &prettyprint=true zur URL hinzufügen kannst, um einen schöneren Feed zu erhalten, wenn du ihn lesen möchtest.


Tausender editieren: Alternativ!

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

durch das Hinzufügen von ?alt=rss&fields=item(media:group(media:content(@url))) habe ich die beiden bisher von Ihnen bereitgestellten Feeds erhalten, damit sie korrekt funktionieren! Ich habe alle lustigen Informationen zum Ausprobieren von hier .

1
jimihenrik

Ich denke, Sie müssen einfach ersetzen:

$feed->enable_order_by_date(false);

mit

$rss->enable_order_by_date(false);

um die absteigende Datumsreihenfolge zu deaktivieren.

Im Falle eines Feed-Fehlers gibt die Funktion fetch_feed() eine Instanz der Klasse \WP_Error zurück. Andernfalls ist die Ausgabe eine Instanz der Klasse \SimplePie und diese Klasse 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 Klasse \SimplePie haben.

1
birgire

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

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 Ihren functions.php einfügen, werden alle Feeds in der Reihenfolge ihres Eingangs angezeigt.

1
Marc