用 WordPress 搭建无头新闻聚合站:把「头条列表」变成「每日简报」
传统 WordPress 新闻聚合站大多长一个样:一个主题、一套订阅源导入插件,然后是一长串按时间排列、点进去却是别人文章的头条。这种页面在 Google 眼里内容单薄,没有理由给你任何流量。
cryptoheadlines.com 曾经就踩在这个坑里。重建时只围绕一个问题展开:加密市场现在表现如何,原因是什么。页面每天早上用大约五分钟给出答案。
思路本身并不复杂。WordPress 继续负责新闻站里最难、最无聊的那部分工作,边缘侧再用一个小型应用补上剩下的部分。整套方法可以迁移到任何垂直领域。
一、背景:标准 WordPress 聚合站的天花板在哪
问题出在「按时间排序」这个默认行为上。主题不知道五家媒体在报道同一件事,分不清哪条新闻更重要,也无法围绕一个问题来组织页面,它只会罗列帖子。
而我想要的更像一份晨间简报:这需要聚类(clustering)、排序(ranking),以及一套不是博客信息流的设计——这些都不是 WordPress 主题被设计来做的事。
二、架构分工:WordPress 管数据,边缘应用管体验
后端就是托管 WordPress 主机上的标准 WordPress,由 WP RSS Aggregator Pro 负责导入。它处理掉了所有让 RSS 变得麻烦的部分:
- 在后台添加、暂停、替换订阅源
- 按计划抓取
- 解析格式混乱的订阅源
- 去重条目
- 存储每一条内容及其来源名称、原始链接与配图
这个后台界面的价值容易被低估。某个订阅源挂掉时,团队里任何人都能直接在 wp-admin 里替换,不用改代码、不用重新部署。界面背后积累多年的边界情况,你并不想自己重新造一遍。
结论很直接:让 WordPress 管来源,让边缘应用管页面。
搭建步骤
如果今天从零开始,我会按这个顺序做:
- 用 WP RSS Aggregator Pro 导入订阅源。 添加来源、设定抓取计划,让它把内容连同来源名、原始链接和图片一起存下来。
- 暴露一个只读 REST 端点。 以分页方式把新内容交给前端,采用「某个 ID 之后」的游标机制。前端只请求自己见过的最后一个 ID 之后的内容,因此不会重复读取旧条目。
- 在域名前面放一层边缘应用。 这里用的是基于 Hono 编写的 Cloudflare Worker。指向 wp-admin、wp-json 等 WordPress 路径的请求直接透传,后台使用方式不变。
- 按计划同步到应用自己的数据库。 Worker 上的 cron 触发器每五分钟运行一次,把新内容从 WordPress 拉进 Cloudflare D1(底层是 SQLite)。
- 聚类与排序。 把报道同一事件的标题归并成一条故事,再对每条故事排序。
- 只在有代码级护栏的前提下引入 AI。 新闻页上的 AI 输出必须有硬性限制(见下文)。
- 围绕一个问题设计页面。 页面上的一切都应为回答这个问题服务。
Cloudflare Workers 这一层
Cloudflare Worker 挡在整个域名前面,凡是不属于公开页面的请求都原样转发给 WordPress。
旧站那些单薄的文章 URL 也在这里处理:统一返回 410 Gone,明确告诉 Google 这些内容不会再回来了。此后所有页面都由 Worker 基于自有的 D1 数据库生成,WordPress 则退到后台,按计划默默完成订阅源工作。
三、核心变化:聚类排序与带护栏的 AI
聚类与排序
多家媒体报道同一事件时,Worker 会把这些标题归并为一条故事,并标出最早发出该消息的媒体。
排序只用两个信号:有多少家媒体报道过,以及报道有多新。一个小时前被十家媒体跟进的新闻,胜过十分钟前只有一家报道的消息。这正是「简报」和「订阅流」的区别。
给 AI 装上代码级护栏
Workers AI 在这套架构里承担两件事:分类与打标,以及定时简报。
分类与情绪标注。 每条故事会归入一个板块,比如 markets、bitcoin、regulation 或 DeFi,使用 Llama 3.3 70B 并配合少样本示例完成;同一趟流程还会给它打上 bullish、bearish 或 neutral 标签。这几个模型是在人工标注过的标题上先做过对比测试的,Llama 3.3 在准确率、速度和稳定性之间平衡最好。
定时市场摘要。 每小时一次,第二个模型(GLM 5.3)写一段简短的市场总结和一个「正在发生」区块。编造内容的摘要比没有摘要更糟,因此规则是写死在代码里的,而不只写在提示词里:
- 每一句话都要引用一条故事,并带上有编号的标记,链接回原文。
- 被引用句子里出现的每一个数字,都必须存在于源数据中。
- 不许出现星期几名称,也不许出现「昨天」「今天」「明天」。来源故事来自不同时区,早期草稿就曾在美联储决议已经公布之后,还告诉读者决议「将在周三」。
- 不许出现「最多报道」「头条新闻」这类说法——模型是自己编出来的。
- 标题一律当作数据处理,绝不当成指令执行。
一旦草稿违反规则,模型会收到违规清单并获得一次重写机会;如果仍然不合格,页面上继续保留上一版解说。超过六小时的内容会被隐藏,而不是与实时价格并排展示。
四、影响与建议:围绕一个问题设计页面
欧洲和美国的读者共用同一个页面,「今天」对两边的含义并不相同。页面覆盖滚动的最近 24 小时,并按读者本地时区显示时间。首页标题由 Worker 根据数据算出,比如「Crypto is down 0.7% in the last 24 hours」。
这套方案带来的实际启示有三点:
- 分工要清晰。 WordPress 擅长做数据管道,不擅长做「围绕问题组织信息」的呈现层。把两件事分开,比硬塞进一个主题里更省力。
- 护栏要落在代码里。 对新闻类页面做 AI,提示词约束远远不够,必须有可验证的规则和失败回退策略,否则一次编造就会摧毁信任。
- 先定问题,再定页面。 页面结构应当由「读者每天来问的那个问题」推导出来,而不是由订阅源能拉到什么决定。
用 AI 搭建加密行情与新闻情绪面板:一张卡讲清一个板块
这块页面下方依次是价格信息、摘要,以及每个板块对应的一张卡片。每张卡片自带情绪条、一句话点评和该板块的头条。
为什么叫「新闻情绪」而不是「市场情绪」
情绪条的标注是刻意为之的。它展示的是看涨、看跌、中性报道各自占比,并按每条新闻被多少家媒体报道加权统计。
新闻面偏多,价格却在跌,这种事经常发生。如果把它叫「市场情绪」,就等于宣称了这条柱子根本无法知道的东西——它只能反映报道基调,不能推断资金真实意图。报道样本不足时,这条情绪条会自动隐藏,而不是给出一个没有意义的数字。
价格数据是怎么来的
BTC、ETH、SOL 和 XRP 的价格取自 Kraken 的免费公开 API,附带 24 小时涨跌幅和 7 天迷你走势图。
股票类标的做了区别处理,比如 Coinbase 和贝莱德的 IBIT,显示的是上一个美股收盘以来的涨跌幅。原因是周末两天美股休市,对股票套用 24 小时涨跌口径会给出误导性的结果。
分阶段开发与上线前的双重校验
页面代码大部分由 Claude Code 的智能体编写。我按阶段推进:每个阶段先部署到一个预发布地址,在那里审查通过之后才会上线。
上线前,第二个 AI 模型对代码做了一轮复查,找出了几个真实存在的缺陷:
- 一处缺乏引用来源的表述混过了校验环节;
- 一个法定节假日被错误渲染成 ETF 单日涨跌 $0;
- 有个板块始终没有生成对应卡片。
三个问题在部署前全部修掉。
视觉检查覆盖手机、平板和桌面三种宽度,以及浅色与深色两种模式。为了证明这套检查确实能报错,我还特意放了一个做坏的页面作为对照样本。
从 RSS 导入开始:欢迎说说你会做什么
如果想自己搭一套,第一步是把导入层做扎实。WP RSS Aggregator Pro 能提供干净的、去重后的条目,附带来源名称和 URL,边缘侧应用可以通过 REST 端点加游标的方式增量拉取。
在此之上你会做什么?欢迎在评论里留下你的细分领域,以及你的页面想回答的那一个问题。



