diff --git a/assets/admin/src/schema/sections/post-list/list.js b/assets/admin/src/schema/sections/post-list/list.js index fdbad150..d4402757 100644 --- a/assets/admin/src/schema/sections/post-list/list.js +++ b/assets/admin/src/schema/sections/post-list/list.js @@ -10,7 +10,7 @@ export const listSchema = { post_show_views: true, post_show_category: true, post_excerpt_length: 120, - post_pagination_mode: 'numeric', + post_pagination_mode: 'numbered', ias_max: 3, ajax_trigger_text: '', ajax_nomore_text: '', @@ -80,8 +80,8 @@ export const listSchema = { title: '分页方式', icon: 'fas fa-ellipsis-h', fields: [ - { key: 'post_pagination_mode', label: '分页模式', type: 'radio', default: 'numeric', options: [ - { label: '数字分页', value: 'numeric' }, + { key: 'post_pagination_mode', label: '分页模式', type: 'radio', default: 'numbered', options: [ + { label: '数字分页', value: 'numbered' }, { label: '加载更多', value: 'load_more' }, { label: '无限滚动', value: 'infinite' }, ]}, diff --git a/inc/classes/admin/class-aksrt-admin-schema-provider.php b/inc/classes/admin/class-aksrt-admin-schema-provider.php index 0dbac292..bbda23dd 100644 --- a/inc/classes/admin/class-aksrt-admin-schema-provider.php +++ b/inc/classes/admin/class-aksrt-admin-schema-provider.php @@ -333,7 +333,17 @@ class AKSRT_Admin_Schema_Provider { private function get_all_fields(array $schema): array { $fields = []; foreach ($schema['groups'] ?? [] as $group) { + if (!is_array($group)) { + continue; + } foreach ($group['fields'] ?? [] as $field) { + if (!is_array($field) || empty($field['key'])) { + continue; + } + // Notice/help-only rows are UI chrome, not stored settings keys. + if (($field['type'] ?? '') === 'notice') { + continue; + } $fields[] = $field; } } diff --git a/inc/classes/admin/schema/class-aksrt-admin-schema-permissions.php b/inc/classes/admin/schema/class-aksrt-admin-schema-permissions.php index f429a38e..000f000a 100644 --- a/inc/classes/admin/schema/class-aksrt-admin-schema-permissions.php +++ b/inc/classes/admin/schema/class-aksrt-admin-schema-permissions.php @@ -151,13 +151,13 @@ class AKSRT_Admin_Schema_Permissions { ['key' => 'enabled', 'label' => '启用审核系统', 'type' => 'switch', 'default' => false], ]], ['key' => 'akismet', 'title' => 'Akismet', 'fields' => [ - ['key' => 'akismet_enabled', 'label' => '启用 Akismet', 'type' => 'switch', 'default' => false, 'dependsOn' => 'enabled'], + ['key' => 'akismet_enabled', 'label' => '启用 Akismet', 'type' => 'switch', 'default' => false, 'dependsOn' => ['key' => 'enabled', 'value' => true]], ['key' => 'akismet_site_url', 'label' => 'Site URL', 'type' => 'input', 'default' => '', 'dependsOn' => ['key' => 'akismet_enabled', 'value' => true]], ['key' => 'akismet_blog_lang', 'label' => '博客语言', 'type' => 'input', 'default' => 'zh-CN', 'dependsOn' => ['key' => 'akismet_enabled', 'value' => true]], ['key' => 'akismet_api_key', 'label' => 'API Key', 'type' => 'input', 'inputType' => 'password', 'default' => '', 'dependsOn' => ['key' => 'akismet_enabled', 'value' => true]], ]], ['key' => 'ai', 'title' => 'AI 审核', 'fields' => [ - ['key' => 'ai_enabled', 'label' => '启用 AI 审核', 'type' => 'switch', 'default' => false, 'dependsOn' => 'enabled'], + ['key' => 'ai_enabled', 'label' => '启用 AI 审核', 'type' => 'switch', 'default' => false, 'dependsOn' => ['key' => 'enabled', 'value' => true]], ['key' => 'ai_api_hint', 'label' => '审核 API 配置', 'type' => 'notice', 'alertType' => 'info', 'alertContent' => 'API 接入(百度/阿里云等)在「扩展 → API内容审核」中统一配置,此处仅控制审核范围和策略。', 'dependsOn' => ['key' => 'ai_enabled', 'value' => true]], ['key' => 'ai_moderate_comments', 'label' => '用户评论', 'type' => 'switch', 'default' => true, 'dependsOn' => ['key' => 'ai_enabled', 'value' => true]], ['key' => 'ai_moderate_background', 'label' => '用户资料背景', 'type' => 'switch', 'default' => true, 'dependsOn' => ['key' => 'ai_enabled', 'value' => true]], @@ -167,15 +167,15 @@ class AKSRT_Admin_Schema_Permissions { ['key' => 'high_risk_min_score', 'label' => '高风险下限', 'type' => 'number', 'default' => 80, 'min' => 0, 'max' => 100, 'dependsOn' => ['key' => 'ai_enabled', 'value' => true]], ]], ['key' => 'keywords', 'title' => '关键词拦截', 'fields' => [ - ['key' => 'blocked_keywords', 'label' => '屏蔽关键词列表', 'type' => 'textarea', 'default' => '', 'rows' => 4, 'dependsOn' => 'enabled'], + ['key' => 'blocked_keywords', 'label' => '屏蔽关键词列表', 'type' => 'textarea', 'default' => '', 'rows' => 4, 'dependsOn' => ['key' => 'enabled', 'value' => true]], ]], ['key' => 'rate-limit', 'title' => '频率限制', 'fields' => [ - ['key' => 'rate_limit_enabled', 'label' => '启用频率限制', 'type' => 'switch', 'default' => false, 'dependsOn' => 'enabled'], + ['key' => 'rate_limit_enabled', 'label' => '启用频率限制', 'type' => 'switch', 'default' => false, 'dependsOn' => ['key' => 'enabled', 'value' => true]], ['key' => 'rate_limit_min_interval', 'label' => '最小间隔(秒)', 'type' => 'number', 'default' => 8, 'min' => 1, 'max' => 300, 'dependsOn' => ['key' => 'rate_limit_enabled', 'value' => true]], ['key' => 'rate_limit_max_per_hour', 'label' => '每小时上限', 'type' => 'number', 'default' => 15, 'min' => 1, 'max' => 200, 'dependsOn' => ['key' => 'rate_limit_enabled', 'value' => true]], ]], ['key' => 'geoip', 'title' => 'GeoIP 拦截', 'fields' => [ - ['key' => 'geoip_enabled', 'label' => '启用 GeoIP 拦截', 'type' => 'switch', 'default' => false, 'dependsOn' => 'enabled'], + ['key' => 'geoip_enabled', 'label' => '启用 GeoIP 拦截', 'type' => 'switch', 'default' => false, 'dependsOn' => ['key' => 'enabled', 'value' => true]], ['key' => 'geoip_hint', 'label' => 'IP 数据源', 'type' => 'notice', 'alertType' => 'info', 'alertContent' => '复用「扩展 → IP归属地」中配置的数据源和 API Key。', 'dependsOn' => ['key' => 'geoip_enabled', 'value' => true]], ['key' => 'geoip_block_countries', 'label' => '屏蔽国家/地区', 'type' => 'custom', 'default' => [], 'sanitize_type' => 'array', 'dependsOn' => ['key' => 'geoip_enabled', 'value' => true]], ]], @@ -186,7 +186,10 @@ class AKSRT_Admin_Schema_Permissions { 'title' => '基本权限', 'version' => '1.0.0', 'option_key' => 'aksrt_settings', - 'groups' => self::build_cap_matrix_groups(), + // Live editing uses PermissionsCapabilities.vue + /permissions/capabilities. + // Keep an empty schema contract here so domain build() does not fatally call + // a missing build_cap_matrix_groups() helper when loading login/moderation. + 'groups' => [], ], ], ];