WordPress实现RSS feed静态化
提示:如果你的feed订阅地址不是http://域名/feed
这样的格式,以下内容就不要看了。
WordPress的feed地址一般如: https://www.ludou.org/feed
。开启feed功能后可以方便RSS阅读器进行订阅,让读者及时收到博客的更新信息,但是开放feed后有个坏处就是,RSS订阅器会定时或不定时的地访问你的feed订阅地址,以便查看你的feed是否更新,除了RSS阅读器会经常访问你的feed,各路文章采集器和蜘蛛也会经常来光顾你的feed,而且你还不能限制他们的访问频率。
因为WordPress提供的feed是动态生成的,虽然有cache功能,但毕竟要运行php代码,feed被频繁访问势必会消耗一定的服务器资源。那我们今天就来讲讲如何实现feed静态化,直接生成一个index.xml
文件,放到WordPress根目录下的feed目录,以后访问 http://网站首页/feed
即可直接读取静态的index.xml
,无需WordPress动态生成。
1、禁用默认的feed
众所周知,feed的地址一旦确定下来,如果随便更改,之前已经订阅过的读者可能不会再收到文章更新的通知,势必会流失很多老读者,所以要实现feed的静态化,前提应该是不更改原先的feed订阅地址,但是原先的feed是与WordPress的rewrite规则绑定的,直接在feed目录下放置xml文件,势必会引起冲突。
我的上篇文章已经讲了如何彻底移除并关闭WordPress的feed功能,你以为我是故意教你关闭feed功能,闭关锁国,封闭博客与外界的交流吗?这么想你就错了,上篇文章就是为了今天这篇文章准备的。
所以,第一步就是先按照上篇文章:如何彻底移除并关闭WordPress的Rss Feed,禁用WordPress默认的feed。这一步操作完成后,效果就是打开 http://网站首页/feed
,会显示404页面不存在,
当然,如果直接在网站根目录下创建目录,然后放入index.xml也是可以的。
2、生成静态feed
如何生成静态feed呢?这里直接用WordPress自带的wp-includes/feed-rss2.php
,我对其做了一些修改:
下载后解压,得到myrss.php,可以改名后将其上传到WordPress根目录,跟wp-load.php同在一个目录即可。
3、自动更新静态feed
静态之所以为静态,就是如果你不改它,它的内容永远都是不变的,不像php文件那样会关联更新。我们希望每次发布文章或页面后,自动更新静态feed,达到静态feed的内容和网站内容同步的效果。我们可以将以下PHP代码放到当前主题的functions.php中:
function ludou_update_feed($post_ID) {
if( wp_is_post_revision( $post_ID ) )
return;
if ( get_post_status( $post_ID ) == 'publish' && $_POST['original_post_status'] != 'publish' ) {
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(__FILE__) . '/');
// 如果你修改过 myrss.php 的文件名称,也要修改下面的 myrss.php
$file_contents = file_get_contents(get_bloginfo( 'wpurl' ).'/myrss.php');
file_put_contents(ABSPATH."feed/index.xml", $file_contents, LOCK_EX);
}
}
add_action('publish_post', 'ludou_update_feed', 16);
add_action('publish_page', 'ludou_update_feed', 16);
注意:PHP代码应该放到 <?php
和 ?>
之间或 <?php
后面!
到了这一步,操作基本算完成了,在浏览器中打开你的feed地址http://你的网站首页/feed
,看看是否可以看到xml代码?不懂的可以看看我的 https://www.ludou.org/feed/
如果xml代码显示正常,那所有操作就完成了。如果打开feed地址依然是404页面未找到或者是文件列表,那么你需要继续看第4步的操作。
4、设置index.xml为默认首页
有些服务器可能只设置了index.php
、index.html
为默认首页,这样的话,如果你的feed目录下没有这两个文件的其中之一,只有index.xml
,那么直接访问http://你的网站首页/feed
就会出现404。解决方法是将index.xml
加入到默认首页中。
nginx服务器的设置方法
第1步:打开网站配置文件nginx.conf
(也可能在vhost目录下,具体咨询服务器管理员)
第2步:搜索index
,找到类似代码:index index.html index.php;
,在分号前加上index.xml
,类似:
listen 80;
server_name ludou.org www.ludou.org;
index index.html index.php index.xml;
root /wp;
第3步:重启nginx服务即可生效。
Apache服务器
编辑网站根目录下的.htaccess
(没有就新建一个),查找:DirectoryIndex
,看是否能找到类似代码:
DirectoryIndex index.html index.php
如有,就在后面加上index.xml,如:
DirectoryIndex index.html index.php index.xml
如果找不到DirectoryIndex
,那就在.htaccess
中加入上面的代码,然后将.htaccess
上传到网站根目录下即可。
-- 完 --
本文采用 「CC BY-NC-SA 4.0」创作共享协议,转载请标注以下信息:
原文出处:露兜即刻 https://www.ludou.org/wordpress-feed-static.html
feed静态化,不错的教程。对于feed访问速度也有帮助吧
这个不错,可以有效的减低 WordPress 的性能负载!不错,我试试去!
为什么我照你的步骤做了还是不行呢?
正好看到。。。最近网站RRS突然全文输出了。。。。
ps另外还可以推迟输出
// 推迟RSS更新
function publish_later_on_feed($where) {
global $wpdb;
if (is_feed()) {
$now = gmdate('Y-m-d H:i:s');
$wait = '5'; //时间
$device = 'MINUTE'; // MINUTE, HOUR, DAY, WEEK, MONTH, YEAR
$where .= " AND TIMESTAMPDIFF($device, $wpdb->posts.post_date_gmt, '$now') > $wait ";
}
return $where;
}
add_filter('posts_where', 'publish_later_on_feed');
feed/index.xml 生成了,但是里面的内容是空白,权限问题?如果能生成文件为什么里面又是空白,唉。