WordPress实现RSS feed静态化

日期: 标签:WordPress教程
如需帮忙改代码,或者WordPress二次开发、PHP网站建设等需求,可联系我购买付费服务:  点此联系我
文章目录

提示:如果你的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.phpindex.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
露兜
kaapass@outlook.com  QQ 825533758

业余编程爱好者。

5 条留言

点此留言
  1. WordPress头条 WordPress头条

    feed静态化,不错的教程。对于feed访问速度也有帮助吧

  2. 明月登楼 明月登楼

    这个不错,可以有效的减低 WordPress 的性能负载!不错,我试试去!

  3. 闲木鱼 闲木鱼

    为什么我照你的步骤做了还是不行呢?

  4. 云落 云落

    正好看到。。。最近网站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');

  5. Sam.Z Sam.Z

    feed/index.xml 生成了,但是里面的内容是空白,权限问题?如果能生成文件为什么里面又是空白,唉。

发表留言