Altering Feeds

Overview #

You may want to provide a custom RSS feed, or alter the content of an existing feed. The following examples show how easily this can be done by using some filters and actions.

↑ Top ↑

Custom Feeds #

To add new feeds to your site, use WordPress’s add_feed() function. It will handle a majority of the under-hood magic for you.

↑ Top ↑

Altering Existing Feeds #

/**
 * Example on how to implement custom feeds without code duplication
 * In this example a secondary feed that will return all posts of the last two weeks
 * with stripped out images will be implemented.
 * to access the feed use /feed/?show_custom_feed=two_weeks
 */

/**
 * Add custom variable 'my_show_custom_feed' which we will use to identify our feed.
 */
function my_add_custom_feed_var( $query_vars ) {
	$query_vars[] = 'my_show_custom_feed';
	return $query_vars;
}
add_action( 'query_vars', 'my_add_custom_feed_var' );

/**
 * Recognize feed and parameters and initialie actions accordingly.
 */
function my_change_custom_feed( $query ) {
	if ( $query->is_feed() && 'two_weeks' == $query->get( 'my_show_custom_feed' ) ) {
		// this filter is used to alter the where statement for the feed
		add_filter( 'posts_where', 'my_filter_last_two_weeks' );

		// the following two filters allow altering the content. in our example filtering images
		add_filter( 'the_content_feed', 'my_alter_feed_content' );
		add_filter( 'the_excerpt_rss', 'my_alter_feed_content' );

		// it would be also possible to alter the query directly via $query->set()
		// $query->set( 'cat', '123' ); // display only posts with category id 123
	}
	return $query;
}
add_filter( 'pre_get_posts', 'my_change_custom_feed' );

/**
 * Alter where query to limit posts to the last 14 days
 */
function my_filter_last_two_weeks( $where = '' ) {
	global $wpdb;
	$where .= $wpdb->prepare( " AND $wpdb->posts.post_date > %s", date( 'Y-m-d', strtotime( '-14 days' ) ) );
	return $where;
}

/**
 * Filter img tags from content and excerpt.
 */
function my_alter_feed_content( $content ) {
	$content = preg_replace( '#(<[/]?img.*>)#miU', '', $content );
	return $content;
}

↑ Top ↑

Modifying Images within Feeds #

Serve up larger sized images as part of the Media RSS component.

function my_remove_size_args_from_feed_featured_image( $medias ) {
	foreach ( $medias as $key => $media ) {
		// Skip items without a thumbnail, i.e. Gravatars and such
		if ( empty( $media['thumbnail'] ) )
			continue;

		// Make sure we have the required data
		if ( empty( $media['content'] ) || empty( $media['content']['attr'] ) || empty( $media['content']['attr']['url'] ) )
			continue;

		// Replace thumbnail URL with fullsize URL
		$image = wp_get_attachment_image_src( get_post_thumbnail_id(), 'full' );
		$medias[$key]['content']['attr']['url'] = $image[0];
	}

	return $medias;
}
add_filter( 'mrss_media', 'my_remove_size_args_from_feed_featured_image', 15 );

↑ Top ↑

Remove Author Gravatar Images from Feeds #

If you don’t want to have author Gravatar images appear in your feeds, you can use this filter:

/**
* Remove avatar references from RSS feed
*/
add_filter( 'mrss_avatar_user', '__return_false' );

Ready to get started?

Tell us about your needs

Let us lead the way. We’ll help you select a top tier development partner. We’ll train your developers, operations, infrastructure, and editorial teams. We’ll coarchitect your deployment processes. We will provide live support for peak events. We’ll help your people avoid dark alleys and blind corners, and reduce wasted cycles.