fix(header): full zibll 1:1 for top multifunc search/cards/admin

Wire hero search through aksrt_get_search_box, device-gated cards/blur (zib_m_pc_is_show), expanded admin schema, and keyword/type UI styles matching zibll header-slider.
This commit is contained in:
2026-07-24 10:43:29 +08:00
parent e35011f2c0
commit 96bd9d949d
7 changed files with 256 additions and 151 deletions
+3 -4
View File
@@ -127,8 +127,8 @@ class SchemaPageDisplay {
['key' => 'search', 'title' => '搜索组件', 'fields' => [
['key' => 'header_components_search_pc', 'label' => 'PC 端显示搜索', 'type' => 'switch', 'default' => true, 'dependsOn' => ['key' => 'header_components_search_enabled', 'value' => true]],
['key' => 'header_components_search_mobile', 'label' => '移动端显示搜索', 'type' => 'switch', 'default' => true, 'dependsOn' => ['key' => 'header_components_search_enabled', 'value' => true]],
['key' => 'header_components_search_show_keywords', 'label' => '显示热门搜索词', 'type' => 'switch', 'default' => false, 'dependsOn' => ['key' => 'header_components_search_enabled', 'value' => true]],
['key' => 'header_components_search_popular_limit', 'label' => '热词数量', 'type' => 'number', 'default' => 5, 'min' => 1, 'max' => 20, 'dependsOn' => ['key' => 'header_components_search_show_keywords', 'value' => true]],
['key' => 'header_components_search_show_keywords', 'label' => '热门搜索', 'type' => 'switch', 'default' => true, 'dependsOn' => ['key' => 'header_components_search_enabled', 'value' => true]],
['key' => 'header_components_search_popular_limit', 'label' => '关键词最多显示', 'type' => 'number', 'default' => 6, 'min' => 2, 'max' => 50, 'dependsOn' => ['key' => 'header_components_search_show_keywords', 'value' => true]],
['key' => 'header_components_search_show_input_cat', 'label' => '显示分类搜索', 'type' => 'switch', 'default' => false, 'dependsOn' => ['key' => 'header_components_search_enabled', 'value' => true]],
['key' => 'header_components_search_show_type', 'label' => '显示类型切换', 'type' => 'switch', 'default' => false, 'dependsOn' => ['key' => 'header_components_search_enabled', 'value' => true]],
[
@@ -152,7 +152,7 @@ class SchemaPageDisplay {
],
]],
['key' => 'cards', 'title' => '图标卡片样式', 'fields' => [
['key' => 'header_components_filter_blur_devices', 'label' => '容器模糊设备', 'type' => 'checkbox', 'default' => [], 'dependsOn' => ['key' => 'header_components_cards_enabled', 'value' => true], 'options' => [
['key' => 'header_components_filter_blur_devices', 'label' => '组件高斯模糊特效', 'type' => 'checkbox', 'default' => ['pc', 'mobile'], 'options' => [
['label' => 'PC', 'value' => 'pc'],
['label' => '移动端', 'value' => 'mobile'],
]],
@@ -161,7 +161,6 @@ class SchemaPageDisplay {
['label' => '移动端', 'value' => 'mobile'],
]],
['key' => 'header_components_card_shared_bg', 'label' => '共享卡片背景', 'type' => 'switch', 'default' => false, 'dependsOn' => ['key' => 'header_components_cards_enabled', 'value' => true]],
['key' => 'header_components_card_blur', 'label' => '启用卡片模糊效果', 'type' => 'switch', 'default' => true, 'dependsOn' => ['key' => 'header_components_cards_enabled', 'value' => true]],
['key' => 'header_components_card_icon_shape', 'label' => '图标形状', 'type' => 'radio', 'default' => 'circle', 'dependsOn' => ['key' => 'header_components_cards_enabled', 'value' => true], 'options' => [
['label' => '圆形', 'value' => 'circle'],
['label' => '方形', 'value' => 'square'],
+54 -13
View File
@@ -79,36 +79,76 @@ class DisplayRuntime {
$show = $is_mobile ? $mobile_on : $pc_on;
$show_kw = !empty($settings['header_components_search_show_keywords']);
$kw_limit = max(1, min(20, (int) ($settings['header_components_search_popular_limit'] ?? 5)));
$kw_limit = max(1, min(50, (int) ($settings['header_components_search_popular_limit'] ?? 6)));
$show_cat = !empty($settings['header_components_search_show_input_cat']);
$show_type = !empty($settings['header_components_search_show_type']);
$in_cat = sanitize_text_field((string) ($settings['header_components_search_in_cat'] ?? ''));
$in_type = sanitize_key((string) ($settings['header_components_search_in_type'] ?? 'post')) ?: 'post';
$more_cats = isset($settings['header_components_search_more_cats'])
? array_values(array_filter(array_map('absint', (array) $settings['header_components_search_more_cats'])))
: [];
// Mobile: hide hot keywords to keep the overlay short (zibll parity).
// Mobile: hide hot keywords (zibll).
if ($is_mobile) {
$show_kw = false;
}
$keywords = [];
if ($show && $show_kw) {
$raw = $settings['hot_search_keywords'] ?? '';
$keywords = is_array($raw) ? $raw : preg_split('/[\s,]+/', (string) $raw, -1, PREG_SPLIT_NO_EMPTY);
$keywords = array_slice(array_map('sanitize_text_field', $keywords), 0, $kw_limit);
if (function_exists('aksrt_get_search_hot_keywords')) {
$keywords = (array) aksrt_get_search_hot_keywords();
} else {
$raw = $settings['hot_search_keywords'] ?? '';
$keywords = is_array($raw) ? $raw : preg_split('/[\s,]+/', (string) $raw, -1, PREG_SPLIT_NO_EMPTY);
}
$keywords = array_slice(array_map('sanitize_text_field', array_values($keywords)), 0, $kw_limit);
}
$categories = [];
if ($show && $show_cat) {
$cats = get_categories(['hide_empty' => false, 'number' => 50]);
$cat_args = ['hide_empty' => true, 'number' => 50];
if ($more_cats) {
$cat_args['include'] = $more_cats;
$cat_args['orderby'] = 'include';
$cat_args['hide_empty'] = false;
}
$cats = get_categories($cat_args);
foreach ($cats as $cat) {
$categories[] = ['id' => $cat->term_id, 'name' => $cat->name];
$categories[] = ['id' => (int) $cat->term_id, 'name' => (string) $cat->name];
}
}
$type_options = [];
if ($show && $show_type) {
$types = Settings::get_search_content_types();
foreach (($types['enabled'] ?? []) as $type_key => $type_value) {
if ($type_value) {
$type_options[] = ['key' => $type_key, 'label' => $type_key];
$labels = [
'post' => __('文章', 'aksrt'),
'user' => __('用户', 'aksrt'),
'product' => __('商品', 'aksrt'),
'forum' => __('帖子', 'aksrt'),
'forum_topic' => __('帖子', 'aksrt'),
'plate' => __('版块', 'aksrt'),
'forum_plate' => __('版块', 'aksrt'),
'page' => __('页面', 'aksrt'),
];
$enabled = $types['enabled'] ?? $types;
if (is_array($enabled)) {
foreach ($enabled as $type_key => $type_value) {
// Support both map[key=>bool] and list of keys.
if (is_int($type_key) && is_string($type_value)) {
$k = $type_value;
$on = true;
} else {
$k = (string) $type_key;
$on = (bool) $type_value;
}
if (!$on || $k === '') {
continue;
}
$type_options[] = [
'key' => $k,
'label' => $labels[$k] ?? $k,
];
}
}
}
@@ -128,6 +168,9 @@ class DisplayRuntime {
'popular_limit' => $kw_limit,
'show_input_cat' => $show_cat,
'show_type' => $show_type,
'in_cat' => $in_cat,
'in_type' => $in_type,
'more_cats' => $more_cats,
'keywords' => $keywords,
'categories' => $categories,
'type_options' => $type_options,
@@ -136,9 +179,7 @@ class DisplayRuntime {
];
}
/**
* 是否显示顶部组件图标卡片覆盖
*/
public static function header_components_cards_enabled(): bool {
$settings = Settings::get_all();
return !empty($settings['header_components_cards_enabled']);