feat(admin): rebuild page display settings

This commit is contained in:
2026-08-19 00:07:13 +08:00
parent 09b1e8fd35
commit 480e2bf07e
117 changed files with 1815 additions and 9081 deletions
+78 -81
View File
@@ -14,16 +14,21 @@ trait FacadeBulk {
* @return array{custom:bool,bg_custom:string,bg:string,color_custom:string}
*/
public static function get_header_theme_config(): array {
$s = self::get_all();
$s = self::read_domain('page_display', 'header-nav');
return [
'custom' => !empty($s['header_theme_custom']),
'bg_custom' => sanitize_hex_color((string) ($s['header_theme_bg_custom'] ?? '')) ?: '',
'bg' => sanitize_hex_color((string) ($s['header_theme_bg'] ?? '')) ?: '',
'bg' => self::normalize_palette_hex((string) ($s['header_theme_bg'] ?? '')),
'color_custom' => sanitize_hex_color((string) ($s['header_theme_color_custom'] ?? '')) ?: '',
];
}
private static function normalize_palette_hex(string $value): string {
$value = ltrim(trim($value), '#');
return preg_match('/^[0-9a-f]{6}$/i', $value) ? '#' . strtolower($value) : '';
}
/**
@@ -31,36 +36,32 @@ trait FacadeBulk {
*
* @return array
*/
public static function get_category_page_settings(): array {
$settings = self::get_all();
$header_style = sanitize_key((string) ($settings['category_header_style'] ?? 'cover'));
$list_mode = sanitize_key((string) ($settings['category_list_mode'] ?? 'grid'));
$per_page = (int) ($settings['category_per_page'] ?? 12);
$orderby = sanitize_key((string) ($settings['category_orderby'] ?? 'modified'));
public static function get_category_page_settings(): array {
$settings = self::read_domain('page_display', 'category');
$orderby_option = self::normalize_page_orderby_option($settings['cat_orderby_option'] ?? []);
$orderby = sanitize_key((string) (($orderby_option['lists'][0] ?? 'modified')));
$ajax_category_enabled = !empty($settings['ajax_list_cat_cat']);
$ajax_tag_enabled = !empty($settings['ajax_list_cat_tag']);
$orderby_enabled = !empty($settings['cat_orderby_s']);
$post_count = !empty($settings['cat_post_count_s']);
if (!in_array($header_style, ['cover', 'simple', 'none'], true)) {
$header_style = 'cover';
}
if (!in_array($list_mode, ['grid', 'list', 'compact'], true)) {
$list_mode = 'grid';
}
if (!in_array($orderby, ['modified', 'date', 'views', 'comments', 'likes'], true)) {
$orderby = 'modified';
}
return [
'header_style' => $header_style,
'cover_enabled' => !isset($settings['category_cover_enabled']) || !empty($settings['category_cover_enabled']),
'desc_enabled' => !isset($settings['category_desc_enabled']) || !empty($settings['category_desc_enabled']),
'default_cover' => esc_url_raw((string) ($settings['category_default_cover'] ?? '')),
'list_mode' => $list_mode,
'filter_bar' => !isset($settings['category_filter_bar']) || !empty($settings['category_filter_bar']),
'sidebar' => !isset($settings['category_sidebar']) || !empty($settings['category_sidebar']),
'per_page' => max(4, min(48, $per_page)),
'post_count' => !empty($settings['category_post_count']),
'orderby' => $orderby,
return [
'header_style' => !empty($settings['page_cover_cat_s']) ? 'cover' : 'simple',
'cover_enabled' => !empty($settings['page_cover_cat_s']),
'desc_enabled' => true,
'default_cover' => esc_url_raw((string) ($settings['cat_default_cover'] ?? '')),
'list_mode' => 'grid',
'filter_bar' => $ajax_category_enabled || $ajax_tag_enabled || $orderby_enabled || $post_count,
'sidebar' => true,
'per_page' => max(1, (int) get_option('posts_per_page', 10)),
'post_count' => $post_count,
'orderby' => $orderby,
'orderby_enabled'=> $orderby_enabled,
'orderby_option' => $orderby_option,
'ajax_category_enabled' => $ajax_category_enabled,
'ajax_tag_enabled' => $ajax_tag_enabled,
'ajax_category' => is_array($settings['ajax_list_option_cat_cat'] ?? null) ? $settings['ajax_list_option_cat_cat'] : [],
'ajax_tag' => is_array($settings['ajax_list_option_cat_tag'] ?? null) ? $settings['ajax_list_option_cat_tag'] : [],
];
}
@@ -71,68 +72,64 @@ trait FacadeBulk {
*
* @return array
*/
public static function get_tag_page_settings(): array {
$settings = self::get_all();
$header_style = sanitize_key((string) ($settings['tag_header_style'] ?? 'simple'));
$list_mode = sanitize_key((string) ($settings['tag_list_mode'] ?? 'grid'));
$per_page = (int) ($settings['tag_per_page'] ?? 12);
$orderby = sanitize_key((string) ($settings['tag_orderby'] ?? 'count'));
public static function get_tag_page_settings(): array {
$settings = self::read_domain('page_display', 'tag');
$orderby_option = self::normalize_page_orderby_option($settings['tag_orderby_option'] ?? []);
$orderby = sanitize_key((string) (($orderby_option['lists'][0] ?? 'modified')));
$ajax_category_enabled = !empty($settings['ajax_list_tag_cat']);
$ajax_tag_enabled = !empty($settings['ajax_list_tag_tag']);
$orderby_enabled = !empty($settings['tag_orderby_s']);
$post_count = !empty($settings['tag_post_count_s']);
if (!in_array($header_style, ['cover', 'simple', 'none'], true)) {
$header_style = 'simple';
}
if (!in_array($list_mode, ['grid', 'list'], true)) {
$list_mode = 'grid';
}
if (!in_array($orderby, ['count', 'name', 'modified'], true)) {
$orderby = 'count';
}
return [
'header_style' => $header_style,
return [
'header_style' => !empty($settings['page_cover_tag_s']) ? 'cover' : 'simple',
'cover_enabled' => !empty($settings['page_cover_tag_s']),
'default_cover' => esc_url_raw((string) ($settings['tag_default_cover'] ?? '')),
'list_mode' => $list_mode,
'sidebar' => !isset($settings['tag_sidebar']) || !empty($settings['tag_sidebar']),
'per_page' => max(4, min(48, $per_page)),
'post_count' => !empty($settings['tag_post_count']),
'orderby' => $orderby,
'list_mode' => 'grid',
'sidebar' => true,
'per_page' => max(1, (int) get_option('posts_per_page', 10)),
'post_count' => $post_count,
'filter_bar' => $ajax_category_enabled || $ajax_tag_enabled || $orderby_enabled || $post_count,
'orderby' => $orderby,
'orderby_enabled'=> $orderby_enabled,
'orderby_option' => $orderby_option,
'ajax_category_enabled' => $ajax_category_enabled,
'ajax_tag_enabled' => $ajax_tag_enabled,
'ajax_category' => is_array($settings['ajax_list_option_tag_cat'] ?? null) ? $settings['ajax_list_option_tag_cat'] : [],
'ajax_tag' => is_array($settings['ajax_list_option_tag_tag'] ?? null) ? $settings['ajax_list_option_tag_tag'] : [],
];
}
/**
* Misc page display settings (404, search, author).
*
* @return array
*/
public static function get_other_page_settings(): array {
$settings = self::get_all();
$message = trim((string) ($settings['page_404_message'] ?? ''));
$search_per_page = max(4, min(48, (int) ($settings['page_search_per_page'] ?? 12)));
$author_per_page = max(4, min(48, (int) ($settings['page_author_posts_per_page'] ?? 12)));
$header_style = sanitize_key((string) ($settings['page_header_style'] ?? '1'));
/** @return array{header_style:string,header_cover_img:string} */
public static function get_other_page_settings(): array {
$settings = self::read_domain('page_display', 'other');
$header_style = sanitize_key((string) ($settings['page_header_style'] ?? ''));
if (!in_array($header_style, ['', '1', '2', '3'], true)) {
$header_style = '1';
}
$header_style = '';
}
return [
'header_style' => $header_style,
'header_cover_img' => esc_url_raw((string) ($settings['page_header_cover_img'] ?? '')),
'page_404_message' => $message !== '' ? $message : __('页面未找到', 'aksrt'),
'page_404_search' => !isset($settings['page_404_search']) || !empty($settings['page_404_search']),
'page_404_popular' => !isset($settings['page_404_popular']) || !empty($settings['page_404_popular']),
'page_404_back' => !isset($settings['page_404_back']) || !empty($settings['page_404_back']),
'page_search_sidebar' => !isset($settings['page_search_sidebar']) || !empty($settings['page_search_sidebar']),
'page_search_per_page' => $search_per_page,
'page_author_cover' => !isset($settings['page_author_cover']) || !empty($settings['page_author_cover']),
'page_author_sidebar' => !isset($settings['page_author_sidebar']) || !empty($settings['page_author_sidebar']),
'page_author_posts_per_page' => $author_per_page,
'header_style' => $header_style,
'header_cover_img' => esc_url_raw((string) ($settings['page_header_cover_img'] ?? '')),
];
}
/** @param mixed $value */
private static function normalize_page_orderby_option($value): array {
$option = is_array($value) ? $value : [];
$allowed = self::homepage_allowed_sorts();
$lists = is_array($option['lists'] ?? null) ? $option['lists'] : [];
$lists = array_values(array_intersect(array_map('sanitize_key', $lists), $allowed));
if ($lists === []) {
$lists = ['modified', 'views', 'like', 'comment_count'];
}
return [
'lists' => $lists,
'dropdown' => !empty($option['dropdown']),
];
}
/**
* Share and poster settings.
*