laoyang 4c1d67b86b 3.2.54 主题接管「文章分类」挂件:父子折叠树替代核心下拉框(#24)
原来侧栏那个分类挂件是 WP 核心的 WP_Widget_Categories,实例配置
dropdown=1,输出的是 <select> 下拉框。主题 CSS 里那套
`.widget_categories ul li` 只匹配 ul li,下拉框里没有 ul
⇒ 写了但一条都没生效。不是"没写样式",是样式和渲染形态对不上。

做法:沿用核心的 id_base `categories` 直接顶替(不是新建独立挂件)。
- option 名不变,_register_widgets() 照旧认领存量实例 categories-3
- 用户升级后什么都不用做:就地变新样式、位置不变、标题沿用
- 代价:update() 需容忍核心的 dropdown/hierarchical 老字段
  (不读也不显式删,用户重存表单时自然收敛掉)

呈现:父级常显 + 子级可折叠,用 <details>/<summary> 原生实现,零 JS。
父级链接放在 <summary> 里不会误触折叠 —— HTML 规范规定 <summary>
的"激活即折叠"只在点击目标非 interactive content 时触发。

显式 pad_counts:核心是在 show_count && hierarchical 时隐式打开的
(category-template.php:392)。不显式给的话父级数字 220→188,
用户会以为丢了 32 篇文章。

orderby=count 不交给 SQL:WP_Term_Query 翻成 ORDER BY tt.count
(原始值),而 pad_counts 是查询后由 PHP 补的 ⇒ 数字大的排在小的
后面。改成本地取回后按补过的 count 排,并做 strnatcasecmp tie-break。

分类名不 decode:实测 esc_html() 对 & 的输出恒为 &amp;,所以库里
存 & 还是存 &amp;,最终 HTML 字节一致、浏览器显示也一致。decode
是冗余且有多一层绕过风险。(建单时判断错了,此处自我纠正。)

删掉失效的 .widget_categories ul li 整套规则及 @media 里的宽度规则。

样式三个缺陷(线上真实页面量坐标才发现,不是看代码能看出来的):
1. 主题全局 ul>li{margin-bottom:6px;padding-left:2px;list-style:circle}
   (kratos.css:74) 未被重置 ⇒ 每行多 6px,8 行累积 42px 行距发虚
2. 同上 padding-left:2px 只覆盖了 :not(.has-children) ⇒ 带箭头行错位 2px
3. 有子级行的 li 里只有 <details> 一个 flex 子项,space-between 推不动;
   <details> 默认按内容收缩 ⇒ 数字右边界差 7.1px(实测
   [220.5,220.5,227.6,227.6,220.5])

验证:
- 端到端(真实 WP 加载待测副本)77 通过 / 0 失败
- 反证 12 组全部命中预期判据,无一组空跑
- CSS 视觉反向验证 3 组:三处缺陷逐个注回,全部被量出来
- 视觉几何 18 项全绿(行距/胶囊/对齐/留白/悬停/箭头)
- 用 3.2.53 老代码跑同一套判据:11 通过 / 57 失败

过程中修掉 5 条假判据(全在我自己的测试脚本里)。用老代码跑时它
居然"通过 16 条",逐条查全是假绿,根因同一个:否定式断言作用在
空靶上(与 pitfalls #424 同一族)。最典型的一条:
  /@media[^{]*\{[^}]*widget_categories/ 的 [^}]* 遇到块内第一个 }
  就截断 ⇒ 永远匹配不到 ⇒ 恒真。老代码 2354 行明明有那条规则。
改成按花括号配对切块后,老代码从「16 通过/50 失败」变「11/57」。

包 kratos_yang-3.2.54.zip:4783259 字节 / 237 成员 / 0 个 1980 时间戳
readme 45 个版本标题 · update.json → 3.2.54
服务器主题目录仍 3.2.53,未被覆盖
2026-10-27 12:18:53 +08:00
2022-01-07 11:15:42 +08:00

该项目是原kratos的一个分支。
本项目仓库地址:
https://code.yangyq.net/laoyang/wordpress-kratos-yang
因为我需要一些定制的功能,就fork出来一个新的分支,自己用。如果你对原有的主题开发也有不满意的地方,欢迎使用我的这个版本。当然,版权仍然是属于原主题。 主题预览:老杨说话的地方。

该仓库已同步到多个git托管平台,包括Github、Gitee、 Gitlab和阿里云Code。这些代码库都和源库保持一致和同步,在任何平台上关注都可以。

Github因为网络原因,同步会出现失败情况,无法保证最新。

主要修改的地方主要包括:

  1. 为移动端增加了侧边栏显示。之前的版本,在移动端无法看到最近评论,这个版本加入了这个功能。当然只是在首页,在文章页面,为了减少数据传输,仍然没有侧边栏。
  2. 文章聚合widget,将最新文章优先显示。原来的版本,是显示最热门文章,但是不知道什么原因,热点文章总是没几个,而且我认为,大部分人上来,应该时主要为了看最新文章的吧。
  3. 删除了配置页面中的关于主题,精简、精简、精简。
  4. 删除了资源托管选项,删除了媒体托管选项。
  5. 文章配置中,删除了文章版权信息,删除了网易云音乐。
  6. 删除了社交相关配置选项。
  7. 增加了在页脚显示国旗的选项。

修复Bug

  1. 如果使用了插件,会改变comment的div名称,class="comments" 变成了comments-area,因此,评论的样式不好用了。

此时,在主题的额外CSS中添加:

.k-main .details .comments-area {
  margin-top: 16px;
  padding: 1.6px 16px 16px;
  border-radius: 2px;
  background-color: #fff;
  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
  -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
}

.k-main .details .post-2 .comments-area {
  -webkit-box-shadow: none;
  -moz-box-shadow: none;
  box-shadow: none;
}

就可以了。该问题属于和插件的冲突问题,因此,在额外CSS中添加,不修改主题本身。

代码块样式

主题的 assets/css/kratos.css 里有一组 .k-main .details .article .content 下的 pre / code / kbd / pre code / pre ol / pre li 规则,负责代码块与行内代码的底色和间距。

这六条曾经在压缩产物里整组丢失过:某次改动把单行压缩版 kratos.min.css 手工展开成可读格式, 展开时漏掉了这一整段,而原始未压缩的 kratos.css 里它们是齐全的,导致源与产物对不上。 表现是行内 code 与 kbd 没有样式(代码块因为插件 Prism 主题的覆盖才没露馅)。

改完 CSS 后请用压缩器重新生成产物,不要手工维护 kratos.min.css:

npx clean-css-cli@5.6.3 -o assets/css/kratos.min.css assets/css/kratos.css

主题自动更新

更新走的是一份静态 JSON + 一个 zip 包,由 inc/update-checker/(Plugin Update Checker 4.9)消费。

  • 元数据地址:https://yangyq.net/theme-update/update.json (定义在 inc/theme-core.php,可用 wp-config.php 里的 YANG_THEME_UPDATE_URL 覆盖)
  • 发布目录:站点根下的 theme-update/,内容只有三样:
theme-update/update.json    # 版本元数据
theme-update/kratos_yang.zip # 主题包,解压后是 kratos_yang/ 目录
theme-update/readme.html     # 「详情」页,可省

update.json 格式(version 与 details_url 必填):

{
  "version": "3.3.0",
  "details_url": "https://yangyq.net/theme-update/readme.html",
  "download_url": "https://yangyq.net/theme-update/kratos_yang.zip"
}

发布新版本的顺序

先改 style.css 里的 Version,再打包,否则 WordPress 认为没有新版本,不会提示升级。

  1. 改 style.css 的 Version(例如 3.2.2 → 3.3.0)
  2. 打包:zip -r kratos_yang.zip kratos_yang -x "*.DS_Store" "*/.git/*"
  3. 传 kratos_yang.zip 到 theme-update/
  4. 最后才改 update.json 里的 version

第 4 步放最后,是因为 WordPress 见到新版本号就会立刻允许升级; 若此时 zip 还是旧的,等于发了个指向旧包的更新,装完版本号没变(或者直接坏掉)。

⚠️ 自动升级会覆盖主题目录

WordPress 升级主题的做法是删掉整个 kratos_yang/ 再解压新包 (wp-admin/includes/class-theme-upgrader.php 里 clear_destination => true, 随后 delete_old_theme() 递归删除)。所以任何直接改在服务器主题目录里的东西都会丢, 包括手工打的补丁(例如曾经直接在 footer.php 里加的 Prism 脚本)。

自定义样式不再放主题目录。 早期版本有一个 custom/ 目录(custom.css / custom.js / custom.php),是给用户随手加样式的入口,但它位于主题目录内, 每次升级都会被清空 —— 而且 custom.php 会被 require,等于允许在主题里执行任意 PHP 代码。该模块已在 3.2.2 移除,改为后台选项:

后台 → 主题选项 → 自定义代码 → 自定义 CSS / 自定义 JS

这两段内容存在数据库的 kratos 选项里,升级、重装、改主题目录名都不受影响。 它们分别在主题样式表和主题脚本之后加载,优先级最高。

几个要点:

  • 不需要写 <style> / <script> 标签,直接写 CSS / JS 内容
  • 内容不会被当作 HTML 处理,>、<、~、反斜杠转义(如 content: "\f101")都原样保留
  • 想彻底清空,把框里内容删掉保存即可(空值会覆盖内置默认值)
  • 点“恢复默认”会把「自定义 CSS」还原成主题自带的默认样式

换域名 / 退役旧域名

以前更新元数据放在独立子域名上,现在收进主站,省掉一个站点、一套证书和一份备案。 切换时注意:

  1. 先把 theme-update/ 部署到主站并确认 update.json 能直接访问(返回 JSON,不是 404 或首页)
  2. 再发布带新地址的主题版本
  3. 旧版本的主题仍会去老地址拉更新,所以旧域名的 update.json 要在确认所有站点都升级完之后才能下线
S
Description
WordPress主题kratos_Yang
Readme MIT
7.6 MiB
Languages
PHP 86.7%
CSS 8.7%
JavaScript 4.6%