打开 yangyq.net 任意页面,浏览器控制台会打印:
Kratos v3.1.8 https://code.yangyq.net/laoyang/wordpress-kratos-yang
两处不对:
Kratos Yang
Kratos
assets/js/kratos.js:8
var KRATOS_VERSION = '3.1.8'
全文只有 assets/js/kratos.js:140 一处使用:
assets/js/kratos.js:140
var consoleConfig = function () { console.log('\n Kratos v' + KRATOS_VERSION + '\n\n https://code.yangyq.net/laoyang/wordpress-kratos-yang \n\n') }
assets/js/kratos.min.js 是压缩产物,里面把 Kratos v3.1.8 当字符串字面量写死了(无构建脚本,是手工压缩的)。
assets/js/kratos.min.js
Kratos v3.1.8
版本号的唯一真源本来就已在 PHP 侧:functions.php:9
functions.php:9
define('THEME_VERSION', wp_get_theme()->get('Version'));
JS 里再存一份副本必然漂移 —— 事实也漂了 9 个小版本。
不留第二份版本号。
var KRATOS_VERSION
inc/theme-core.php:101
wp_localize_script('kratos', 'kratos', $data)
'version' => THEME_VERSION
consoleConfig()
kratos.version
Kratos Yang v<版本>
输出的目标:
Kratos Yang v4.1.1 https://code.yangyq.net/laoyang/wordpress-kratos-yang
hm.js?192a62f2ae923a591128f92554cc80e0:2 [Violation] Permissions policy violation: unload is not allowed in this document.
Permissions-Policy
curl -I
unload
assets/js/kratos.js
kratos.min.js
3.1.8
'Kratos v'
style.css
Version:
kratos is not defined
本单由需求拆解生成,主单 laoyang/wordpress-kratos-yang #34。
线上实测:4.1.1 的 kratos.min.js 里确实还是 Kratos v3.1.8,用户报的问题已在线上复现。
修改方式不是把 3.1.8 换成 4.2.0(下个版本还得再改一次),而是删掉这份副本:
4.2.0
window.kratos.version
inc/theme-core.php
wp_localize_script
$data
4.1.1
现在版本号只有一份真源:functions.php 的 THEME_VERSION ← style.css 的 Version:。
functions.php
THEME_VERSION
wp_localize_script 在脚本标签之前注入,所以 kratos.min.js 执行时 window.kratos 已经存在,不存在时序问题。
window.kratos
取不到时只打印 Kratos Yang,不凭空补默认版本号 —— 后台预览、维护页这些没走 wp_enqueue_scripts 的场景不该在控制台报错。
wp_enqueue_scripts
线上真实 min.js 运行时验证(node vm 真跑,不是 grep)
[OK] 线上 min.js 可取(HTTP 200) [OK] 线上当前仍是旧标识 Kratos v3.1.8(复现用户报的问题) [OK] 线上旧版实际打印 Kratos v3.1.8:["\n Kratos v3.1.8\n\n ... \n\n"] [OK] 包内 min.js 无旧串 Kratos v3 [OK] 包内脚本在 version=4.2.0 时输出 Kratos Yang v4.2.0:["\n Kratos Yang v4.2.0\n\n ... \n\n"] [OK] 注入 9.9.9-probe ⇒ 输出跟着变(版本号单一真源): ["\n Kratos Yang v9.9.9-probe\n\n ... \n\n"] [OK] 无 kratos 对象时不抛错 [OK] 无版本号时仍打印 Kratos Yang [OK] 无版本号时不凭空补版本号:["\n Kratos Yang\n\n ... \n\n"] 结果:全部通过(10 条)
「注入 9.9.9-probe 输出跟着变」这条是版本号单一真源的端到端证明:只改 style.css 一个数,控制台输出就跟着变。
本地三层判据
_console421_check.py
_console421_falsify.py
_console421_meta_falsify.py
反证覆盖了「只改源码不重新压缩」「硬编码成本版号 4.1.1(修了一半)」「取不到时凭空补默认号」「PHP 不再注入」等实际可能犯的错。
已上传 kratos_yang-4.2.0.zip 到站点根 /theme-update/,md5 044493c31e7ea14850de7adbb6520e51,公网 HTTP 200、md5 与本地一致、unzip -t 无错。
kratos_yang-4.2.0.zip
/theme-update/
044493c31e7ea14850de7adbb6520e51
unzip -t
update.json 已指向 4.2.0,PUC 实测 INSTALLED=4.1.1 / NEW=4.2.0 / HAS_UPDATE=YES(已清 transient)。
update.json
INSTALLED=4.1.1 / NEW=4.2.0 / HAS_UPDATE=YES
提交:c058ecc,已推送到 main。
c058ecc
用户已在后台升级到 4.2.0,控制台实测:
kratos.min.js?ver=4.2.0:1 Kratos Yang v4.2.0 https://code.yangyq.net/laoyang/wordpress-kratos-yang
✅ 用户报的 Kratos v3.1.8 已消失 ✅ 品牌名改为 Kratos Yang ✅ 版本号 v4.2.0 来自 style.css 单一真源
v4.2.0
style.css Version: 4.2.0 ↓ functions.php define('THEME_VERSION', wp_get_theme()->get('Version')) ↓ inc/theme-core.php:103 $data['version'] => THEME_VERSION ↓ wp_localize_script → <script id="kratos-js-extra">var kratos = {"version":"4.2.0",...} ↓ assets/js/kratos.min.js window.kratos.version ↓ console.log('\n Kratos Yang' + ' v' + ver + ...)
线上 HTML 里能看到注入结果(第 10 个内联脚本):
var kratos = {"version":"4.2.0","site":"https://yangyq.net","directory":"...",...}
theme 文件数 239(与发布包一致) Version: 4.2.0 kratos.min.js Kratos Yang(Kratos v3 清零) inc/theme-core.php:103 'version' => THEME_VERSION
判据保持全绿:正向 23/0 · 反证 6/6 · 反证的反证 5/5 · 线上运行时 10/0。
关闭工单。
No dependencies set.
The note is not visible to the blocked user.
现象
打开 yangyq.net 任意页面,浏览器控制台会打印:
两处不对:
Kratos Yang,控制台却仍报Kratos。根因
assets/js/kratos.js:8全文只有
assets/js/kratos.js:140一处使用:assets/js/kratos.min.js是压缩产物,里面把Kratos v3.1.8当字符串字面量写死了(无构建脚本,是手工压缩的)。版本号的唯一真源本来就已在 PHP 侧:
functions.php:9JS 里再存一份副本必然漂移 —— 事实也漂了 9 个小版本。
改法
不留第二份版本号。
var KRATOS_VERSION。inc/theme-core.php:101那个交给wp_localize_script('kratos', 'kratos', $data)的数组里加一个'version' => THEME_VERSION。consoleConfig()改成读kratos.version,文案改为Kratos Yang v<版本>。assets/js/kratos.min.js同步改(它虽是压缩产物,但当前无构建链,需手工保持一致)。输出的目标:
不在本次范围:那条 hm.js 告警
Permissions-Policy(curl -I已实测),是 Chrome 对unload的默认策略收紧。验收标准
assets/js/kratos.js与kratos.min.js中不再出现字面量3.1.8,也不再出现'Kratos v'这种拼法。Kratos Yang v<版本>,版本号与style.css的Version:逐字一致。style.css的Version:改成任意值,控制台输出必须跟着变(若不变则说明 JS 里还有副本)。kratos is not defined(localize 在脚本加载前注入)。已交付
线上实测:4.1.1 的
kratos.min.js里确实还是Kratos v3.1.8,用户报的问题已在线上复现。修改方式不是把
3.1.8换成4.2.0(下个版本还得再改一次),而是删掉这份副本:assets/js/kratos.jsvar KRATOS_VERSION = '3.1.8';consoleConfig()改从window.kratos.version取assets/js/kratos.min.jsinc/theme-core.phpwp_localize_script的$data数组加'version' => THEME_VERSIONstyle.css4.1.1→4.2.0现在版本号只有一份真源:
functions.php的THEME_VERSION←style.css的Version:。为什么是可以直接取的
wp_localize_script在脚本标签之前注入,所以kratos.min.js执行时window.kratos已经存在,不存在时序问题。取不到时只打印
Kratos Yang,不凭空补默认版本号 —— 后台预览、维护页这些没走wp_enqueue_scripts的场景不该在控制台报错。验证
线上真实 min.js 运行时验证(node vm 真跑,不是 grep)
「注入 9.9.9-probe 输出跟着变」这条是版本号单一真源的端到端证明:只改
style.css一个数,控制台输出就跟着变。本地三层判据
_console421_check.py_console421_falsify.py_console421_meta_falsify.py反证覆盖了「只改源码不重新压缩」「硬编码成本版号 4.1.1(修了一半)」「取不到时凭空补默认号」「PHP 不再注入」等实际可能犯的错。
部署
已上传
kratos_yang-4.2.0.zip到站点根/theme-update/,md5044493c31e7ea14850de7adbb6520e51,公网 HTTP 200、md5 与本地一致、unzip -t无错。update.json已指向 4.2.0,PUC 实测INSTALLED=4.1.1 / NEW=4.2.0 / HAS_UPDATE=YES(已清 transient)。提交:
c058ecc,已推送到 main。升级后最终验收通过
用户已在后台升级到 4.2.0,控制台实测:
✅ 用户报的
Kratos v3.1.8已消失✅ 品牌名改为
Kratos Yang✅ 版本号
v4.2.0来自style.css单一真源注入链路端到端打通
线上 HTML 里能看到注入结果(第 10 个内联脚本):
升级后文件完整性
判据保持全绿:正向 23/0 · 反证 6/6 · 反证的反证 5/5 · 线上运行时 10/0。
关闭工单。