Cela peut sembler très simple, mais je suis plutôt désespéré en ce qui concerne rss et WP. Où devrais-je mettre la if ( is_wp_error( $feed ) ) {
dans un code comme celui-ci:
<?php
$rss = fetch_feed('' . $instance["feed_address"] . '');
$maxitems = $rss->get_item_quantity($instance["feed_count"]);
$rss_items = $rss->get_items(0, $maxitems);
$title = substr($item['title'],0,55)." ... ";
?>
<ul>
<?php if ($maxitems == 0) echo ''; else foreach ( $rss_items as $item ) : ?>
<li>
<h2><a class="description" href="<?php echo $item->get_permalink(); ?>" target="_blank"><?php echo substr($item->get_title(), 0, 49) . ' ...'; ?> <span class="tip"><?php echo strip_tags(substr($item->get_description(), 0, 215)) . ' ...'; ?> <?php echo ''.$item->get_date('j F Y | g:i a'); ?></span></a></h2>
</li>
<?php endforeach; ?>
</ul>
Merci d'avance.
MODIFIER:
J'ai le code ci-dessus dans une page php personnalisée, pas dans les fichiers core. Cela fait-il une différence? Quoi qu'il en soit, j'ai réussi à faire ceci:
<?php
$rss = fetch_feed('' . $instance["feed_address"] . '');
if ( !is_wp_error( $rss ) ) :
$maxitems = $rss->get_item_quantity($instance["feed_count"]);
$rss_items = $rss->get_items(0, $maxitems);
$title = substr($item['title'],0,55)." ... ";
endif;
?>
<ul>
<?php if ($maxitems == 0) echo ''; else foreach ( $rss_items as $item ) : ?>
<li>
<h2><a class="description" href="<?php echo $item->get_permalink(); ?>" title="<?php echo 'Posted '.$item->get_date('j F Y | g:i a'); ?>" target="_blank"><?php echo substr($item->get_title(), 0, 49) . ' ...'; ?> <span class="tip"><?php echo strip_tags(substr($item->get_description(), 0, 215)) . ' ...'; ?></span></a></h2>
</li>
<?php endforeach; ?>
</ul>
Le point étant if ( !is_wp_error( $rss ) ) :
, au moins il charge les flux et tout semble fonctionner, mais est-ce que ça va? L'erreur peut ou non apparaître de temps en temps, donc les tests sont un peu difficiles. Mais avant, lorsque l'erreur se produisait, l'alimentation a arrêté le chargement à cet instant et n'a pas chargé l'autre alimentation (j'en ai deux) après cela non plus. Avec le code que j'ai posté ci-dessus, va-t-il sauter le flux qui reçoit l'erreur et charger l'autre?
Merci.
MODIFIER:
Merci beaucoup, sans le code ci-dessus, l'erreur se produit comme prévu, mais avec elle, le flux est simplement laissé vide et le suivant est chargé comme d'habitude. Tu gères!
Suivez $rss = fetch_feed('' . $instance["feed_address"] . '');
et recherchez la fonction dans wp-includes/feed.php
:
/**
* Build SimplePie object based on RSS or Atom feed from URL.
*
* @since 2.8
*
* @param string $url URL to retrieve feed
* @return WP_Error|SimplePie WP_Error object on failure or SimplePie object on success
*/
function fetch_feed($url) {
require_once (ABSPATH . WPINC . '/class-feed.php');
$feed = new SimplePie();
$feed->set_feed_url($url);
$feed->set_cache_class('WP_Feed_Cache');
$feed->set_file_class('WP_SimplePie_File');
$feed->set_cache_duration(apply_filters('wp_feed_cache_transient_lifetime', 43200, $url));
do_action_ref_array( 'wp_feed_options', array( &$feed, $url ) );
$feed->init();
$feed->handle_content_type();
if ( $feed->error() )
return new WP_Error('simplepie-error', $feed->error());
return $feed;
}
Comme vous pouvez le constater, fetch_feed()
peut renvoyer un objet WP_Error. Vérifiez donc juste en dessous de l'appel à cette fonction:
$rss = fetch_feed('' . $instance["feed_address"] . '');
if ( is_wp_error( $rss ) )
{
// do something awesome
}
else
{
// print your feed items
// $maxitems = …
}