「主题设置 → 写作增强」里,翻译服务商(w_provider)是一个下拉框,选项有 MyMemory / 百度翻译 / 有道翻译。 但下拉框下面的 4 个密钥框一直全部显示:
w_provider
w_baidu_appid
w_baidu_key
w_youdao_appid
w_youdao_key
用户原话:
写作增强部分,选择接口之后,再出现各个 api 的输入框吧,例如选择百度,才出现百度的 api 输入框。
也就是:下拉框选了谁,才出现谁的那一组输入框。选 MyMemory 时四个框都不该出现(它不需要密钥)。
inc/theme-options.php:1366-1378
mymemory
yang_writing_providers()
inc/theme-options.php:1394-1405
type => text
inc/theme-options.php:1419-1425
type => password
inc/theme-options.php:1427-1433
inc/theme-options.php:1435-1443
同一文件里另有 7 处写了 'requires' => 'xxx'(a_auto_enable、a_lightbox_enable、a_highlight_enable), 但 requires 这个键框架根本没读过 —— inc/options-framework/js/options-custom.js(230 行)里 全部是手写的 jQuery('#section-xxx').fadeToggle(400) 硬编码,一条通用条件逻辑都没有。
'requires' => 'xxx'
a_auto_enable
a_lightbox_enable
a_highlight_enable
requires
inc/options-framework/js/options-custom.js
jQuery('#section-xxx').fadeToggle(400)
所以本次不能靠加 'requires' => 'w_provider' 解决,必须写真正的显隐逻辑。 更麻烦的是:那 7 处历史的 requires 是死键,看起来生效全靠有人另外写了一行 JS。 这块要顺手在工单里说清,避免下一个人再被误导。
'requires' => 'w_provider'
info
.section
w_provider_help
type => info
div.section-info
div.section
data-provider
wp_enqueue
admin_enqueue_scripts
options-custom.js
assets/js/writing-admin.js
inc/theme-writing.php
change
std => ''
display:none
aria-hidden
现有 7 处 'requires' 是死键。建议在本次一并核实「哪些真生效、哪些是摆设」, 把不生效的删掉或补上 JS,并在 inc/theme-options.php 顶部加一行说明: requires 不会被框架消费,条件显示一律靠 JS。
'requires'
inc/theme-options.php
在途 10 张单里没有一张涉及主题设置后台表单的条件显示:最新的是 #25(写作增强四引擎自动生成,已发布 3.2.57)、#21~#24(侧栏挂件)、#15~#18(归档短代码)、#16(评论语言选项)。本单是后台 UI 的显隐交互,可独立验收,与原 #25 是同一功能块但完全不同的改动面。
commit 1a31e41(0a5486e..1a31e41 已推送 main)。
1a31e41
0a5486e..1a31e41
进「主题设置 → 写作增强」:
切换下拉框立刻重排,不用保存、不用刷新。
1. 首帧在服务端算好,不靠 JS 兜
$yang_prov_class() 闭包按当前已保存的服务商直接打好 yq-cond-hide。 若只靠 JS,每次进设置页、每次保存后重载都会「四家全显示 → 闪一下 → 收起」。 这和 theme-avatar.php 用 admin_body_class 是同一个思路。
$yang_prov_class()
yq-cond-hide
theme-avatar.php
admin_body_class
2. 两层条件必须在同一个函数里合成
toggleClass(cls, force) 的 force 是绝对赋值,不是取反。如果拆成 「按总开关 toggle 一次」+「按服务商 toggle 一次」两个函数,最终结果只取决于 注册顺序,跟业务无关 —— 表现就是「勾了别名生成、选了百度,百度框时有时无」。
toggleClass(cls, force)
force
3. 分组声明只在 PHP 一处
字段上写 yang-prov(我参与按服务商显示)+ yang-prov-<key>(我属于哪家), JS 只读 class 与下拉框 value 比对,零服务商知识。 如果反过来在 JS 里写 {baidu:[...], youdao:[...]},将来加一家要改两处, 而且两边不一致时不报错,只表现成「新服务商的框永远不出现」。
yang-prov
yang-prov-<key>
{baidu:[...], youdao:[...]}
jQuery show()/hide()
display
flow-root
display:block
.yq-cond-hide { display:none !important }
disabled
_prov_cond_check.php
_prov_js_check.js
_writing_test.php
_admin_writing_check.php
_secret_path_check.php
_mkzip358.py
_mkreadme358.py
反证 11 组全部有牙齿(证明判据不是恒绿):
w_timeout
belongs = true
.on('change','#w_on_slug')
#w_provider
toggleClass
⚠️ 这里有一次真发现:R5 / R6 两个 JS 层注入最初跑出「失败 0 条」—— 9 条 PHP 判据完全没测 JS。JS 坏掉时用户切下拉框毫无反应,测试却全绿。 补了 _prov_js_check.js 12 条之后才把它们揭穿。教训:PHP 判据只能证明 「服务端首帧对」,证明不了「点了之后对」。
kratos_yang-3.2.58.zip
cc7a62e787bf67d54b6947db7cd0b1fa
readme358.html
发布严格按序:传 zip → 传 readme → 验 HTTP 双向 → 最后改 update.json。
update.json
🔴 红线守住:线上 kratos_yang/style.css 仍是 3.2.57, 线上 theme-options.php 里 yang_prov_class 计数为 0。 /theme-update/ 通道已指向 3.2.58,等你在后台点升级,服务器主题目录没被动过。
kratos_yang/style.css
theme-options.php
yang_prov_class
/theme-update/
都对了再关单。
用户 2026-10-27 确认:「这个功能验收吧,没问题了。」
3.2.58 在后台「主题设置 → 写作增强」的实际表现符合需求: 选了哪家服务商,就只有那家的账号输入框出现在页面上,用不上的不再摆着碍事。
style.css
分组声明只在 PHP 一处(字段的 class 上写 yang-prov + yang-prov-<key>), JS 零服务商知识。将来加一家服务商,只改 theme-writing.php 的清单 + 字段的 $yang_prov_class('新key'),不需要动 JS —— 这是刻意避免"两处抄一份映射表、 不一致时静默失效"的后果。
class
theme-writing.php
$yang_prov_class('新key')
关闭。
No dependencies set.
The note is not visible to the blocked user.
现象 / 诉求
「主题设置 → 写作增强」里,翻译服务商(
w_provider)是一个下拉框,选项有 MyMemory / 百度翻译 / 有道翻译。但下拉框下面的 4 个密钥框一直全部显示:
w_baidu_appid)w_baidu_key)w_youdao_appid)w_youdao_key)用户原话:
也就是:下拉框选了谁,才出现谁的那一组输入框。选 MyMemory 时四个框都不该出现(它不需要密钥)。
现状核实(已查过源码,不是猜测)
inc/theme-options.php:1366-1378w_providerselect,std =mymemory,选项来自yang_writing_providers()inc/theme-options.php:1394-1405type => text,无条件渲染inc/theme-options.php:1419-1425type => password,无条件渲染inc/theme-options.php:1427-1433inc/theme-options.php:1435-1443同一文件里另有 7 处写了
'requires' => 'xxx'(a_auto_enable、a_lightbox_enable、a_highlight_enable),但
requires这个键框架根本没读过 ——inc/options-framework/js/options-custom.js(230 行)里全部是手写的
jQuery('#section-xxx').fadeToggle(400)硬编码,一条通用条件逻辑都没有。涉及的坑(先写在单里,实现时必须避开)
info类型不生成.section包裹。w_provider_help(type => info)渲染出来是div.section-info而不是div.section,所以显隐选择器不能统一写.section,要按 id 精确取(这正是
w_provider_help当初特意给了 id 的原因)。将来加服务商(DeepL / 腾讯 / 阿里)时不要每加一个就改一次 JS 分支,
应该由
yang_writing_providers()的 key 驱动,一组一个data-provider属性。wp_enqueue要在admin_enqueue_scripts钩子里。现在
options-custom.js是框架自带文件,不要直接改它(下次升级框架会覆盖)——主题要加自己的
assets/js/writing-admin.js,或者走inc/theme-writing.php里的输出。change事件才生效。验收标准
info的显隐也要跟着走(选 MyMemory 时它里面讲的都是百度/有道,不该显示)w_baidu_key/w_youdao_key仍然是std => ''、留空 = 不修改)display:none内联,配合aria-hidden/ 避免焦点落到隐藏框里附带(建议同单处理,不单独开工单)
现有 7 处
'requires'是死键。建议在本次一并核实「哪些真生效、哪些是摆设」,把不生效的删掉或补上 JS,并在
inc/theme-options.php顶部加一行说明:requires不会被框架消费,条件显示一律靠 JS。备注
线上真实几何测量与部署需等解封,届时会在本单追加评论。
为什么单独建单
在途 10 张单里没有一张涉及主题设置后台表单的条件显示:最新的是 #25(写作增强四引擎自动生成,已发布 3.2.57)、#21~#24(侧栏挂件)、#15~#18(归档短代码)、#16(评论语言选项)。本单是后台 UI 的显隐交互,可独立验收,与原 #25 是同一功能块但完全不同的改动面。
已实现并发布 3.2.58,等你在后台升级后确认
commit
1a31e41(0a5486e..1a31e41已推送 main)。后台实际表现
进「主题设置 → 写作增强」:
切换下拉框立刻重排,不用保存、不用刷新。
三处关键实现选择(都是踩过坑才这么写的)
1. 首帧在服务端算好,不靠 JS 兜
$yang_prov_class()闭包按当前已保存的服务商直接打好yq-cond-hide。若只靠 JS,每次进设置页、每次保存后重载都会「四家全显示 → 闪一下 → 收起」。
这和
theme-avatar.php用admin_body_class是同一个思路。2. 两层条件必须在同一个函数里合成
toggleClass(cls, force)的force是绝对赋值,不是取反。如果拆成「按总开关 toggle 一次」+「按服务商 toggle 一次」两个函数,最终结果只取决于
注册顺序,跟业务无关 —— 表现就是「勾了别名生成、选了百度,百度框时有时无」。
3. 分组声明只在 PHP 一处
字段上写
yang-prov(我参与按服务商显示)+yang-prov-<key>(我属于哪家),JS 只读 class 与下拉框 value 比对,零服务商知识。
如果反过来在 JS 里写
{baidu:[...], youdao:[...]},将来加一家要改两处,而且两边不一致时不报错,只表现成「新服务商的框永远不出现」。
刻意没做的两件事
jQuery show()/hide():.section的display是flow-root(3.2.28 的 BFC 修复),jQuery 会写行内
display:block把它回退掉。统一用
.yq-cond-hide { display:none !important }。disabled输入框:两个密钥字段是「留空=不修改」语义,disabled的字段不随表单提交,会把已保存的密钥冲掉。测试与反证
_prov_cond_check.php(PHP 产品判据,真实 WP 环境)_prov_js_check.js(JS 判据,抽真实函数体 + 最小 jQuery 桩)_writing_test.php_admin_writing_check.php_secret_path_check.php_mkzip358.py打包自检_mkreadme358.pyreadme 四道关卡反证 11 组全部有牙齿(证明判据不是恒绿):
yq-cond-hide、R2 闭包恒返空、R3 分组 key 写错、R4 首帧用 std 而非已保存值、R7 info 混用分组、R8 把
w_timeout也分组、基线belongs = true(4 条失败)、R6.on('change','#w_on_slug')漏掉
#w_provider(4 条失败)、R9 两层拆成两个函数(5 条)、R10toggleClass写成取反(4 条)发布信息
kratos_yang-3.2.58.zip,4818165 字节cc7a62e787bf67d54b6947db7cd0b1fareadme358.html,152178 字节,49 条版本标题发布严格按序:传 zip → 传 readme → 验 HTTP 双向 → 最后改
update.json。🔴 红线守住:线上
kratos_yang/style.css仍是 3.2.57,线上
theme-options.php里yang_prov_class计数为 0。/theme-update/通道已指向 3.2.58,等你在后台点升级,服务器主题目录没被动过。请你确认的点
因为涉及「留空=不修改」的提交语义)。
都对了再关单。
用户已验收通过,关闭
用户 2026-10-27 确认:「这个功能验收吧,没问题了。」
验收结论
3.2.58 在后台「主题设置 → 写作增强」的实际表现符合需求:
选了哪家服务商,就只有那家的账号输入框出现在页面上,用不上的不再摆着碍事。
本次交付汇总
1a31e41(0a5486e..1a31e41,已推送 main)kratos_yang-3.2.58.zip/ 4818165 字节 / md5cc7a62e787bf67d54b6947db7cd0b1fareadme358.html/ 152178 字节 / 49 条版本标题inc/theme-options.php、inc/options-framework/js/options-custom.js、style.css一句话记住这版的设计
分组声明只在 PHP 一处(字段的
class上写yang-prov+yang-prov-<key>),JS 零服务商知识。将来加一家服务商,只改
theme-writing.php的清单 + 字段的$yang_prov_class('新key'),不需要动 JS —— 这是刻意避免"两处抄一份映射表、不一致时静默失效"的后果。
顺带记下的两条通用经验(已进项目红线)
但两个 JS 层致命 bug 的反证仍跑出「失败 0 条」—— 因为 PHP 判据压根不执行 JS。
只测一层而全绿比测出红更危险。
toggleClass(cls, force)的force是绝对赋值不是取反。多层条件拆成多个函数各 toggle 一次,结果只取决于注册顺序 ——
表现成"时有时无"的鬼故事。
关闭。