Skip to content

Releases: chinachat/aurora-star

v2.2.2 — 全量安全审计,并固化安全基线

Choose a tag to compare

@chinachat chinachat released this 12 Sep 11:03

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 把上述结论固化成断言,覆盖:

  1. 每个文件都有 ABSPATH 守卫
  2. eval / extract / system / exec / unserialize / preg_replace /e
  3. 无外部 HTTP 请求
  4. nopriv 钩子
  5. 每条 REST 路由都有非 __return_true 的权限回调
  6. POST 表单都有 nonce;读 $_POST 的文件都校验 nonce(含例外白名单及理由)
  7. 所有 $wpdb 调用都经过 prepare
  8. 未转义的裸 echo 只能出现在 4 处白名单,新增一处即失败
  9. 归档条目名不得被用作输出路径
  10. 上传入口的关键防线(is_uploaded_file、权限、nonce、先校验后原子替换)
  11. SVG 默认关闭且需 unfiltered_html
  12. 动态 CSS 只能插入受约束的值
  13. 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 文章里链接失效

Choose a tag to compare

@chinachat chinachat released this 12 Sep 08:33

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](快捷引用式)
  • ![图](img.png)

方括号之外的裸 URL 仍然照常自动链接,短码内容里的 URL 也仍然会被链接。

2. href 也走 aurora_star_clean_attr()

[button]href唯一没做实体还原的属性。属性被 &quot; 转义或被引号包住时,
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="&quot;https://example.com/a&quot;"]查看[/button]
[button href="&#8220;https://example.com/a&#8221;"]查看[/button]

⚠️ 升级后必须重新渲染

解析器版本已升到 1.0.2坏掉的 HTML 已经存进文章正文
所以升级后要重新生成一次:

Markdown 发布 → 批量重新渲染 → 跑一次即可(会从 _mdp_markdown 原文重新渲染)。

编辑页也会提示「解析器已更新」,逐篇保存同样有效。

✅ 验证

