你是否有想过对RSS feed做些改善? 比如让它显示更多(或更少)内容?或者在文章的结尾添加一些其他具体信息。这篇文章将告诉你如何实现对RSS Feed的掌控,包括以下内容:
- 如何把文章和页面都输入RSS feed。
- 如何在feed中添加缩略图。
- 如何排除某个标签的文章。
- 设置feed显示的文章数量。
- 如何只显示某个分类的文章。
- 如何在每篇文章结尾添加内容(如,链接到你的最近精华文章)。
所有这一切都只需要改动主题里的functions.php文件,如果你的主题里没有这个文件,就先创建一个并以此为命名。
将页面也纳入RSS Feed输出的对象
当WordPress搜索posts时,我们给它添加一个过滤器,通过过滤器会检测post是否需要通过RSS feed 输出,如果有需要,那么它就会调整查询来实现:
function feedFilter($query) { if ($query->is_feed) { $query->set('post_type','any'); } return $query; } add_filter('pre_get_posts','feedFilter');
如果你只想显示页面,那么可以将上面的单词 ‘any’ 改成 ‘page’ (或者你创建的其他任何自定义的内容类型)。
可能你还需要更精确点,只显示最顶层的页面。这种情况下,你可以在上面的代码里在添加上一行代码,即:
function feedFilter($query) { if ($query->is_feed) { $query->set('post_type','any'); $query->set('post_parent','0'); } return $query; } add_filter('pre_get_posts','feedFilter');
在RSS Feed中添加缩略图
这次的过程稍微有点不同。虽然都需要给查询添加一个过滤器来检查此页面是否需要输出RSS feed,不过在这里不是对查询进行调整, 而是 the_content 添加了另外的过滤器:
function feedFilter($query) { if ($query->is_feed) { add_filter('the_content', 'feedContentFilter'); } return $query; } add_filter('pre_get_posts','feedFilter'); function feedContentFilter($content) { $thumbId = get_post_thumbnail_id(); if($thumbId) { $img = wp_get_attachment_image_src($thumbId); $image = '<img align="left" src="'. $img[0] .'" alt="" width="'. $img[1] .'" height="'. $img[2] .'" />'; echo $image; } return $content; }
这里使用了稍微有点迂回的方式来获得缩略图,才可以添加align="left" 部分。很多feed阅读器都会将内联CSS去除,不过使用旧的align 属性是没有什么问题的。当然,如果你不想要图片左对齐,可以将 align="left"去掉。
如何排除某个标签的文章在RSS feed中输出
在这里是使用‘set’来调整查询对象。首先需要知道该标签的ID号,登录后台进入文章 > 文章标签,然后找出你需要排除的标签,并点击。在浏览器地址栏里你就可以看到URL地址有一部分看起来像这样:&tag_ID=29
假设该标签的ID号是29,那么通过下面的代码就可以将这个ID的标签排除在外了。
function feedFilter($query) { if ($query->is_feed) { $query->set('posts_per_page','20'); } return $query; } add_filter('pre_get_posts','feedFilter');
只显示某个分类的文章
大多数普通博客是不会这样做的, 但是如果你把WordPress当作一个内容管理系统来使用的话,可能你就会希望RSS feed只发布来自“博客”类别的文章,在这种情况下,你可以使用下面的代码:
function feedFilter($query) { if ($query->is_feed) { $query->set('category_name', 'blog'); } return $query; } add_filter('pre_get_posts','feedFilter');
或者说你可以通过分类的ID号来排除,假设把第三行的代码换成:
$query->set('cat', '-45');
45是指类别的ID号(注意,前面必须加上一个减号,否则结果就恰恰相反,变成只显示分类ID号为45的文章。)
在所有RSS内容的结尾添加内容
可能出于很多原因,你会想在RSS内容结尾添加一些其他内容。
首先从最简单的开始,假设我们需要添加下面的内容:
"感谢您的阅读,欢迎访问WordPress啦了解更多的WordPress资讯!"
function feedFilter($query) { if ($query->is_feed) { add_filter('the_content','feedContentFilter'); } return $query; } add_filter('pre_get_posts','feedFilter'); function feedContentFilter($content) { $content .= '<p>感谢您的阅读,欢迎访问<a href="'. get_bloginfo('url地址') .'">'. get_bloginfo('博客名称') .'</a> 了解更多的WordPress资讯!</p>'; return $content; }
下面来看一下稍微酷一点的招式,假设在主页有一个特色内容滑块或者在侧边栏有一个精华文章,并且已经将哪里的文章内容标签为“featured(精华)”
你想在RSS feed中,添加如下的内容:
"请不要错过我们最新的精选文章:文章标题"
这次在feedContentFIlter函数里运行查询来获取被标记为“featured(精华)”的文章,然后使用内容对象来返回并插入文章标题和地址。
function feedFilter($query) { if ($query->is_feed) { add_filter('the_content','feedContentFilter'); } return $query; } add_filter('pre_get_posts','feedFilter'); function feedContentFilter($content) { $args = array( 'numberposts' => 1, 'tag' => 'featured' ); $posts = get_posts($args); if($posts) { foreach($posts as $post) { $content .= '<p>请不要错过我们最新的精选文章: <a href="'. get_permalink($post->ID) .'">'. $post->post_title .'</a>!</p>'; } } return $content; }
分类:新闻资讯