Releases: chinachat/aurora-star
Release list
v2.2.2 — 全量安全审计,并固化安全基线
Aurora Star v2.2.2
对主题做了一次全量安全审计,并把结论固化成可长期运行的回归测试。
本次不改动任何功能或行为。
✅ 审计结论:未发现可被利用的安全漏洞
审计范围:38 个 PHP 文件(不含 assets/vendor/ 第三方库),约 12,000 行。
方法:两轮自动化模式扫描 + 逐项人工复核,每条结论都落到源码。
几处值得一提的设计
零 nopriv 入口 |
没有任何钩子能被未登录用户触发 |
| 零外部 HTTP 请求 | 不发 wp_remote_* / curl / fsockopen;GeoLite2 查询全部是本地文件读取 —— SSRF 面为零,也不存在把访客 IP 送往第三方 |
| 结构上免疫 Zip Slip | 两个压缩包解包点(GeoIP 库、Markdown 导入)都把输出路径写死,归档条目名只用于判断扩展名,从不参与路径拼接 |
| SVG 上传默认关闭 | 即便在子主题里用过滤器打开,仍要求 unfiltered_html |
| 动态 CSS 无法逃逸 | 插值源全部受 sanitize_hex_color() 或 ^[0-9a-f]{6}$ 约束 |
逐项确认的 13 类风险面
入口权限与 nonce | 文件上传与解包 | 输出转义(XSS)| SQL | 动态 CSS 注入 |
短码属性注入 | 路径拼接 | 包含与动态执行 | kses | CSRF | 开放重定向 |
ABSPATH 守卫 | 外部请求
几个具体结论:
- 全主题未转义的裸
echo只有 4 处,逐个人工确认输出的都是内部已转义过的 HTML
(GeoIP 署名、菜单目录、评论标签名) - 全主题只有一处
$wpdb调用(阅读数自增),走prepare+%d/%s占位符 - 全主题没有
eval/extract/create_function/system/exec/
shell_exec/unserialize/preg_replace /e - Markdown 导入在用户无发布权限时,会把
publish/private/future降级为draft - 自定义器文案(页脚版权)双重防护:setting 用
wp_kses_post过滤,输出时再包一层
🛡️ 新增:安全基线回归测试(35 项)
tools/test-security.php 把上述结论固化成断言,覆盖:
- 每个文件都有 ABSPATH 守卫
- 无
eval/extract/system/exec/unserialize/preg_replace /e - 无外部 HTTP 请求
- 无
nopriv钩子 - 每条 REST 路由都有非
__return_true的权限回调 - POST 表单都有 nonce;读
$_POST的文件都校验 nonce(含例外白名单及理由) - 所有
$wpdb调用都经过prepare - 未转义的裸
echo只能出现在 4 处白名单,新增一处即失败 - 归档条目名不得被用作输出路径
- 上传入口的关键防线(
is_uploaded_file、权限、nonce、先校验后原子替换) - SVG 默认关闭且需
unfiltered_html - 动态 CSS 只能插入受约束的值
- kses 语义未被误改
已验证测试确有检出能力
在副本里植入 6 处违规(去掉 ABSPATH 守卫、加 eval、加 wp_remote_get、
加 unserialize、去掉一条 REST 权限回调、加一处 echo $_GET['x']):
FAIL 无文件可直接访问 → inc/thumbnail.php
FAIL 无代码执行类危险函数 → inc/layout.php → eval
FAIL 无 unserialize(对象注入) → inc/layout.php
FAIL 不发任何外部 HTTP 请求 → inc/layout.php → wp_remote_get
FAIL 每条路由都有回调且非 __return_true → class-rest.php(3 条路由,只有 2 个回调)
FAIL 无新增的未转义输出 → inc/admin-menu.php → $_GET['x']
全部命中;对真实主题零误报。 测试支持传目录参数,可随时对副本复验:
php tools/test-security.php /path/to/copy
📝 顺带修正与记录
补充注释:maybe_suppress_kses() 只把核心 wp_filter_post_kses 从优先级 10
挪到 11、并未移除(两者在同一次 content_save_pre 里都会执行),
真正的过滤在 sanitize_for_save()。原注释「不再让核心 kses 再过滤一遍」容易让人
误读为放行开关,现已改正。
4 项非漏洞的加固建议(记录在审计报告里):
| # | 事项 | 风险 |
|---|---|---|
| 1 | 解压无体积上限 | 需 manage_options,且上传受 upload_max_filesize 限制,风险很低 |
| 2 | 阅读数可被脚本灌水 | 业务数据完整性问题,非安全漏洞(已有 UA 机器人判断) |
| 3 | maybe_suppress_kses() 注释误导 |
已修正 |
| 4 | 模块 kses 白名单比核心略宽(多放行 style 等) |
为让 Markdown 表格/任务列表存活,有意取舍;style 无法执行 JS |
✅ 验证
| 套件 | 断言 |
|---|---|
test-security |
35(本次新增) |
test-shortcodes |
98 |
test-markdown-import |
83 |
test-comments |
73 |
test-markdown-parser |
69 |
test-layout |
55 |
test-thumbnail |
47 |
test-markdown-module |
47 |
test-geoip-upload |
46 |
test-markdown-guard |
41 |
test-footer |
36 |
test-alt-providers |
27 |
test-shortcode-markdown |
27 |
test-doc-render |
24 |
test-css-layering |
12 |
test-render |
DOM 校验,真实问题 0 |
16 个套件、720 项断言全部通过,全部 PHP 文件 php -l 无错误。
📄 前序版本
- v2.2.1 — 修复
[button]等短码在 Markdown 文章里链接失效 - v2.2.0 — 默认特色图:没有特色图时自动回退
- v2.1.0 — 列表布局可切换:卡片 / 列表 / 紧凑网格
- v2.0.2 — 修复 Markdown 代码块与主题代码高亮打架(浅底浅字)
v2.2.1 — 修复 [button] 等短码在 Markdown 文章里链接失效
Aurora Star v2.2.1
修复 [button] 短码的链接在 Markdown 文章里失效的问题。
🐛 现象
Markdown 文章里写:
[button href="https://example.com"]查看[/button]
按钮渲染出来了,但 href 是 #,点了没反应。
🔍 根因
Markdown 解析器的自动链接把短码属性里的裸 URL 转成了 <a>:
输入: [button href="https://example.com"]查看[/button]
渲染后: <p>[button href="<a href="https://example.com">https://example.com</a>"]查看[/button]</p>
结果: <a class="aurora-star-btn aurora-star-btn-primary aurora-star-btn-md" href="#">短码被拆散了,shortcode_parse_atts() 再也读不到 href,于是回退成它声明的默认值 #。
相对路径
href="/about"和锚点href="#top"不受影响——它们没有协议头,
不会被自动链接,所以这个 bug 只在写完整网址时出现。
🔧 修复
1. 解析器先保护短码标签(主修复)
在行内语法之前插入 protectShortcodeTags(),把短码标签替换成占位符、最后原样还原。
解析器不依赖 WordPress,拿不到已注册的短码表,因此按形状判断:
| 形状 | 例子 | 是否保护 |
|---|---|---|
| 闭标签 | [/button] |
✅ |
| 带属性的开标签 | [button href="…"] |
✅ |
| 自闭合 | [youtube id="x"/] |
✅ |
| 裸标签 | [tabs] |
❌ 不保护(避免误伤 Markdown) |
后面紧跟 ( 或 [ |
[文字](url)、[文字][ref] |
❌ 不保护 |
这样 Markdown 自己的链接语法完全不受影响,已逐项验证:
[文字](https://example.com)[点 击这里](https://example.com)(标签里有空格)[文字](https://example.com "标题")[文字][ref]+[ref]: https://b.com "B"[ref](快捷引用式)
方括号之外的裸 URL 仍然照常自动链接,短码内容里的 URL 也仍然会被链接。
2. href 也走 aurora_star_clean_attr()
[button] 里 href 是唯一没做实体还原的属性。属性被 " 转义或被引号包住时,
esc_url() 会把整个值甩掉,得到 href=""。现在与 color / size / target /
rel / class / icon 一致;顺带把弯引号(“ ” ‘ ’,从 Word / 文档里粘来)也一并去掉。
修复后,以下写法全部得到正确的 href="https://example.com/a":
[button href="https://example.com/a"]查看[/button]
[button href='https://example.com/a']查看[/button]
[button href=""https://example.com/a""]查看[/button]
[button href="“https://example.com/a”"]查看[/button]
⚠️ 升级后必须重新渲染
解析器版本已升到 1.0.2。坏掉的 HTML 已经存进文章正文,
所以升级后要重新生成一次:
Markdown 发布 → 批量重新渲染 → 跑一次即可(会从 _mdp_markdown 原文重新渲染)。
编辑页也会提示「解析器已更新」,逐篇保存同样有效。
✅ 验证
新增 test-shortcode-markdown.php(27 项):
- 12 种短码写法在 Markdown 里原样保留
- 属性里的 URL 不再被自动链接
- 6 种 Markdown 链接语法全部放行(见上表)
- 方括号外的裸 URL 仍自动链接;短码内容里的 URL 仍自动链接
- 不成对的方括号(
[未闭合、a[1] = 2、arr[0])不炸
短代码套件新增 R13–R15,覆盖 href 的五种写法与空值回退。
| 套件 | 断言 |
|---|---|
test-shortcodes |
98 |
test-markdown-import |
83 |
test-comments |
73 |
test-markdown-parser |
69 |
test-layout |
55 |
test-thumbnail |
47 |
test-markdown-module |
47 |
test-geoip-upload |
46 |
test-markdown-guard |
41 |
test-footer |
36 |
test-shortcode-markdown |
27(本次新增) |
test-alt-providers |
27 |
test-doc-render |
24 |
test-css-layering |
12 |
test-render |
DOM 校验,真实问题 0 |
15 个套件、684 项断言全部通过,全部 PHP 文件 php -l 无错误。
📄 前序版本
- v2.2.0 — 默认特色图:没有特色图时自动回退
- v2.1.0 — 列表布局可切换:卡片 / 列表 / 紧凑网格
- v2.0.2 — 修复 Markdown 代码块与主题代码高亮打架(浅底浅字)
- v2.0.1 — 修复行内
<code>里的短码被当成真短码执行 - v2.0.0 — Markdown 发布插件整体并入主题,插件退役
v2.2.0 — 默认特色图:没有特色图时自动回退
Aurora Star v2.2.0
文章没有设置特色图时会自动回退到一张默认图,不用再逐篇去补。
位置:外观 → 自定义 → Aurora Star 主题 → 文章 → 默认特色图
🖼️ 怎么用
- 到 自定义器 → 文章 → 默认特色图,点「选择图像」上传或从媒体库挑一张。
- 完成。之后没有特色图的文章全部自动使用这张图。
想恢复原样就清空该设置。
⚙️ 两个位置可以分别开关
| 设置 | 默认 | 说明 |
|---|---|---|
| 文章内显示特色图片 | 开启 | 总开关,关掉则单篇文章/页面顶部不显示大图 |
| 默认特色图 | 空 | 没有特色图时自动使用的图片 |
| 默认图用于列表缩略图 | 开启 | 首页 / 归档 / 搜索的卡片缩略图 |
| 默认图用于文章页顶部大图 | 开启 | 单篇文章 / 页面的顶部大图 |
只想让列表有图、不想每篇文章顶部都顶一张通用大图?把最后一项取消勾选即可。
🔧 实现要点
- 存的是附件 ID,不是图片 URL。 因此走
wp_get_attachment_image(),
自动带srcset/sizes/alt/width/height,
并按主题注册的尺寸裁剪(列表640×360、大图1600×800)。
用WP_Customize_Media_Control+absint保证存进theme_mod的是整数。 - 文章自己的特色图永远优先,默认图只在缺失时兜底。
- 失效自动兜底:附件被删除、或换成非图片(PDF 之类)时,
aurora_star_default_thumbnail_id()会核验get_post_mime_type(),
失效就返回 0,页面回退到原来的占位图标,不会出现裂图。 - 重构:新增
inc/thumbnail.php;content-card.php/single.php/page.php
不再直接写has_post_thumbnail(),改走
aurora_star_should_show_card_media()/aurora_star_should_show_hero()。
⬆️ 升级
下载 aurora-star.zip 安装启用即可。不设置默认图时行为与升级前完全一致。
✅ 验证
新增 test-thumbnail.php(47 项),覆盖:
- 未设置默认图时不回退、不调用
wp_get_attachment_image - 设置后自动回退,且尺寸与
class正确透传 - 文章自己的特色图优先于默认图
- 附件不存在 / 非图片 / 负数 ID / 非数字 → 一律回退到 0
- 列表开关与文章页开关互不干扰
- 与「文章内显示特色图片」总开关的关系(总开关只约束大图,不影响列表)
- 三个模板已接线,且不再直接使用
has_post_thumbnail()
| 套件 | 断言 |
|---|---|
test-shortcodes |
85 |
test-markdown-import |
83 |
test-comments |
73 |
test-markdown-parser |
69 |
test-layout |
55 |
test-thumbnail |
47(本次新增) |
test-markdown-module |
47 |
test-geoip-upload |
46 |
test-markdown-guard |
41 |
test-footer |
36 |
test-alt-providers |
27 |
test-doc-render |
24 |
test-css-layering |
12 |
test-render |
DOM 校验,真实问题 0 |
14 个套件、645 项断言全部通过,全部 PHP 文件 php -l 无错误。
📄 前序版本
- v2.1.0 — 列表布局可切换:卡片 / 列表 / 紧凑网格,桌面列数 2–4 可调
- v2.0.2 — 修复 Markdown 代码块与主题代码高亮打架(浅底浅字)
- v2.0.1 — 修复行内
<code>里的短码被当成真短码执行;标题锚点对齐 GitHub - v2.0.0 — Markdown 发布插件整体并入主题,插件退役;数据键名完全兼容
v2.1.0 — 列表布局可切换:卡片 / 列表 / 紧凑网格
Aurora Star v2.1.0
文章列表支持三种布局自由切换,位置在 自定义器 → 列表布局。
🎨 三种布局
三种布局共用同一份模板标记,只换容器上的修饰类——所以文章内容、特色图、分类、阅读数、摘要的行为完全一致,只是排列方式不同。
| 布局 | 观感 | 适合 |
|---|---|---|
| 卡片(默认) | 上图下文的卡片,响应式网格;摘要 3 行 | 通用,图文并茂的博客 |
| 列表 | 缩略图在左的通栏行,摘要 2 行;窄屏自动回退成上图下文 | 文章多、想快速扫标题 |
| 紧凑网格 | 小卡、不显示摘要、缩略图 4:3 | 信息密集的归档页 |
⚙️ 可调项
| 设置 | 默认 | 说明 |
|---|---|---|
| 布局样式 | 卡片 | 卡片 / 列表 / 紧凑网格 |
| 每行列数(桌面端) | 自适应 | 自适应(手机 1 / 平板 2 / 桌面 3)或固定 2 / 3 / 4 栏 |
| 显示摘要 | 开启 | 卡片与列表生效;紧凑网格固定不显示 |
| 首页 / 博客列表 | 开启 | 取消勾选后该页回到主题内置的响应式卡片网格 |
| 归档(分类 / 标签 / 日期 / 作者) | 开启 | 同上 |
| 搜索结果 | 开启 | 同上 |
关于列数:手机(< 640px)始终 1 栏,平板(≥ 640px)2 栏,桌面端才用你选的列数。
选「列表」时该选项不生效——列表按定义就是单栏。
🔧 实现要点
- 新增
inc/layout.php承载全部布局逻辑:aurora_star_list_layout()、
aurora_star_post_grid_class()、aurora_star_layout_css()等 index.php/archive.php/search.php里不再写死class="post-grid",
改调aurora_star_post_grid_class()- 列数覆盖走
wp_head优先级 20 的动态 CSS(排在所有样式表之后,优先级最高) - 列表布局的
grid-template-columns用双类名.post-grid.post-grid--list提高特异性,
压过main.css里那两条媒体查询——媒体查询不增加特异性,顺序相同时必须靠特异性取胜 - 所有新样式走主题的 CSS 变量,自动跟随明暗模式
⬆️ 升级
下载 aurora-star.zip 安装启用即可。默认行为与升级前完全一致(还是卡片 + 响应式网格),
要换布局需到 自定义器 → 列表布局 主动选择。
✅ 验证
| 套件 | 断言 |
|---|---|
test-shortcodes |
85 |
test-markdown-import |
83 |
test-comments |
73 |
test-markdown-parser |
69 |
test-layout |
55(本次新增) |
test-markdown-module |
47 |
test-geoip-upload |
46 |
test-markdown-guard |
41 |
test-footer |
36 |
test-alt-providers |
27 |
test-doc-render |
24 |
test-css-layering |
12 |
test-render |
DOM 校验,真实问题 0 |
13 个套件、598 项断言全部通过,全部 PHP 文件 php -l 无错误。
test-layout.php 覆盖:选项集合、三个范围开关互不干扰、容器 class 组合、
非法值回退、动态 CSS 产物(列表忽略列数、自适应不输出 CSS)、三个模板已接线、
CSS 与模板是否对得上、自定义器是否注册齐全。
📄 前序版本
- v2.0.2 — 修复 Markdown 代码块与主题代码高亮打架(浅底浅字)
- v2.0.1 — 修复行内
<code>里的短码被当成真短码执行;标题锚点对齐 GitHub - v2.0.0 — Markdown 发布插件整体并入主题,插件退役;数据键名完全兼容
v2.0.2 — 修复 Markdown 代码块与主题代码高亮打架导致的配色错乱
Aurora Star v2.0.2
修复 Markdown 代码块与主题代码高亮体系的样式冲突。
🐛 现象
同一篇文章里,两种代码块长得完全不一样:
- 短码
[code]输出的代码块 → 深色(Prism Okaidia,#272822) - Markdown 围栏代码块 → 浅灰色(
#f6f8fa),且文字几乎看不见
暗色模式下更明显:Markdown 代码块是一块刺眼的白。
🔍 根因
assets/markdown/frontend.css 是一份只考虑浅色的样式表,
而且排在 Prism 主题与 highlight.css 之后加载——同优先级下后来者胜。
/* 模块样式表:特异性 (0,2,0) */
.mdp-markdown-post .mdp-pre { background: #f6f8fa; }
/* Prism Okaidia:特异性 (0,1,1) —— 被压过 */
pre[class*=language-] { background: #272822; }底色被换成了浅灰,但 Prism 的 token 配色仍然是深色主题的
(正文色 #f8f8f2,近乎纯白),于是浅底浅字。
顺带说明:Prism 会给父级
<pre>补上language-*类
(prism-core.js的 "Set language on the parent, for styling"),
所以pre[class*=language-]本来是会命中 Markdown 代码块的——
只是被模块那个更高特异性的选择器顶掉了。
该文件里的表格边框、行内代码、目录、脚注也全是写死的浅色值
(#e0e0e0、#f6f8fa、#3c434a 等),一律不跟随明暗模式。
🔧 修复
代码块与表格的观感完全交还给主题,模块样式表只保留主题未覆盖的结构样式:
| 交给主题 | 交给模块 |
|---|---|
| 代码块底色与 token 配色(Prism 主题) | 表格横向滚动容器 .mdp-table-wrap |
代码块内边距 / 圆角 / 字体(highlight.css) |
任务列表 .mdp-task-item |
表格边框与表头(main.css) |
[mdp_toc] 目录 .mdp-toc* |
行内代码(main.css) |
脚注 .mdp-footnotes / .mdp-fn-* |
模块保留的部分一律改用主题的 CSS 变量,自动跟随明暗模式:
.mdp-toc {
background: var(--aurora-star-surface-2);
border: 1px solid var(--aurora-star-border);
}
.mdp-footnotes { color: var(--aurora-star-text-2); }副作用(好的那种):模块样式表从此不再需要排在 Prism 之后,
加载顺序不再影响结果——原先那类冲突从结构上消失了。
模块版本号升到 1.0.3(frontend.css 变了,必须换缓存号,否则浏览器读旧文件)。
⬆️ 升级步骤
下载 aurora-star.zip,在 外观 → 主题 → 添加新主题 → 上传主题 安装并启用即可。
- 无需重新渲染文章——这次是纯样式修复,在显示时生效。
- 若升级后颜色没变,按 Ctrl+F5 强制刷新(CSS 带了新的版本号,正常情况下会自动失效)。
✅ 验证
新增 test-css-layering.php,把这条约束固化下来:
- 模块样式表不得给
<pre>/<code>设置background、color、
border、padding、font-size、line-height等观感属性 - 模块样式表不得出现写死的浅色值
- 模块样式表里的颜色一律使用
var(--aurora-star-*) - 全主题扫查:不存在
.mdp-pre/.mdp-code的高特异性选择器会再次压过 Prism - 确认 Prism 主题与
highlight.css确实提供了代码块的底色与内边距
同时 test-doc-render.php 扩展为两条渲染路径(整篇 Markdown、[markdown] 区块),
断言无被误执行的短码、正文无被转义 HTML、页内锚点全部有目标、无 <p><pre> 非法嵌套。
| 套件 | 断言 |
|---|---|
test-shortcodes |
85 |
test-markdown-import |
83 |
test-comments |
73 |
test-markdown-parser |
69 |
test-markdown-module |
47 |
test-geoip-upload |
46 |
test-markdown-guard |
41 |
test-footer |
36 |
test-alt-providers |
27 |
test-doc-render |
24 |
test-css-layering |
12 |
test-render |
DOM 校验,真实问题 0 |
12 个套件、543 项断言全部通过。
📄 前序版本
- v2.0.1 — 修复行内
<code>里的短码被当成真短码执行(会导致整段正文被转义成文本);
标题锚点对齐 GitHub 算法 - v2.0.0 — Markdown 发布插件整体并入主题,插件退役;数据键名完全兼容,可随时回退
v2.0.1 — Markdown 发布插件并入主题,并修复线上页面显示问题
Aurora Star v2.0.1
本次是功能级别更新:Markdown 发布功能整体并入主题,独立插件退役;
并修复了线上「使用文档」页面 HTML 被转义成文本的问题。
🎉 主要变化:Markdown 发布插件并入主题
独立插件 wp-markdown-publisher 的全部功能并入主题,插件退役,无需再安装:
- Markdown 编辑器(工具栏 + 实时预览)
.md/.markdown/.txt批量导入,也支持.zip打包- front matter(标题、slug、分类、标签、日期、摘要)
- GFM 扩展:表格、任务列表、脚注、目录、自动链接
- 批量重新渲染、REST 接口(
mdp/v1)、WP-CLI
| 主题侧代码 | inc/markdown/ |
| 主题侧资源 | assets/markdown/ |
| 集成说明 | inc/markdown/README.md |
数据完全兼容,可随时回退
选项名与文章元数据键名原样保留(mdp_settings、_mdp_markdown、_mdp_enabled、
_mdp_toc、_mdp_rendered_at、_mdp_parser_version),所以:
- 已有文章的 Markdown 原文、渲染状态与全部设置无缝继承
- 插件 ↔ 主题两边读写同一份数据,随时可以互换
- 文章正文(
post_content)保存的始终是渲染后的 HTML,
即使日后不用本主题,文章内容也不会丢 mdp()快捷函数带function_exists守卫保留,已有自定义代码不受影响
插件仍在启用时自动让路
主题加载时检测到独立插件,内置模块会整体让路(避免类重复定义与双重渲染),
并给出一条后台提示。插件先于主题加载,因此这个判断是可靠的。
过滤器优先级解耦
原先插件把预渲染挂在 the_content 优先级 8、与主题的保护过滤器同档,
执行顺序依赖"谁先注册"这个加载顺序上的巧合。现在各归其位:
| 优先级 | 回调 | 归属 |
|---|---|---|
| 6 | maybe_render_source |
模块 |
| 7 | pre_render_markdown_blocks |
模块 |
| 8 | aurora_star_protect_content |
主题 |
| 9 | maybe_toggle_wpautop / aurora_star_heading_ids |
模块 / 主题 |
| 10 | wptexturize、wpautop、shortcode_unautop |
核心 |
| 11 | do_shortcode、aurora_star_lightbox_images |
核心 / 主题 |
生命周期对应关系
主题没有 register_activation_hook 与 uninstall.php,对应关系为:
| 插件 | 主题 |
|---|---|
激活钩子 → Mdp_Plugin::on_activate() |
after_switch_theme |
uninstall.php 的清理 |
switch_theme → aurora_star_markdown_cleanup_on_switch() |
行为一致:只有勾选了设置页的「切换主题时同时删除设置项」才真的删除设置。
🐛 修复:正文里行内 <code> 的短码被当成真短码执行
线上 https://8u8.club 的「使用文档」页面从第 8.1 节起整段变成转义文本、
8.2–10.6 的标题全部消失,就是这个问题的表现。
根因
Markdown 里写 `[code]` 会渲染成 <code>[code]</code>。
它不在 <pre> 内,于是被 aurora_star_protect_code_shortcode() 当成真短码,
一路吞到文档里下一个 [/code]——中间整段正文被 base64 化并渲染成一个 [code] 代码块,
其中所有 < > 都被 htmlspecialchars() 转义成文本。同理 `[markdown]`
会被真的执行成一个空块。
输入: <p>用 <code>[code]</code> 时注意。</p><p>示例 [code lang="php"]a = 1[/code]</p>
修复前输出: <p>用 <code><pre class="language-markup"><code class="language-markup"></code> 时注意。
</p><p>示例 [code lang="php"]a = 1</code></pre></p>
修复
aurora_star_escape_pre_content() 现在同时处理 <pre> 与行内 <code>:
'#<(pre|code)\b[^>]*>.*?</\1>#is'代码元素里的方括号只应作为文字显示,转成实体后浏览器仍显示 [ ],
但 do_shortcode 不再匹配。
🐛 修复:标题锚点与 GitHub 不一致
Mdp_Markdown::slugify() 会把连续的 - 折叠成一个,而 GitHub
(以及文档里手写的目录锚点)不折叠:
| 标题 | 修复前 | 文档链接 |
|---|---|---|
| 4. 暗黑 / 明亮模式 | 4-暗黑-明亮模式 |
#4-暗黑--明亮模式 ✗ |
| 5.5 页脚结构与备案信息(ICP / 公安备案) | …icp-公安备案 |
…icp--公安备案 ✗ |
现在对齐 GitHub 算法,不再折叠。解析器版本升到 1.0.1,旧文章会在编辑页提示
「解析器已更新」。
⬆️ 升级步骤
- 下载
aurora-star.zip,在 外观 → 主题 → 添加新主题 → 上传主题 安装并启用。 - 停用独立的
Markdown 发布器插件(不要勾选"删除插件时同时删除设置项")。 - 到 Markdown 发布 → 批量重新渲染 跑一次,刷新旧文章里已写死的标题 id。
第 1 步做完,之前被转义的页面立刻恢复——那处修复在显示时生效,不需要重新保存文章。
第 3 步只影响目录锚点。
✅ 验证
| 套件 | 断言 |
|---|---|
test-shortcodes |
85 |
test-markdown-module |
47 |
test-markdown-guard |
41 |
test-markdown-parser |
69 |
test-markdown-import |
83 |
test-doc-render |
12 |
test-comments |
73 |
test-geoip-upload |
46 |
test-alt-providers |
27 |
test-footer |
36 |
test-render |
DOM 校验,真实问题 0 |
11 个套件、519 项断言全部通过。
其中 test-doc-render 会把主题自己的 使用文档.md 与 README.md 过一遍真实
the_content 管线,断言正文无被转义 HTML、无未执行短码、页内锚点全部有目标、
无 <p><pre> 非法嵌套——正是本次线上问题的回归防线。
📄 许可
- 主题:GNU General Public License v2 or later
- 内置的 MaxMind DB Reader:Apache-2.0
- flag-icons(国旗 SVG):MIT
- Prism.js:MIT
- Font Awesome:CC BY 4.0 / SIL OFL 1.1 / MIT
v1.5.3 — 代码块里的短码不该被执行
Aurora Star v1.5.3 — 代码块里的短码不该被执行
看了 https://8u8.club 的使用文档页面,找到了「显示不正常」的根源。
🔍 先说好消息:前几轮的修复都生效了
在线页面确认:
| 检查项 | 结果 |
|---|---|
| 页脚多行布局 | ✅ 版权 / 备案 / 署名三行 |
| 主题名链接 GitHub | ✅ 新标签页打开 |
页脚链接 target="_blank" |
✅ 全部带 noopener |
| IP 归属地署名 | ✅ IP Geolocation by DB-IP |
代码块内的 <br /> 污染 |
✅ 0 处 |
| 目录锚点断链 | ✅ 33 个链接,0 断链 |
| 目录 id 注入代码块 | ✅ 0 处 |
| Prism 按需加载 | ✅ 只加载了 14 个语言组件 |
🐛 问题根源:<pre> 里的短码被真的执行了
你页面上的长这样:
<pre class="mdp-pre"><code class="mdp-code language-text">
<a class="aurora-star-btn aurora-star-btn-quotprimaryquot" ...>按钮</a>立即查看
</code></pre>文档里本该显示的短码示例,被执行了。而且属性里的引号在粘贴时被转义成
",于是解析出 aurora-star-btn-quotprimaryquot 这种垃圾类名。
同类问题还有:
| 页面上的实际输出 | 应该显示 |
|---|---|
<iframe src=".../embed/quotVIDEO_IDquot"> |
[youtube id="VIDEO_ID"] |
class="language-quotpythonquot" |
language-python |
target=""_blank"" |
target="_blank" |
<i class=""fa-solid" style="color:"#f59e0b""> |
[icon name="fa-solid ..."] |
WordPress 核心不保护 <pre> 里的短码。 Gutenberg 代码块、Markdown 插件输出的
代码块、直接粘贴的文档,都会被 do_shortcode 把示例代码当成真短码执行。
🔧 修复
一、<pre> 内的短码不再执行
在 the_content 优先级 8 把 <pre>…</pre> 内的 [ ] 转义为 [ ]。
页面仍显示为 [ ],但 do_shortcode 不再匹配。
顺序很重要:先转义 <pre> 内方括号,再做 [code] 的 base64 保护 —— 反过来
的话,写在 <pre> 里的 [code] 会先变成占位短码、随后仍被执行。
二、被转义的短码属性还原
lang=""python"" 现在正确归一化为 python(此前是无效的
language-quotpythonquot,导致该代码块根本无法高亮)。[button] 的
color/size/target/rel/class/icon 与 [icon] 的 name/size/color
同样处理。
✅ 修复后
输入:<pre class="mdp-pre"><code class="mdp-code language-text">
[button href="https://example.com" color="primary"]立即查看[/button]
</code></pre>
输出:<pre class="mdp-pre"><code class="mdp-code language-text">
[button href="https://example.com" color="primary"]立即查看[/button]
</code></pre>
浏览器里显示为 [button href="https://example.com" color="primary"]立即查看[/button]
—— 正是文档需要的效果。
同时确认不会误伤:正文里正常使用的 [code lang="python"]…[/code] 依然照常执行渲染。
🧪 验证
新增 7 项用例直接复现你页面的真实内容形态:围栏里的 [button]/[code]/[youtube]
不被执行、lang 与属性还原、普通 mdp-pre 代码块不被误伤、正文里正常的短码仍正常执行。
短代码测试 56 → 73 项,累计 255 项全部通过。
📌 页面上还剩两处非主题问题
这两处需要你在编辑器里改,主题改不了:
- 第 11 个代码块内容错乱,是一堆转义碎片
(</code></h3>\n<pre class="mdp-pre">…)——粘贴时 markdown 结构断了,
建议删掉这一块重贴 - 文章开头写着「主题版本:1.5.0」,那是文章正文内容,和主题实际版本无关;
这篇文档可以更新到最新版
📦 安装
下载 aurora-star.zip → 后台 外观 → 主题 → 添加新主题 → 上传主题 → 安装并启用。
升级后那篇文档页的代码示例会自动恢复正确显示,不需要改文章内容。
需 WordPress ≥ 6.0 / PHP ≥ 7.4。
v1.5.2 — 修复 [code] 与目录锚点的冲突
Aurora Star v1.5.2 — 你没说错,确实还有冲突
我上一轮说「短代码没有冲突了」,这个结论是错的。你提醒之后我重查,发现冲突确实存在。
🔍 冲突是什么
[code] 的内容会被目录锚点功能污染。
原因:aurora_star_heading_ids()(给正文标题补 id 供目录跳转)也挂在 the_content
优先级 9,而它在 setup.php 里注册,早于 shortcodes.php 里的 [code] 保护过滤器。
同一优先级按注册顺序执行 —— 所以标题锚点过滤器先跑,把代码示例里的 <h2> 当成真标题处理了。
实际损坏(已复现):
输入:
<h2>真实标题</h2>
[code lang="html"]
<h2>代码里的标题</h2>
[/code]
输出:
<h2 id="aurora-star-toc-1-真实标题">真实标题</h2>
<pre><code><h2 id="aurora-star-toc-2-代码里的标题">代码里的标题</h2></code></pre>
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
代码示例里被塞进了一个 id 属性
两个后果:
- 代码示例被改动 —— 高亮出来的不是作者写的内容
- 目录编号被挤占 —— 代码里的假标题也占了一个 TOC 序号
🔧 修复
把 aurora_star_protect_code_shortcode() 从优先级 9 提到 8,早于
do_blocks(9) 与标题锚点过滤器(9),也早于 wptexturize(10) 与 wpautop(10)。
修复后:
<h2 id="aurora-star-toc-1-真实标题">真实标题</h2>
<pre><code><h2>代码里的标题</h2></code></pre>顺带还避免了另外几个「悄悄改代码」的问题:
wptexturize把代码里的"变成弯引号、...变成省略号、--变成破折号convert_smilies把代码里的:-)变成表情图
🧪 为什么上一轮没查出来 —— 我的测试有缺陷
上一轮的测试管线只接了 WordPress 核心的过滤器,漏掉了主题自己的 the_content 过滤器;
而且我手动把保护过滤器放在最前面跑,正好掩盖了同优先级的真实执行顺序。
这次改成从 add_filter 的注册表读取真实的优先级与注册顺序,忠实复现生产行为 ——
改完立刻就把上面那段损坏跑出来了。
短代码测试从 43 项增加到 56 项,新增:
- 代码示例里含
<h2>/<img>/ HTML 注释 / 短码语法时,不被其它过滤器改动 - 真实标题与代码内标题共存时,锚点只加在真标题上
- 代码不被
wptexturize/convert_smilies改动
连同既有测试共 238 项全部通过;所有 PHP 文件 php -l 无错。
📦 安装
下载 aurora-star.zip → 后台 外观 → 主题 → 添加新主题 → 上传主题 → 安装并启用。
需 WordPress ≥ 6.0 / PHP ≥ 7.4。
升级后代码示例会自动恢复原样,文章内容不需要改。
v1.5.1 — 修复短代码破坏布局
Aurora Star v1.5.1 — 修复短代码破坏布局的问题
你问「短代码是不是会破坏布局」——确实会,而且比我预想的严重。这一版修掉了。
🐛 严重:[code] 多行代码被破坏
原因:the_content 上的过滤器优先级是
wptexturize(10) → wpautop(10) → shortcode_unautop(10) → do_shortcode(11)
wpautop 在短码展开之前就跑了,它会把代码里的换行变成 <br />、
空行变成 </p><p>;等 [code] 拿到内容时,这些标记已经被 htmlspecialchars
转义成字面量,于是直接显示在代码块里。
修复前 / 修复后(同一段输入):
输入:
[code lang="php"]
function foo() {
return 1;
}
[/code]
修复前输出:
<pre><code><br />
function foo() {<br />
return 1;<br />
}<br /></code></pre>
修复后输出:
<pre><code>function foo() {
return 1;
}</code></pre>
含空行时更糟,</p> 和 <p> 会漏进代码块:
修复前:line1</p>
<p>line2
修复方式:新增 aurora_star_protect_code_shortcode(),挂在 the_content
优先级 9(早于 wpautop),把 [code] 内容 base64 化并换成内部短码,
短码执行时再解码还原。内容变成单行、不含换行,wpautop 便无从下手。
🐛 嵌套块级短码的多余空白
[code] 写在 [tabs] / [accordion] / [alert] 里时,wpautop 会把
面板/正文里的换行也转成 <br />,在代码块上下各顶出一行空白:
修复前:<div class="aurora-star-tabs-pane"><br />
<pre class="language-php">…</pre><br />
</div>
修复方式:新增 aurora_star_trim_block_breaks(),只剔除块级内容首尾的
<br />;中间的换行属于正文换行,保留不动。
✅ 检查结果:其余短码没有问题
[button] / [alert] / [tabs] / [accordion] / [notice] / [icon] / [youtube]
都不会破坏布局——块级短码被 <p> 包裹的问题由 WordPress 核心的
shortcode_unautop() 正确剥离了。这一点我用真实核心函数验证过,不是靠读代码推断。
🔬 这次是怎么验证的
之前几轮我只能"读代码 + 猜"。这次我把 WordPress 核心文件真的下载下来
(shortcodes.php / formatting.php / kses.php),搭了一个还原真实优先级顺序的
the_content 管线:
do_blocks(9) → [code]保护(9) → wptexturize(10) → wpautop(10)
→ shortcode_unautop(10) → do_shortcode(11)
然后拿真实内容跑。上面两个 Bug 都是这样跑出来的,读代码是发现不了的。
新增 43 项短代码测试,覆盖:单行 / 多行 / 含空行 / 内嵌 HTML 的 [code]、
嵌在 tabs 与 alert 中的代码块、区块编辑器短码块、相邻块级短码、行内 [icon] 混排、
以及占位短码不泄漏到最终输出。
连同既有测试,共 225 项全部通过;所有 PHP 文件 php -l 无错。
📦 安装
下载 aurora-star.zip → 后台 外观 → 主题 → 添加新主题 → 上传主题 → 安装并启用。
需 WordPress ≥ 6.0 / PHP ≥ 7.4。
如果你之前用
[code]写过多行代码,升级后会自动恢复正确显示,不需要改内容。
v1.5.0 — 页脚重构与友情链接
Aurora Star v1.5.0 — 页脚重构与友情链接
页脚以前把版权、备案、公安备案、主题署名、IP 署名全部挤在一行用 · 分隔,
信息一多就非常拥挤。这一版重新组织,并补上友情链接模块。
📐 新的页脚结构
友情链接 友站 A 友站 B ← 分配了「友情链接」菜单时显示
关于 联系 隐私政策 ← 页脚导航菜单
© 2026 站点名 ← 版权
京ICP备00000000号 · 🛡 京公网安备… ← 备案(单独一行)
由 Aurora Star 极光主题 驱动 · IP Geolocation by DB-IP ← 署名
- 备案与公安备案单独占一行,不再和版权文案混在一起
- 两者都留空时整行不输出,不留空白
- 版权、备案、署名各自是独立的
<p>,移动端会自动换行而非横向挤压
🔗 友情链接
新增独立的「友情链接」菜单位置,不占用页脚导航:
- 外观 → 菜单 → 新建菜单(如「友情链接」)
- 添加自定义链接(友站名称 + 网址)
- 在「显示位置」勾选 友情链接 → 保存
- 显示在页脚顶部,与页脚导航之间有分隔线
- 支持主题的菜单图标功能(菜单项「图标」字段填 Font Awesome 类名)
- 未分配菜单时该区域完全不输出,不留空白
🎯 主题署名与链接行为
-
页脚「由 Aurora Star 极光主题 驱动」中的主题名现在指向
GitHub 仓库,可用过滤器替换:add_filter( 'aurora_star_theme_url', function () { return 'https://your-site.com/'; } );
-
页脚导航与友情链接的链接一律新标签页打开,并自动补上
rel="noopener noreferrer"。
仅作用于footer与friends两个位置,主导航不受影响。如需关闭:add_filter( 'aurora_star_footer_links_new_tab', '__return_false' );
🐛 修复
备案与公安备案链接原先只带 rel="nofollow",缺少 noopener —— 新标签页可以通过
window.opener 操作原页面。现已补上。
♻️ 内部重构
原本由 aurora_star_footer_copyright() 一并返回的备案信息,拆分为三个函数,
便于模板分行输出:
aurora_star_footer_copyright()—— 仅版权文案aurora_star_footer_filings_html()—— ICP + 公安备案aurora_star_footer_credits_html()—— 主题署名
选择性刷新的 selector 与回调保持兼容,自定义器实时预览不受影响。
如果你在子主题里覆写过 aurora_star_footer_copyright(),需要相应调整。
✅ 本次验证
新增 36 项页脚测试:
- 用 XPath 校验
.site-footer__info下正好 3 个段落且 class 顺序正确 - 逐段取内容断言:备案信息确实没有出现在版权行里
- 页脚中 9 个链接全部带
target="_blank",且没有缺失noopener的 - 主题链接指向 GitHub 仓库
- 友情链接的渲染,以及「未分配菜单时不输出」
- 新标签页过滤器对
footer/friends/primary的作用范围 DOMDocument结构校验无真实问题
连同既有的 73 + 46 + 27 项,共 182 项测试全部通过;所有 PHP 文件 php -l 无错。
📦 安装
下载 aurora-star.zip → 后台 外观 → 主题 → 添加新主题 → 上传主题 → 安装并启用。
需 WordPress ≥ 6.0 / PHP ≥ 7.4。