新增 test-shortcode-markdown.php(27 项):

  • 12 种短码写法在 Markdown 里原样保留
  • 属性里的 URL 不再被自动链接
  • 6 种 Markdown 链接语法全部放行(见上表)
  • 方括号外的裸 URL 仍自动链接;短码内容里的 URL 仍自动链接
  • 不成对的方括号([未闭合a[1] = 2arr[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 — 默认特色图:没有特色图时自动回退

Choose a tag to compare

@chinachat chinachat released this 12 Sep 07:45

Aurora Star v2.2.0

文章没有设置特色图时会自动回退到一张默认图,不用再逐篇去补。

位置:外观 → 自定义 → Aurora Star 主题 → 文章 → 默认特色图


🖼️ 怎么用

  1. 自定义器 → 文章 → 默认特色图,点「选择图像」上传或从媒体库挑一张。
  2. 完成。之后没有特色图的文章全部自动使用这张图。

想恢复原样就清空该设置。

⚙️ 两个位置可以分别开关

设置 默认 说明
文章内显示特色图片 开启 总开关,关掉则单篇文章/页面顶部不显示大图
默认特色图 没有特色图时自动使用的图片
默认图用于列表缩略图 开启 首页 / 归档 / 搜索的卡片缩略图
默认图用于文章页顶部大图 开启 单篇文章 / 页面的顶部大图

只想让列表有图、不想每篇文章顶部都顶一张通用大图?把最后一项取消勾选即可。

🔧 实现要点

  • 存的是附件 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.phpcontent-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 — 列表布局可切换:卡片 / 列表 / 紧凑网格

Choose a tag to compare

@chinachat chinachat released this 12 Sep 07:36

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 代码块与主题代码高亮打架导致的配色错乱

Choose a tag to compare

@chinachat chinachat released this 12 Sep 07:12

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.3frontend.css 变了,必须换缓存号,否则浏览器读旧文件)。


⬆️ 升级步骤

下载 aurora-star.zip,在 外观 → 主题 → 添加新主题 → 上传主题 安装并启用即可。

  • 无需重新渲染文章——这次是纯样式修复,在显示时生效。
  • 若升级后颜色没变,按 Ctrl+F5 强制刷新(CSS 带了新的版本号,正常情况下会自动失效)。

✅ 验证

新增 test-css-layering.php,把这条约束固化下来:

  • 模块样式表不得<pre> / <code> 设置 backgroundcolor
    borderpaddingfont-sizeline-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 发布插件并入主题,并修复线上页面显示问题

Choose a tag to compare

@chinachat chinachat released this 12 Sep 07:02

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 wptexturizewpautopshortcode_unautop 核心
11 do_shortcodeaurora_star_lightbox_images 核心 / 主题

生命周期对应关系

主题没有 register_activation_hookuninstall.php,对应关系为:

插件 主题
激活钩子 → Mdp_Plugin::on_activate() after_switch_theme
uninstall.php 的清理 switch_themeaurora_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">&lt;/code&gt; 时注意。
             &lt;/p&gt;&lt;p&gt;示例 [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,旧文章会在编辑页提示
「解析器已更新」。


⬆️ 升级步骤

  1. 下载 aurora-star.zip,在 外观 → 主题 → 添加新主题 → 上传主题 安装并启用。
  2. 停用独立的 Markdown 发布器 插件(不要勾选"删除插件时同时删除设置项")。
  3. 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 会把主题自己的 使用文档.mdREADME.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 — 代码块里的短码不该被执行

Choose a tag to compare

@chinachat chinachat released this 12 Sep 06:09

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>

文档里本该显示的短码示例,被执行了。而且属性里的引号在粘贴时被转义成
&quot;,于是解析出 aurora-star-btn-quotprimaryquot 这种垃圾类名。

同类问题还有:

页面上的实际输出 应该显示
<iframe src=".../embed/quotVIDEO_IDquot"> [youtube id="VIDEO_ID"]
class="language-quotpythonquot" language-python
target="&quot;_blank&quot;" target="_blank"
<i class="&quot;fa-solid" style="color:&quot;#f59e0b&quot;"> [icon name="fa-solid ..."]

WordPress 核心不保护 <pre> 里的短码。 Gutenberg 代码块、Markdown 插件输出的
代码块、直接粘贴的文档,都会被 do_shortcode 把示例代码当成真短码执行。

🔧 修复

一、<pre> 内的短码不再执行

the_content 优先级 8 把 <pre>…</pre> 内的 [ ] 转义为 &#91; &#93;
页面仍显示为 [ ],但 do_shortcode 不再匹配。

顺序很重要:先转义 <pre> 内方括号,再做 [code] 的 base64 保护 —— 反过来
的话,写在 <pre> 里的 [code] 会先变成占位短码、随后仍被执行。

二、被转义的短码属性还原

lang="&quot;python&quot;" 现在正确归一化为 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">
        &#91;button href=&quot;https://example.com&quot; color=&quot;primary&quot;&#93;立即查看&#91;/button&#93;
      </code></pre>

浏览器里显示为 [button href="https://example.com" color="primary"]立即查看[/button]
—— 正是文档需要的效果。

同时确认不会误伤:正文里正常使用的 [code lang="python"]…[/code] 依然照常执行渲染。

🧪 验证

新增 7 项用例直接复现你页面的真实内容形态:围栏里的 [button]/[code]/[youtube]
不被执行、lang 与属性还原、普通 mdp-pre 代码块不被误伤、正文里正常的短码仍正常执行。

短代码测试 56 → 73 项,累计 255 项全部通过

📌 页面上还剩两处非主题问题

这两处需要你在编辑器里改,主题改不了:

  1. 第 11 个代码块内容错乱,是一堆转义碎片
    &lt;/code&gt;&lt;/h3&gt;\n&lt;pre class="mdp-pre"&gt;…)——粘贴时 markdown 结构断了,
    建议删掉这一块重贴
  2. 文章开头写着「主题版本:1.5.0」,那是文章正文内容,和主题实际版本无关;
    这篇文档可以更新到最新版

📦 安装

下载 aurora-star.zip → 后台 外观 → 主题 → 添加新主题 → 上传主题 → 安装并启用。

升级后那篇文档页的代码示例会自动恢复正确显示,不需要改文章内容

需 WordPress ≥ 6.0 / PHP ≥ 7.4。

v1.5.2 — 修复 [code] 与目录锚点的冲突

Choose a tag to compare

@chinachat chinachat released this 12 Sep 05:49

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>&lt;h2 id="aurora-star-toc-2-代码里的标题"&gt;代码里的标题&lt;/h2&gt;</code></pre>
                                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                        代码示例里被塞进了一个 id 属性

两个后果:

  1. 代码示例被改动 —— 高亮出来的不是作者写的内容
  2. 目录编号被挤占 —— 代码里的假标题也占了一个 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>&lt;h2&gt;代码里的标题&lt;/h2&gt;</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 — 修复短代码破坏布局

Choose a tag to compare

@chinachat chinachat released this 12 Sep 05:40

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>&lt;br /&gt;
function foo() {&lt;br /&gt;
    return 1;&lt;br /&gt;
}&lt;br /&gt;</code></pre>

修复后输出:
<pre><code>function foo() {
    return 1;
}</code></pre>

含空行时更糟,</p><p> 会漏进代码块:

修复前:line1&lt;/p&gt;
       &lt;p&gt;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 — 页脚重构与友情链接

Choose a tag to compare

@chinachat chinachat released this 12 Sep 04:58

Aurora Star v1.5.0 — 页脚重构与友情链接

页脚以前把版权、备案、公安备案、主题署名、IP 署名全部挤在一行用 · 分隔,
信息一多就非常拥挤。这一版重新组织,并补上友情链接模块。

📐 新的页脚结构

友情链接   友站 A   友站 B              ← 分配了「友情链接」菜单时显示
关于   联系   隐私政策                   ← 页脚导航菜单

© 2026 站点名                            ← 版权
京ICP备00000000号 · 🛡 京公网安备…        ← 备案(单独一行)
由 Aurora Star 极光主题 驱动 · IP Geolocation by DB-IP   ← 署名
  • 备案与公安备案单独占一行,不再和版权文案混在一起
  • 两者都留空时整行不输出,不留空白
  • 版权、备案、署名各自是独立的 <p>,移动端会自动换行而非横向挤压

🔗 友情链接

新增独立的「友情链接」菜单位置,不占用页脚导航:

  1. 外观 → 菜单 → 新建菜单(如「友情链接」)
  2. 添加自定义链接(友站名称 + 网址)
  3. 在「显示位置」勾选 友情链接 → 保存
  • 显示在页脚顶部,与页脚导航之间有分隔线
  • 支持主题的菜单图标功能(菜单项「图标」字段填 Font Awesome 类名)
  • 未分配菜单时该区域完全不输出,不留空白

🎯 主题署名与链接行为

  • 页脚「由 Aurora Star 极光主题 驱动」中的主题名现在指向
    GitHub 仓库,可用过滤器替换:

    add_filter( 'aurora_star_theme_url', function () {
        return 'https://your-site.com/';
    } );
  • 页脚导航与友情链接的链接一律新标签页打开,并自动补上 rel="noopener noreferrer"
    仅作用于 footerfriends 两个位置,主导航不受影响。如需关闭:

    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。