web-dev-qa-db-fra.com

Pourquoi Simplepie renvoie-t-il les éléments de fil dans un mauvais ordre?

J'ai ceci feed from picasa (correct mais arbitraire, ordre souhaité).

Le résultat est foiré

Aussi, avec ce fil , par exemple.

C'est bien en règle, trié par dates, mais pas celles-ci. Dans l'objet que je reçois de Simplepie, il a un ordre foiré. Je ne fais rien d'extraordinaire, je passe en boucle sur les résultats et les affiche dans l'ordre trouvé à l'aide de mon plugin de galerie commerciale.

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

J'ai essayé ceci (connecté à wp_feed_options) mais cela ne change rien: $rss->enable_order_by_date(false);

De même, lorsque je fais var_dump($rss_items);, je reçois un tableau représenté par 546503 lignes de texte. Je ne crois pas que ce soit normal, peut-être que cela bloque aussi la mémoire, mais je ne peux même pas regarder ces données manuellement pour voir si la commande est intrinsèquement mauvaise ou si elle est simplement mélangée quelque part.

De plus, je ne peux pas dire si c'est la faute de l'encapsuleur de Simplepie ou WordPress.

3
Firsh - LetsWP.io

À la fin de class-simplepie.php, il y a cette ligne:

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

Quels sont les éléments d’alimentation, en cas de multifeed .

La $feed->enable_order_by_date(false); est en effet très importante et la clé des choses, MAIS elle est ignorée (ce que j’ai vécu) si j’utilise multifeed . Source: dans get_items() of class-simplepie.php il y a ceci:

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

J'ai aussi utilisé multifeed accidentellement pour une seule URL. Rappelez-vous que c'est un plugin dans lequel je ne savais pas s'il s'agirait d'une ou de plusieurs URL. Il semblait donc pratique de toujours passer un tableau dans fetch_feed().

Donc, cela ressemble maintenant à quelque chose comme ça:

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

Et l'action est:

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

Vos solutions fonctionnaient, car vous avez passé l’URL RSS sous forme de chaîne et non sous forme de tableau à un élément. Je les ai comparés à la manière dont j'utilisais les méthodes et c'était la différence. Désormais, cela fonctionne avec et sans chaîne de requête dans l'URL du flux Picasa, toujours identique à son apparence dans le navigateur.

3
Firsh - LetsWP.io

Je n'ai aucune idée de ce qui se passe avec ce fil mais avec ce 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().'">';
    }
}

Je reçois le même ordre que lors de l'ouverture de ce flux avec mon navigateur. Si je laisse le ?alt=rss&kind=photo&hl=en_US dans l'URL, cela donne les problèmes que vous avez décrits et les éléments sont dans le mauvais ordre.

Je ne sais pas pourquoi, mais peut-être que vous pouvez travailler à partir d'ici.

Edit: Bref, le problème était peut-être l'URL du flux?


Voici une méthode simple pour obtenir le bon flux:

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

Alors je suis passé à json feed et l’analyse un peu moche. Mais le travail est fait: D le $entry->content donne à la fois le type d’image et la source, c’est pourquoi il ya cet extra if($i % 2 != 0) pour n’obtenir que tous les autres nœuds.

Pourtant, je ne sais pas pourquoi le RSS fait cela, mais voici une autre façon.

edit: à rajouter, vous avez dit que vous ne pouviez vraiment pas analyser le flux RSS manuellement. Je vous dirai donc que vous pouvez ajouter &prettyprint=true à l’URL pour obtenir un fichier plus joli si vous souhaitez le lire.


éditer le nombre mille: Manière alternative!

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

en ajoutant ?alt=rss&fields=item(media:group(media:content(@url))), les deux flux que vous avez fournis jusqu’à présent fonctionnent correctement! J'ai toutes les informations amusantes à essayer de ici .

1
jimihenrik

Je pense que vous devez simplement remplacer:

$feed->enable_order_by_date(false);

avec

$rss->enable_order_by_date(false);

pour désactiver le classement par date décroissant.

Dans le cas d'une erreur de flux, la fonction fetch_feed() renvoie une instance de la classe \WP_Error. Sinon, la sortie est une instance de la classe \SimplePie et cette classe contient la méthode publique enable_order_by_date ().

Donc, vous devriez l'utiliser comme ceci:

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

où nous nous assurons (implicitement) d'avoir une instance de la classe \SimplePie.

1
birgire

La solution la plus simple pour une personne confrontée à ce problème est la suivante:

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

Le placer dans votre functions.php forcera l'affichage de tout flux dans l'ordre de réception.

1
Marc