Files
hesu-JT/docs/THEME-AUDIT-2026-08-17.md
T
2026-08-27 11:54:26 +08:00

101 lines
9.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# HESU 主题综合审计报告与优化方案
- 日期:2026-08-17
- 对象:`hesu-theme/hesu/`(v2 同步版,commit 48b6a3a)+ 测试站实测(WP 7.0.4 / CF7 6.1.6 / PHP 8.2)
- 方法:三路并行审计(性能/SEO、安全/兼容/运维、代码遗留/编辑器 UX/可访问性),实测验证(curl/Playwright/DB 查询/无害表单提交),交叉去重后综合
---
## 一、总体结论
**架构层健康**:条件资产加载、三层结构锁定、转义纪律(v2 新增输出零违规)、幂等 seed、CF7 降级路径、编辑器加固实测全部成立。**真正的问题集中在四条线**:
1. **图片管线是性能瓶颈**——首页总传输 ~5.8MB(图片占 95%),手写 `<img>` 无 srcset、首屏下方大图无 lazy、LCP 走 CSS 背景最差模式、24 个 >500KB 未压缩图;测试库还有 123MB reseed 重复侧载尸体。
2. **SEO 三缺**——OG/Twitter 卡片全站缺失(外贸 B2B 分享场景直接损失)、single-news 双 H1 / about-us 无 H1、96 个附件 alt 全空。
3. **两处"文档/文案与事实不符"**——HESU Tools 页声称"编辑过的页面不受影响"(实际 reseed 会删并重建);readme 声称 15 篇新闻/有 Mega Menu 文案设置(实际 4 篇/已删)。
4. **公网表单滥用面**——无反垃圾,实测可脚本无限灌表(运维配置项,非代码缺陷)。
另有一批 **v1 遗留死代码**(v2 同步后 11 项可安全删除)与若干编辑器 UX 打磨点。
---
## 二、发现明细(去重后按严重度)
### 🔴 高
| # | 发现 | 证据 | 影响 |
|---|---|---|---|
| H1 | 手写 `<img>` 全部无 srcset/sizes | hero/business-intro/media-card/large-image/news hero 的 render.php 直出 `<img src>`(对照:news-grid 用 `the_post_thumbnail` 有 srcset ✓) | 手机端下载全尺寸大图,多耗 2.5-3MB |
| H2 | LCP 走 CSS 背景图(最差模式) | `style.css:367` hero-bg 引用 banner.jpg 908KB,CSS 背景无 preload/fetchpriority;WP 把 fetchpriority=high 给了页面底部新闻图 | 4G 移动端 LCP 预计 >4s |
| H3 | 首屏下方大图无懒加载 | global-map.png(1.4MB)/introfuction2.png(953KB)/media-card 卡图均无 `loading="lazy"` | 首屏外 ~2MB 提前下载 |
| H4 | 24 个图片 >500KB 未压缩 | global-map.png 1.4MB、home-bgs.png 1.2MB、banner.jpg 908KB 等;统一压缩+WebP 可 -70% | 全站每次访问多传 ~4MB |
| H5 | OG/Twitter 卡片全站缺失 | 4 页实测 `og:`/`twitter:` = 0 | 社交分享无标题无图 |
| H6 | 标题结构硬伤 | single-news 双 H1("NEWS" + 文章标题);about-us 全页 0 个 H1 | 搜索引擎语义混乱 |
| H7 | 表单可被脚本无限提交 | 实测 REST 直发全字段通过校验到发信阶段;无蜜罐/reCAPTCHA/频率限制 | 公网垃圾灌箱、SMTP 配额耗尽 |
| H8 | **HESU Tools 文案误导**(`settings-page.php:47`) | 称"手动新建/编辑过的页面与文章不受影响"——实际 reseed 按 slug/meta 删除重建 seed 页面与新闻,后台修改会被覆盖 | 真实数据丢失事故诱因 |
| H9 | **readme.txt 与事实不符** | 称"15 篇示例新闻"(实际 4);称自定义项含"Mega Menu 文案"(v2 已删) | 交付即误导 |
### 🟡 中
| # | 发现 | 证据 | 影响 |
|---|---|---|---|
| M1 | 96/96 附件 alt 全空;mediaPicker 无 alt 编辑 | DB 查询 with_alt=0;helpers.js onSelect 不含 alt 控件 | 图片搜索流量丢失;编辑 alt 需媒体库往返 |
| M2 | v1 死代码 11 项(可安全删除清单见附录 A) | section-heading 整块、stat bp 变体+4 SVG、hero showScroll/bgAlt、cap svgIcon、feature-card ae-marker+13 SVG、product-card 5 SVG+icon 枚举、banner-cell kicker、css/style.css 双胞胎等 | 维护面虚胖;inserter 噪音 |
| M3 | 结构化数据为零 | 无 Organization/Article/BreadcrumbList JSON-LD | 无富摘要资格 |
| M4 | reseed 无备份/导出机制 | cleanup 直接删(含用户修改),仅 JS confirm;无 dry-run/版本化 | 高危操作无兜底 |
| M5 | DEPLOYMENT.md 缺"升级主题→内容更新语义"章节 | `hesu_seeded` 守卫使 zip 升级不动 DB 内容;管理员不知道何时该 reseed | 升级后内容不同步的困惑 |
| M6 | 业务 JS 粗粒度加载 + CF7 全站加载 | 任一业务区块→4 个业务 JS(~6.3KB 冗余);CF7 css/js ~26KB 全站;wp-emoji 未移除 | ~30KB 冗余请求/页 |
| M7 | WP/CF7 升级回归点 5 处 | lock.js WP7 类名、Registry::get_instance(WP6 fatal)、canLockBlocks 键、apiVersion 3、CF7 6.x DOM 桥接 | 大版本升级需回归 |
| M8 | 无 screenshot.png / Theme URI 占位 / 37 区块 0 description | Theme Check REQUIRED 级瑕疵;inserter 33 区块无图标难辨认 | 合规与编辑体验 |
| M9 | 整页缓存与 news-grid 冲突 | 服务端 WP_Query,缓存下发新文章首页不刷新 | 上缓存插件时需配失效 |
### 🟢 低 / 记录在案
- 字体无 preload(建议 2 个展示 weight);sitemap 含 users-1.xml(建议关作者归档);archive 分页 meta 未验证(4 篇无第 2 页);首页 H1 纯品牌词(静态设计使然)
- phControl 暴露原始 CSS 类名给编辑者(au-gps ~15 个字段);presence 区块排序异常(注册元数据);GP 全屏无 prefers-reduced-motion 退出(与静态一致,超基线建议);DateTime::createFromFormat 无守卫;style.css 注释 mojibake
- 设计取舍(**明确不改**):mega 菜单键盘不可主动展开(与静态逐字节一致);菜单渲染绕过 wp_nav_menu(Polylang 菜单切换器等不生效);无子主题路径(按"直接改"交付);多语言未验证(范围外);index.js 剩余重复维持现状(YAGNI)
---
## 三、优化方案(分级)
### P0 必改(上线前,~1 天工作量)
| # | 动作 | 改动点 | 收益 |
|---|---|---|---|
| P0-1 | 修复 H8/H9:settings-page 文案改为如实描述("将删除并重建全部预置页面/新闻/菜单,后台修改会被覆盖,执行前请导出备份");readme 更正 4 篇新闻、删除 Mega Menu 文案描述 | 2 个文件 | 消除数据丢失诱因 |
| P0-2 | 修复 H6:single-news 的 hero H1 降为 `<p>`(视觉不变);about-us 的 au-title 升 H1 | 2 个模板各 1 行 | 语义硬伤 |
| P0-3 | 补 OG/Twitter 卡片:`wp_head` 输出 og:title/description/image(featured 或 hero bg)/url/type + twitter:card(~30 行,含 esc) | inc/setup.php 或新 inc/seo.php | 社交分享立即有卡 |
| P0-4 | 懒加载补齐:large-image/media-card/hub-card/presence map/business-intro 图加 `loading="lazy" decoding="async"`(hero 除外) | 各 render.php | 首屏外 -2MB |
| P0-5 | hero LCP:输出 `<link rel="preload" as="image" href=banner>` + hero bg img 加 `fetchpriority="high" decoding="async"`(保持 CSS 背景视觉不变,img 藏 aria-hidden 或改 preload 方案按改动最小者) | header.php wp_head / render | LCP 显著改善 |
| P0-6 | 图片压缩(构建步骤):24 个 >500KB 图批量压(jpg q78 / png→webp 1920px),重建 zip;测试库清空 uploads 后重新 seed(消 123MB 尸体) | image/ + 重播种 | 全站 -70% 传输 |
| P0-7 | 部署文档补"升级语义"章节 + 上线检查单加:CF7 reCAPTCHA/蜜罐 + Flamingo + SMTP + 真实收件箱 + xmlrpc 关闭/REST users 收口 | DEPLOYMENT.md | 运维防线 |
### P1 建议(上线后一周内,~1-2 天)
| # | 动作 | 收益 |
|---|---|---|
| P1-1 | 手写 img 补 srcset:区块图片属性已有 imgId,render 改走 `wp_get_attachment_image()`(带 srcset/sizes/loading 一并解决) | 移动端 -2.5MB |
| P1-2 | mediaPicker 加 alt TextControl(helpers.js ~10 行)+ seed 侧载时写 `_wp_attachment_image_alt`(标题现成) | 图片 SEO + 编辑体验 |
| P1-3 | 死代码清理:按附录 A 清单删 11 项(注意 feature-card/product-card 的模板耦合同步删) | 维护面收缩 |
| P1-4 | Organization + news Article JSON-LD | 富摘要资格 |
| P1-5 | reseed 安全化:执行前自动导出 seed 页面+新闻为 WXML 文件存 wp-content/uploads(或至少 post_content 序列化存 option),页面文案如实警示 | 高危操作兜底 |
| P1-6 | CF7 资产仅 contact 页加载;业务 JS 按页面精确映射(或合并单文件);移除 wp-emoji | -30KB/页 |
| P1-7 | screenshot.png(1200×900 首页截图)+ Theme URI 改真实域名 + 37 区块补 description 字段 | 合规 + 编辑器辨识 |
### P2 可选(按需)
- 字体 preload ×2;sitemap 关 users 归档;phControl 收进 Advanced 折叠组;presence 注册元数据清理;GP `prefers-reduced-motion` 退出劫持;DateTime 守卫;mojibake 清理;缓存插件配套(news 发布失效首页缓存)
### 附录 A:可安全删除清单(P1-3)
1. `blocks/section-heading/` 整目录(seed 零使用)
2. stat bp 分支 + 4 SVG、stats-bar bp 分支、business-intro `slot:'stats'`(成对遗骸,打包删)
3. hero `showScroll`(render+block.json+index.js 三处)+ `bgAlt` 属性
4. cap `svgIcon` + 4 SVG 映射(iconAlt 保留)
5. feature-card `ae-marker` 变体 + x/y/dir/hub 属性 + 13 内置 SVG(**必须连 feature-cards/index.js 模板 icon 预置一起删**——唯一耦合项)
6. feature-cards as-region 模板的 `flag:'CN/AE/GH'`(属性未注册,静默丢弃的死字节)
7. product-card 5 内置 SVG + `icon` 枚举(连 product-cards 模板一起删)
8. banner-cell `kicker` 三处
9. `css/style.css`(先把 editor-style.css 的 @import 改指根 `style.css`,消除双胞胎漂移)