[Archives]
在文章或页面正文里写一条短语 [Archives],该位置就渲染出历史上所有文章的年/月归档列表。
每篇文章一行,包含:发布日期 + 标题 + 浏览数 / 评论数 / 点赞数。 (站内数据来源已确认:浏览数 = post meta views;点赞数 = post meta love; 评论数 = get_comments_number()。)
views
love
get_comments_number()
replaceState
wp_get_archives()
post_type=post
现状:comments.php 里有两处输出「评论已关闭。」/「评论已关闭,但你可以阅读上面的讨论。」
comments.php
期望:只要评论关闭,整个评论区域一律不输出 —— 不留空容器、不留任何提示文字。 文章正文结束之后就什么都没有。
comments_open()
display:none
版本号 3.2.46,提交 7047ab3,已推送到 main。 已发到 /theme-update/(update.json 已落 3.2.46), 没有覆盖服务器上的 wp-content/themes/kratos_yang/(仍是 3.2.45)—— 需要在 WP 后台点「升级」才会真正生效,请在升级后实测。
3.2.46
7047ab3
main
/theme-update/
update.json
wp-content/themes/kratos_yang/
已按工单实现。补充说明几处实现上的判断:
1. 关于「下一年」的方向
按工单里的澄清实现了:右侧「下一年」= 往更早的年份去(2026 → 2025 → 2024), 左侧「上一年」= 往回走到更近的年份。文案写的是「上一年 / 下一年」, 不是「上一页 / 下一页」,避免和分页混淆。
2. 四角导航怎么落地的
列表上方一排、下方一排,每排左右各一个按钮,合计四个。 下方那一排是刻意加的:长列表里滚到底部想切年份,不用再爬回顶部。
3. 地址栏同步
切年份时用 replaceState 把地址同步成 ?arc_year=2025。 好处是切完刷新、或者把链接发给别人,看到的还是同一年;浏览器前进后退也能用。 不存在的年份(比如手工改成 ?arc_year=1998)会自动落到最近的可用年份。
?arc_year=2025
?arc_year=1998
4. 只在用到时加载
assets/js/archives.js 与 assets/css/archives.css 只在页面里真的出现 [Archives] 时才 enqueue。没用到的页面一个字节都不多。
assets/js/archives.js
assets/css/archives.css
5. 文章很多时的取舍
整年数据一次随页面下发,切年不再请求服务器,所以来回切是瞬间的。 代价是这一页 HTML 会大一些。站内目前几百篇完全不是问题; 真到几千篇再考虑改成按年按需取(那时改的是数据下发方式,前端逻辑不用动)。
已实现,且做得比"不显示文字"更彻底:
if (!comments_open()) return;
comments.css
comments.js
⚠️ 一个提醒:如果以后某篇文章想"保留历史评论展示、但不接受新评论", 那就不要关评论,改成在 WP 后台单独关闭评论提交。当前实现是按"关了就全消失"做的。
这三个都是测试把期望值写对之后才显形的,记在这里备查:
① 年份被加了千分位(最隐蔽的一个)
年份标题与导航年份都过了 number_format_i18n(),它把 2025 输出成 「2,025」。 要命的是 PHP 首屏和 JS 切年后走两条不同路径输出同一个年份 —— 只改一边就会出现"首屏 2,025、点一下变 2025"。现在两边都用纯数字,口径统一。
number_format_i18n()
② 月份标题也有同样问题
月份同样过了 number_format_i18n()。目前 1~12 输出正常,但只要站点语言 或格式设置一变就会和 JS 侧 String(m) 不一致。一并改成纯数字。
String(m)
③ 下排导航被叫成 top
yang_archives_render_nav() 把 ar-nav-top 类名写死在函数里, 而下排也调这个函数生成 ⇒ 下排同时带上了 ar-nav-top。 视觉上被更高特异性的 .ar-foot .ar-nav 规则压住了,所以看不出任何问题 —— 只有断言在数精确类名时才暴露。已改成由调用方传 top / bottom。
yang_archives_render_nav()
ar-nav-top
.ar-foot .ar-nav
top
bottom
归档 _archives_unit.php 94 通过 / 0 失败 _archives_e2e.js 109 通过 / 0 失败 _archives_e2e_falsify.js 反证 25 真红 / 0 无效 _archives_unit_falsify.py 反证 6 真红 / 0 无效 评论 _comments_closed_test.php 54 通过 / 0 失败 _comments_closed_falsify.py 反证 13 真红 / 0 无效 回归 _test_comments.php 64 通过 / 0 失败 _hl_unit_run.py 24 通过 / 0 失败 全量 96 个 PHP 文件语法检查通过;包内 lint 通过 发布 包结构 / 版本号 / readme(37 个历史版本未截断)/ 下载 md5 全部核对通过
其中端到端测试是在 jsdom 里真跑 archives.js,把 PHP 首屏与 JS 切年后 两条路径在三个年份上逐项比对(class 映射 / 标题 / 日期序列 / 零值标记 / 计数 / 导航结构 / 导航文案 / 年份标题),任何一项不一致都会红。
archives.js
每条判据都做了反向注入,证明它真的会因为缺陷而报红 —— "断言全绿"本身不算证据。13 + 25 + 6 条注入全部真红,且都红在预期的那条判据上 (红了但不是预期那条也记为无效)。
有一条如实记为无法反证:归档脚本的幂等守卫(data-ar-ready)。 试了三种注入手法都削不红,根因是 jsdom 里两次 eval 会产生两份独立闭包, 各持独立 data 对象,黑盒观察不到"一次点击切两年"这个后果。 已写进测试注释里,没有假装它被覆盖。
data-ar-ready
data
?arc_year=
有问题先别关单,直接在这里回帖。确认无误后我再关。
上一轮评论和我提交的 Git 信息里写的是「_archives_e2e_falsify.js 反证 25 真红」。 这个数字是错的,刚才复核时发现并已修正为 21。
_archives_e2e_falsify.js
原因不是少跑了用例,而是统计口径把三种不同性质的东西混进了一个计数器:
ok()
汇总行直接打印 revOk,于是报出 24;文档里又写成了 25。 真实注入是 21 条,另外 3 条根本不是反证。
revOk
已经改的成分开的两个计数器,现在输出是这样:
反证:注入真红 21 条,无效 0 条 (另有基线 1 条 + 收尾自检 2 条,合计 OK 24 条)
这样任何人一眼能对上账。同时把散落在提交信息、上一轮评论、记忆里的旧数字都改了。
为什么值得单独说:这个数字不参与任何判断,脚本一直是绿的、退出码 0、 无效 0 条 —— 所有指标都正常,流水线永远抓不到它,只能靠人对着构成去数。 它和"测试报告里写着 137 个用例、实际只跑了 127 个"是同一类问题, 只是一次是多算、一次是少算。已记进踩坑清单。
无效 0 条
产品代码没有因此改动任何一个字节(已核验:提交 7047ab3 的工作区干净)。
2j 评论关闭零输出(_comments_closed_test.php) 通过 54 / 0 失败 2k 评论关闭反向验证(_comments_closed_falsify.py) 真红 13 / 0 无效 2l 归档单测(_archives_unit.php) 通过 94 / 0 失败 2m 归档端到端(_archives_e2e.js) 通过 109 / 0 失败 2n 归档端到端反向(_archives_e2e_falsify.js) 真红 21 / 0 无效 2o 归档源码级反向(_archives_unit_falsify.py) 真红 6 / 0 无效 -------------------------------------------------------------- 失败套件数:0
kratos_yang.zip
style.css
inc/theme-archives.php
inc/theme-comments.php
readme.html
需求一 [Archives]
[Archives year="2025"]
[Archives month="0"]
需求二 评论关闭
第 3 步建议顺手做一下:确认我没有把"允许评论"的正常路径一起弄坏。
有问题直接在本工单回复,我改完再关。
你在 /blogtime 实测发现 [Archives] 没反应,查下来是我这边的 bug(已在 #17 修,3.2.47 已发布):
/blogtime
3.2.46 只注册了小写 archives,而 WordPress 短代码标签区分大小写, 所以只有 [archives] 能用、[Archives] 原样输出。跟 markdown 插件无关,数据库里的内容是干净的。
archives
[archives]
3.2.47 已改为同时注册 archives / Archives / ARCHIVES 三种写法。
Archives
ARCHIVES
⇒ 需求一的验收请以 3.2.47 为准(后台点升级后,/blogtime 不用改内容就应该自己渲染出来)。
需求二(评论关闭整块不显示)不受影响,3.2.46 就是对的。
按用户确认收尾,交付见上条发布评论。
交付版本:3.2.46(归档短代码 [Archives] + 评论关闭整块零输出),后续 #17 补了大小写问题
用户已验收,关闭本单。
No dependencies set.
The note is not visible to the blocked user.
需求一:
[Archives]短代码 —— 归档式全站文章列表在文章或页面正文里写一条短语
[Archives],该位置就渲染出历史上所有文章的年/月归档列表。1. 初始展示
2. 列表条目
每篇文章一行,包含:发布日期 + 标题 + 浏览数 / 评论数 / 点赞数。
(站内数据来源已确认:浏览数 = post meta
views;点赞数 = post metalove;评论数 =
get_comments_number()。)3. 年份导航(四角「上一页 / 下一页」)
点右侧「下一年」→ 从今年切到上一年(2026 → 2025),再点 → 2024 …
点左侧「上一年」→ 反向回到更近的年份。
文案就写「上一年 / 下一年」,行为与文案一致(不写 上一页/下一页,避免与分页混淆)。
replaceState可选同步)。4. 实现约束
[Archives](大小写不敏感,与 WP 一致)。JS 切换只做 DOM 重建,不发起 AJAX 请求(避免每次切年打一次站)。
wp_get_archives():它按post_type=post且格式固定,拿不到计数,也不便于按年切片给 JS。
需求二:评论关闭时整块不显示
现状:
comments.php里有两处输出「评论已关闭。」/「评论已关闭,但你可以阅读上面的讨论。」期望:只要评论关闭,整个评论区域一律不输出 —— 不留空容器、不留任何提示文字。
文章正文结束之后就什么都没有。
comments_open()为假时,comments.php输出的 HTML 一个字节都没有(不是
display:none,是要真的不渲染)。3.2.46 已开发完成并发布(等待实测确认)
版本号
3.2.46,提交7047ab3,已推送到main。已发到
/theme-update/(update.json已落 3.2.46),没有覆盖服务器上的
wp-content/themes/kratos_yang/(仍是 3.2.45)——需要在 WP 后台点「升级」才会真正生效,请在升级后实测。
需求一:
[Archives]归档短代码已按工单实现。补充说明几处实现上的判断:
1. 关于「下一年」的方向
按工单里的澄清实现了:右侧「下一年」= 往更早的年份去(2026 → 2025 → 2024),
左侧「上一年」= 往回走到更近的年份。文案写的是「上一年 / 下一年」,
不是「上一页 / 下一页」,避免和分页混淆。
2. 四角导航怎么落地的
列表上方一排、下方一排,每排左右各一个按钮,合计四个。
下方那一排是刻意加的:长列表里滚到底部想切年份,不用再爬回顶部。
3. 地址栏同步
切年份时用
replaceState把地址同步成?arc_year=2025。好处是切完刷新、或者把链接发给别人,看到的还是同一年;浏览器前进后退也能用。
不存在的年份(比如手工改成
?arc_year=1998)会自动落到最近的可用年份。4. 只在用到时加载
assets/js/archives.js与assets/css/archives.css只在页面里真的出现[Archives]时才 enqueue。没用到的页面一个字节都不多。5. 文章很多时的取舍
整年数据一次随页面下发,切年不再请求服务器,所以来回切是瞬间的。
代价是这一页 HTML 会大一些。站内目前几百篇完全不是问题;
真到几千篇再考虑改成按年按需取(那时改的是数据下发方式,前端逻辑不用动)。
需求二:评论关闭时整块消失
已实现,且做得比"不显示文字"更彻底:
comments.php在任何输出之前if (!comments_open()) return;—— 零字节。不是空容器、不是
display:none、不是留白盒子。comments.css/comments.js——既然 DOM 里什么都没有,这两份永远用不到。
⚠️ 一个提醒:如果以后某篇文章想"保留历史评论展示、但不接受新评论",
那就不要关评论,改成在 WP 后台单独关闭评论提交。当前实现是按"关了就全消失"做的。
开发中抓到并修掉的 3 个真实 bug
这三个都是测试把期望值写对之后才显形的,记在这里备查:
① 年份被加了千分位(最隐蔽的一个)
年份标题与导航年份都过了
number_format_i18n(),它把 2025 输出成 「2,025」。要命的是 PHP 首屏和 JS 切年后走两条不同路径输出同一个年份 ——
只改一边就会出现"首屏 2,025、点一下变 2025"。现在两边都用纯数字,口径统一。
② 月份标题也有同样问题
月份同样过了
number_format_i18n()。目前 1~12 输出正常,但只要站点语言或格式设置一变就会和 JS 侧
String(m)不一致。一并改成纯数字。③ 下排导航被叫成 top
yang_archives_render_nav()把ar-nav-top类名写死在函数里,而下排也调这个函数生成 ⇒ 下排同时带上了
ar-nav-top。视觉上被更高特异性的
.ar-foot .ar-nav规则压住了,所以看不出任何问题 ——只有断言在数精确类名时才暴露。已改成由调用方传
top/bottom。验证结果
其中端到端测试是在 jsdom 里真跑
archives.js,把 PHP 首屏与 JS 切年后两条路径在三个年份上逐项比对(class 映射 / 标题 / 日期序列 / 零值标记 /
计数 / 导航结构 / 导航文案 / 年份标题),任何一项不一致都会红。
关于反证
每条判据都做了反向注入,证明它真的会因为缺陷而报红 ——
"断言全绿"本身不算证据。13 + 25 + 6 条注入全部真红,且都红在预期的那条判据上
(红了但不是预期那条也记为无效)。
有一条如实记为无法反证:归档脚本的幂等守卫(
data-ar-ready)。试了三种注入手法都削不红,根因是 jsdom 里两次 eval 会产生两份独立闭包,
各持独立
data对象,黑盒观察不到"一次点击切两年"这个后果。已写进测试注释里,没有假装它被覆盖。
请在后台升级后帮我确认这几点
[Archives],发表后打开 —— 应该看到今年的按月归档。?arc_year=生效)。有问题先别关单,直接在这里回帖。确认无误后我再关。
交付状态确认 + 一处数字口径修正
一、先修正我上一轮评论里的一个数字(3.2.46 的反证条数)
上一轮评论和我提交的 Git 信息里写的是「
_archives_e2e_falsify.js反证 25 真红」。这个数字是错的,刚才复核时发现并已修正为 21。
原因不是少跑了用例,而是统计口径把三种不同性质的东西混进了一个计数器:
ok()调用处汇总行直接打印
revOk,于是报出 24;文档里又写成了 25。真实注入是 21 条,另外 3 条根本不是反证。
已经改的成分开的两个计数器,现在输出是这样:
这样任何人一眼能对上账。同时把散落在提交信息、上一轮评论、记忆里的旧数字都改了。
为什么值得单独说:这个数字不参与任何判断,脚本一直是绿的、退出码 0、
无效 0 条—— 所有指标都正常,流水线永远抓不到它,只能靠人对着构成去数。它和"测试报告里写着 137 个用例、实际只跑了 127 个"是同一类问题,
只是一次是多算、一次是少算。已记进踩坑清单。
二、六套件终验(刚重跑)
三、发布物核验(刚重新下载比对)
update.json里的 version3.2.46kratos_yang.zipstyle.css的 Version3.2.46inc/theme-archives.php、assets/js/archives.js、assets/css/archives.css、comments.php、inc/theme-comments.php、style.css)readme.htmlwp-content/themes/kratos_yang/inc/theme-archives.php/assets/js/archives.js均不存在(符合预期)四、请你在后台点升级后这样验(工单先不关)
需求一
[Archives][Archives],保存。地址栏同步成
?arc_year=2025;[Archives year="2025"]指定首次打开显示哪年;[Archives month="0"]不按月分组。需求二 评论关闭
也没有历史评论列表(这是你要的"正文之外全部结束")。
有问题直接在本工单回复,我改完再关。
补充:需求一的
[Archives]在 3.2.46 里其实只有全小写能用你在
/blogtime实测发现[Archives]没反应,查下来是我这边的 bug(已在 #17 修,3.2.47 已发布):3.2.46 只注册了小写
archives,而 WordPress 短代码标签区分大小写,所以只有
[archives]能用、[Archives]原样输出。跟 markdown 插件无关,数据库里的内容是干净的。3.2.47 已改为同时注册
archives/Archives/ARCHIVES三种写法。⇒ 需求一的验收请以 3.2.47 为准(后台点升级后,
/blogtime不用改内容就应该自己渲染出来)。需求二(评论关闭整块不显示)不受影响,3.2.46 就是对的。
按用户确认收尾,交付见上条发布评论。
交付版本:3.2.46(归档短代码 [Archives] + 评论关闭整块零输出),后续 #17 补了大小写问题
用户已验收,关闭本单。