Reputation: 12097
I have 2 websites, and I wish to show some posts from one on the other using an RSS feed.
Trouble is, the default seems to be order by publish date, where as I need them ordered by title. I'm using Wordpress, which uses SimplePie (which I believe is pretty common?).
Is there a way to reorder these items before I display them? Thanks.
/**
* $feed = the RSS feed to display (set via CMS option)
* $num_posts = the number of posts to display from the feed (set via CMS option)
*/
$max_items = 0;
if($feed !== '') :
$rss = fetch_feed($feed);
if(!is_wp_error($rss)) :
$max_items = $rss->get_item_quantity($num_posts);
$rss_items = $rss->get_items(0, $max_items);
endif;
endif;
Upvotes: 0
Views: 962
Reputation: 12097
Okey, so I've come up with an answer that seems to work.
require_once(ABSPATH . WPINC . '/class-feed.php');
require_once(ABSPATH . WPINC . '/class-simplepie.php');
class SimplePie_Custom_Sort extends SimplePie{
/**
* @var string How to order the feed
* @access private
*/
var $order_feed_by;
/**
* Sort the items that are to be displayed in an RSS feed
*/
function sort_items($a, $b){
/** Construct the sort function name */
$sort_function = 'sort_items_'.$this->order_feed_by;
/** Check if the sort function exists and call it (call 'parent::sort_items' if not) */
if(method_exists($this, $sort_function)) :
$this->$sort_function($a, $b);
else :
parent::sort_items($a, $b);
endif;
}
/**
* Sort function to sort posts in an RSS feed by title
*/
function sort_items_title($a, $b){
return $b->get_title() <= $a->get_title();
}
}
function fetch_feed_custom($url, $order_by){
$feed = new SimplePie_Custom_Sort();
$feed->order_feed_by = $order_by;
$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());
endif;
return $feed;
}
Upvotes: 1