I’m trying to make Yoast’s Custom RSS feeds post display in an add_feed function.
Just putting Yoast’s snippet inside add_feed results in:
ERROR: feedname is not a valid feed template.
I have tried two rewrite functions, but to no avail. What could I be missing?
Yoast’s function untouched:
<?php
/*
Template Name: Custom Feed
*/
$numposts = 5;
function yoast_rss_date( $timestamp = null ) {
$timestamp = ($timestamp==null) ? time() : $timestamp;
echo date(DATE_RSS, $timestamp);
}
function yoast_rss_text_limit($string, $length, $replacer = '...') {
$string = strip_tags($string);
if(strlen($string) > $length)
return (preg_match('/^(.*)W.*$/', substr($string, 0, $length+1), $matches) ? $matches[1] : substr($string, 0, $length)) . $replacer;
return $string;
}
$posts = query_posts('showposts='.$numposts);
$lastpost = $numposts - 1;
header("Content-Type: application/rss+xml; charset=UTF-8");
echo '<?xml version="1.0"?>';
?><rss version="2.0">
<channel>
<title>Yoast E-mail Update</title>
<link><a class="linkclass" href="http://yoast.com/">http://yoast.com/</a></link>
<description>The latest blog posts from Yoast.com.</description>
<language>en-us</language>
<pubDate><?php yoast_rss_date( strtotime($ps[$lastpost]->post_date_gmt) ); ?></pubDate>
<lastBuildDate><?php yoast_rss_date( strtotime($ps[$lastpost]->post_date_gmt) ); ?></lastBuildDate>
<managingEditor><a class="linkclass" href="mailto:joost@yoast.com">joost@yoast.com</a></managingEditor>
<?php foreach ($posts as $post) { ?>
<item>
<title><?php echo get_the_title($post->ID); ?></title>
<link><?php echo get_permalink($post->ID); ?></link>
<description><?php echo '<![CDATA['.yoast_rss_text_limit($post->post_content, 500).'<br/><br/>Keep on reading: <a href="'.get_permalink($post->ID).'">'.get_the_title($post->ID).'</a>'.']]>'; ?></description>
<pubDate><?php yoast_rss_date( strtotime($post->post_date_gmt) ); ?></pubDate>
<guid><?php echo get_permalink($post->ID); ?></guid>
</item>
<?php } ?>
</channel>
</rss>
function myPlugin_add_feed( ) {
global $wp_rewrite;
add_feed('feedname', 'my_feed');
add_action('generate_rewrite_rules', 'myPlugin_rewrite_rules');
$wp_rewrite->flush_rules();
}
add_action('init', 'myPlugin_add_feed');
and function two:
function custom_feed_rewrite($wp_rewrite) {
$feed_rules = array(
'feed/(.+)' => 'index.php?feed=' . $wp_rewrite->preg_index(1),
'(.+).xml' => 'index.php?feed='. $wp_rewrite->preg_index(1)
);
$wp_rewrite->rules = $feed_rules + $wp_rewrite->rules;
}
add_filter('generate_rewrite_rules', 'custom_feed_rewrite');
You have
add_feed('feedname', 'my_feed');
but no my_feed function to actually generate the feed output.Create a my_feed function and have it call the template to generate the feed output. Like this:
Then regenerate your permalinks, one time only, by resaving the permalink settings.
Also, you don’t need any of that extra rewrite nonsense at all. Just the add_feed is enough. WP handles the rest, and your feed will be at /feed/feedname.
First, correct way is to use
add_feed()
, but you should not touch rewrite.add_feed()
handles that by itself.Second, you didn’t provide your callback
my_feed()
function? I am not sure but from that error message I think it fails to get hooked properly.