diff --git a/src/Admin/Native/PayChargeCards.php b/src/Admin/Native/PayChargeCards.php
index 1fb3c59e..3667b5ae 100644
--- a/src/Admin/Native/PayChargeCards.php
+++ b/src/Admin/Native/PayChargeCards.php
@@ -839,7 +839,8 @@ class PayChargeCards {
*/
private function field_row(string $title, string $html, array $deps = [], string $desc = ''): void {
$dep_attr = $deps ? ' data-dep="' . esc_attr((string) wp_json_encode($deps)) . '"' : '';
- echo '
| ' . esc_html($title) . ' | ' . $html; // phpcs:ignore WordPress.Security.EscapeOutput -- 内部构造,已转义。
+ $hidden = ($deps && !$this->deps_visible($deps)) ? ' style="display:none;"' : '';
+ echo ' |
|---|
| ' . esc_html($title) . ' | ' . $html; // phpcs:ignore WordPress.Security.EscapeOutput -- 内部构造,已转义。
if ($desc !== '') {
echo ' ' . wp_kses_post($desc) . ' ';
}
@@ -850,7 +851,72 @@ class PayChargeCards {
* @param array $deps
*/
private function submessage_row(array $deps, string $content): void {
- echo '' . $content . ' | '; // phpcs:ignore WordPress.Security.EscapeOutput -- 文案已转义。
+ $hidden = $this->deps_visible($deps) ? '' : ' style="display:none;"';
+ echo '' . $content . ' | '; // phpcs:ignore WordPress.Security.EscapeOutput -- 文案已转义。
+ }
+
+ /**
+ * 服务端按表单默认值预判依赖可见性(求值规则与行内 JS 一致)。
+ * 参考主题 CSF 的 dependency 在 DOM ready 后才隐藏不满足项,首帧会闪现全部字段;
+ * 此处在渲染期直接置 display:none,修正「导入提醒初始全部显示」的问题。
+ *
+ * @param array $deps
+ */
+ private function deps_visible(array $deps): bool {
+ foreach ($deps as $dep) {
+ $v = (string) $this->default_form_value((string) ($dep['key'] ?? ''));
+ $val = (string) ($dep['val'] ?? '');
+ switch ((string) ($dep['op'] ?? '')) {
+ case '==':
+ if ($v !== $val) {
+ return false;
+ }
+ break;
+ case '!=':
+ if ($v === $val) {
+ return false;
+ }
+ break;
+ case 'any':
+ if (!in_array($v, explode(',', $val), true)) {
+ return false;
+ }
+ break;
+ case 'checked':
+ if ($v === '') {
+ return false;
+ }
+ break;
+ case 'unchecked':
+ if ($v !== '') {
+ return false;
+ }
+ break;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * 表单字段的初始默认值(须与 field_row/button_set/spinner 渲染的默认值保持同步)。
+ * 未列出的键按空字符串处理,与行内 JS formVal 找不到元素时返回 '' 的行为一致。
+ */
+ private function default_form_value(string $key): string {
+ switch ($key) {
+ case 'add_type':
+ return 'auto';
+ case 'type':
+ return 'balance';
+ case 'auto_top_s':
+ case 'only_pass_s':
+ return '';
+ case 'vip_exchange[time]':
+ return '';
+ case 'vip_exchange[unit]':
+ return 'month';
+ default:
+ return '';
+ }
}
/**
@@ -980,6 +1046,12 @@ class PayChargeCards {
document.addEventListener('change', function (e) {
if (e.target.closest('.aksrt-cardpass-form')) evalDeps();
});
+ // 初始按默认值求值一次:服务端已预隐藏,这里兜底校正。
+ if (document.readyState === 'loading') {
+ document.addEventListener('DOMContentLoaded', evalDeps);
+ } else {
+ evalDeps();
+ }
document.addEventListener('click', function (e) {
var el = e.target.closest('[data-clipboard-text]');
if (!el) return;
|
|---|