Files
hesu-JT/docs/THEME-AUDIT-2026-08-17.md
T

101 lines
9.4 KiB
Markdown
Raw Normal View History

2026-08-27 11:54:26 +08:00
# 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`,消除双胞胎漂移)