## 修复方案 ### 1. 删除废弃的静态 action 入口 修改 `assets/js/runtime/main.js`: - 完整删除全局 `_win.bd.on('click', '[data-action]', ...)` 委托。 - 完整删除仅被该委托调用的 `action_ajax()` 函数。 - 保留紧随其后的独立 `[ajax-action]` 处理器以及其他合法的 `data-action` 属性读取。 - 不创建 `assets/action/action.php`,不增加兼容代理,不把旧协议映射到新接口。 仓库内文章互动、评论点赞、关注等已有 WordPress AJAX/REST 实现,因此这是单一路径硬切换。 ### 2. 精确同步运行时压缩产物 修改 `assets/js/runtime/main.min.js`: - 从唯一 `_win.bd.on("click","[data-action]"` 起点,精确删除到下一个 `_win.bd.on("click","[ajax-action]"` 起点之前的旧压缩块。 - 不执行全量前端构建,以免覆盖或重新格式化其他已有运行时产物。 - 删除后确认 `[ajax-action]` 处理器仍存在,`action_ajax` 和 `/action/action.php` 均消失。 当前该文件虽然出现在状态列表中,但内容与 HEAD 完全一致,因此可安全形成仅针对旧块的内容差异。 ### 3. 增加硬切换契约测试 新增 `tests/widget-system/runtime-action-hard-cut-contract.test.cjs`: - 同时检查 `main.js` 与 `main.min.js`。 - 断言旧全局 `[data-action]` 委托不存在。 - 断言 `action_ajax` 不存在。 - 断言 `/action/action.php` 不存在。 - 断言独立 `[ajax-action]` 处理器仍保留且只有一份。 - 不禁止整个仓库使用 `data-action`,避免误伤下载、弹窗和其他新业务属性。 ### 4. 验证 - 运行新增的 runtime action 契约测试。 - 运行全部 `tests/widget-system/*.test.cjs`。 - 使用 `rg` 检查源码和压缩产物中不存在 `action/action.php`、`action_ajax` 和旧委托。 - 执行 `git diff --check`,确认没有格式问题。 - 不做真实视觉验收,不恢复静态 PHP 直连入口。 ### 5. 提交 从当前 `origin/main` 创建 `worktree/fix-legacy-action-404` 分支,只提交: - `assets/js/runtime/main.js` - `assets/js/runtime/main.min.js` - `tests/widget-system/runtime-action-hard-cut-contract.test.cjs` 现有其他 CSS、JavaScript 状态项和 `.zcode/plans` 文件不进入提交。验证通过后推送该分支到远端。