最近 Kevin's Space 被我折腾的挺凶,已经逐步从轻量级个人博客慢慢变化成综合性网站了。当然啦,网站内容方向和之前的并没有变化,只是数量上可能更多更细了,且难免会有一些转载的或者大多数博友不那么感兴趣的内容。因此我需要在 RSS 中进行一定程度的屏蔽,可能会是整个目录,亦有可能是某些特定文章。
同时呢,还有一些我认为有价值的文章我会反复更新,我可能也会去再次推送 RSS 给订阅者。以下是我对这些操作的简单记录,您各位老鸟做个参考。
1. 在 WordPress RSS 中排除特定分类文章
因为考虑到 Kevin's 有不少 RSS 订阅者,但同时呢我这又要更新不少订阅用户不喜欢看的内容,所以要在 WordPress 的 RSS 中隐藏特定分类的发布。如此便需要对 functions.php
文件进行一些修改以筛选 RSS 的输出内容。这是一个基本的步骤描述:
- 打开您的 WordPress 主题文件夹,找到并编辑
functions.php
文件。 - 选择一个对应的隐藏分类的 id。
- 在
functions.php
文件中,加入以下的 PHP 代码:
function myFilter($query) {
if ($query->is_feed) {
$query->set('cat','-5'); // 这里的 -5 应当替换为您想隐藏的分类 ID 的负值
}
return $query;
}
add_filter('pre_get_posts','myFilter');
这段代码会检查是否在生成 RSS 内容,如果是,它将从结果中排除指定的分类。
- 保存文件,并上传至服务器。
现在,当 RSS 被生成时,特定的分类将被排除。这里需要注意,被排除的分类其 'id' 前是负号,5 是指你希望隐藏的分类的 ID,该分类 ID 通过点击“编辑分类”在浏览器左下角看。
切记,在任何时候编辑代码,都应该备份您的 functions.php
文件,以防止误操作导致的网站无法访问。
2. WordPress 特定文章发布时不推送到 RSS
我是通过增加一个自定义字段,同时绑定了一个小函数来实现的。同样的,首先将以下代码加入到主题的functions.php
中,然后在编辑文章时增加一个自定义字段,如下图:
// 添加 exclude_from_rss 字段从 RSS 中排除特定文章
function exclude_posts_from_rss($query) {
if ($query->is_feed && !is_admin()) {
$meta_query = array( // 存在本字段则排除
array(
'key' => 'exclude_from_rss',
'compare' => 'NOT EXISTS'
)
);
$query->set('meta_query', $meta_query);
}
}
add_action('pre_get_posts', 'exclude_posts_from_rss');
3. 特定旧文章更新时再次推送到 RSS
如何特定旧文章更新时强制推送到 RSS?除了修改文章日期、安装相关插件如 RSS Includes Pages、Republish Old Posts 以外,咱们仍然通过增加一段小的代码实现。同样是编辑functions.php
文件,添加如下代码:
function force_rss_update_on_publish($post_id) {
// 检查文章是否被更新
if (get_post_type($post_id) != 'post') {
return;
}
// 获取文章对象
$post = get_post($post_id);
// 检查是否是你需要推送到 RSS 的特定旧文章
if (in_array($post->ID, array(123, 456, 789))) { // 替换为特定文章的 ID
// 更新文章的发布日期(强制推送到 RSS)
$current_time = current_time('mysql');
wp_update_post(array(
'ID' => $post_id,
'post_date' => $current_time,
'post_date_gmt' => get_gmt_from_date($current_time)
));
}
}
add_action('save_post', 'force_rss_update_on_publish');
文章的 ID 可以通过查看文章的 URL 来获得。例如,编辑文章时,URL 可能类似于 wp-admin/post.php?post=123&action=edit
,其中 123
就是文章 ID。该方法仅会更新选定的文章,而不会影响所有文章的发布时间。
这个思路很好。不过我不想让人看到的文章,直接不展示。