chaihongjun.me

thinkphp博客添加RSS源

好久没有更新博客,最近在看某大佬网站的适合发现了RSS订阅的按钮,突然想起来这个东西也好几十年了,给自己的网站也弄一个吧。在弄之前大概的看了一下RSS的发展历史,结合了AI的能力捣鼓出本站的RSS源,后续再完善邮件订阅的功能。

首先是创建对应的RSS控制器,这个控制器负责将最近N条新的文章以XML的格式,并且符合RSS的标准。(这里是发布5条)

thinkphp博客添加RSS源

//RSS控制器
<?php
namespace app\index\controller;

use think\Controller;
use app\common\model\Article; // 引入模型
use app\common\helper\UrlHelper;

class Rss extends Controller
{
  public function index(Request $request)
  {

    // 设置内容类型为 XML
    header("Content-Type: application/rss+xml; charset=UTF-8");

    // 从数据库获取数据,假设从文章表中获取
    $articles = Article::where('status', 1)->order('publish_time', 'desc')->limit(5)->select();

    // 最新文章发布时间
    $latestArticle = Article::order('publish_time', 'desc')->find();
    $pubDate = $latestArticle->publish_time;

    // 生成 RSS XML
    $rss = '<?xml version="1.0" encoding="UTF-8" ?>' . "\n";
    $rss .= '<rss version="2.0">' . "\n";
    $rss .= '<channel>' . "\n";
    $rss .= '<title>柴宏俊web技术学习笔记</title>' . "\n";
    $rss .= '<link>' . "https://chaihongjun.me/" . '</link>' . "\n"; // 网站链接
    $rss .= '<description>记录chaihongjun学习web技术的个人博客,涉及的技术内容包括前端的javascript,vue,css,html后端的php和mysql数据库,以及一些linux服务器的运维知识</description>' . "\n";
    $rss .= '<language>zh-CN</language>' . "\n";
    $rss .= '<pubDate>' . date(DATE_RSS, strtotime($pubDate)) . '</pubDate>' . "\n";

    foreach ($articles as $article) {
      $rss .= '<item>' . "\n";
      $rss .= '<title>' . htmlspecialchars($article['title']) . '</title>' . "\n";
      $rss .= '<link>' . "https://chaihongjun.me" . UrlHelper::generateArticleUrl($article['id']) . '</link>' . "\n"; // 文章链接
      $rss .= '<description>' . htmlspecialchars($article['introduction']) . '</description>' . "\n"; // 文章摘要
      $rss .= '<category>' . UrlHelper::getCategoryNameByArticleId($article['id']) . '</category>' . "\n"; // 文章分类
      $rss .= '<pubDate>' . date(DATE_RSS, strtotime($article['publish_time'])) . '</pubDate>' . "\n"; // 发布时间
      $rss .= '</item>' . "\n";
    }

    $rss .= '</channel>' . "\n";
    $rss .= '</rss>';

    // 输出 RSS XML
    // echo $rss;
    responseXML($rss, 'xml');
  }

}

然后去路由那里配置一个新的路由:

// RSS
Route::get('rss.xml', 'index/Rss/index');

于是在浏览器中直接访问地址 https://chaihongjun.me/rss.xml 即可,当然为了确保RSS源的正确,可以前往https://www.feedvalidator.org/ 进行验证。至此完成。

说明一下,上述控制器里用到的一些是自定义的函数:

function responseXML($content, $type = 'html')
{
  if ($type === 'xml') {
    header('Content-Type: application/xml; charset=utf-8');
  }
  echo $content;
  exit;
}

  public static function generateArticleUrl($articleId)
  {
    // 使用模型关联查询文章和对应的栏目
    $article = Article::with('category')->find($articleId);

    if ($article && $article->category) {
      // 拼接URL
      $url = '/' . $article->category->name . '/' . $article->id . '.html';
      return $url;
    }

    return null;
  }
  
   public static function generateArticleUrl($articleId)
  {
    // 使用模型关联查询文章和对应的栏目
    $article = Article::with('category')->find($articleId);

    if ($article && $article->category) {
      // 拼接URL
      $url = '/' . $article->category->name . '/' . $article->id . '.html';
      return $url;
    }

    return null;
  }

UrlHelper是一个自定义的公共助手工具类

知识共享许可协议本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。作者:柴宏俊»