*/ function aksrt_archive_get_list_style_settings(): array { $settings = class_exists('AKSRT_Settings') ? AKSRT_Settings::get_post_list_style_settings() : []; return [ 'list_type' => (string) ($settings['list_type'] ?? 'thumb'), 'render_mode' => (string) ($settings['render_mode'] ?? 'list'), 'list_type_token' => (string) ($settings['list_type_token'] ?? ($settings['list_type'] ?? 'thumb')), 'list_style' => (string) ($settings['list_style'] ?? ''), 'card_variant' => (string) ($settings['card_variant'] ?? ''), // Back-compat: older callers expected card_style as list_type token. 'card_style' => (string) ($settings['list_type'] ?? ($settings['card_style'] ?? 'thumb')), 'card_cat_ids' => is_array($settings['card_cat_ids'] ?? null) ? array_map('intval', $settings['card_cat_ids']) : [], 'card_home' => !empty($settings['card_home']), 'card_tag' => !empty($settings['card_tag']), 'card_topics' => !empty($settings['card_topics']), 'card_author' => !empty($settings['card_author']), 'list_show_type' => (string) ($settings['list_show_type'] ?? 'separate'), 'list_img_position'=> (string) ($settings['list_img_position'] ?? 'left'), 'show_author' => !isset($settings['show_author']) || !empty($settings['show_author']), 'show_date' => !isset($settings['show_date']) || !empty($settings['show_date']), 'show_views' => !isset($settings['show_views']) || !empty($settings['show_views']), 'show_comments' => !empty($settings['show_comments']), 'show_likes' => !empty($settings['show_likes']), 'target_blank' => !empty($settings['target_blank']), 'heading_bold' => !empty($settings['heading_bold']), 'badge_show' => !isset($settings['badge_show']) || !empty($settings['badge_show']), 'excerpt_length' => (int) ($settings['excerpt_length'] ?? 120), ]; } endif; if (!function_exists('aksrt_resolve_post_list_render_config')) : /** * Zibll-aligned list/card resolver for all surfaces. * * Decision order mirrors zib_mian_posts_while(): * 1) explicit override mode/type * 2) global list_type (post_card_style): only "card" is card grid; thumb/text/thumb_if_has are list * 3) surface card switches (home/tag/topics/author/cat IDs) * * @param array $args { * @type string $context home|category|tag|topics|author|search|archive * @type int $term_id Optional term id for list_card_cat * @type array $overrides Optional renderer overrides (mode, style, …) * } * @return array */ function aksrt_resolve_post_list_render_config(array $args = []): array { $args = wp_parse_args($args, [ 'context' => '', 'term_id' => 0, 'overrides' => [], ]); $overrides = is_array($args['overrides']) ? $args['overrides'] : []; if (!empty($args['context']) && empty($overrides['context'])) { // keep context on root for merge below } $context = sanitize_key((string) ($args['context'] !== '' ? $args['context'] : ($overrides['context'] ?? ''))); if ($context === '') { if (function_exists('is_front_page') && (is_front_page() || is_home())) { $context = 'home'; } elseif (is_category()) { $context = 'category'; } elseif (is_tag()) { $context = 'tag'; } elseif (is_tax('topics')) { $context = 'topics'; } elseif (is_author()) { $context = 'author'; } elseif (is_search()) { $context = 'search'; } else { $context = 'archive'; } } $term_id = (int) ($args['term_id'] ?? 0); if ($term_id <= 0) { $term_id = (int) get_queried_object_id(); } $list = aksrt_archive_get_list_style_settings(); $list_type = sanitize_key((string) ($list['list_type'] ?? 'thumb')); if ($list_type === '' || $list_type === 'standard') { $list_type = 'thumb'; } // Explicit caller mode wins (term meta, AJAX view toggle, etc.). $forced_mode = ''; if (isset($overrides['mode']) && is_string($overrides['mode']) && $overrides['mode'] !== '') { $forced_mode = sanitize_key($overrides['mode']); } elseif (isset($overrides['type']) && sanitize_key((string) $overrides['type']) === 'card') { $forced_mode = 'card'; } elseif (!empty($overrides['is_card'])) { $forced_mode = 'card'; } $mode = $forced_mode !== '' ? $forced_mode : (($list_type === 'card') ? 'card' : 'list'); // Surface card overrides (only when not already card from list_type / force). if ($mode !== 'card' && $forced_mode === '') { if ($context === 'home' && !empty($list['card_home'])) { $mode = 'card'; } elseif ($context === 'tag' && !empty($list['card_tag'])) { $mode = 'card'; } elseif ($context === 'topics' && !empty($list['card_topics'])) { $mode = 'card'; } elseif ($context === 'author' && !empty($list['card_author'])) { $mode = 'card'; } elseif ($term_id > 0 && !empty($list['card_cat_ids']) && in_array($term_id, array_map('intval', (array) $list['card_cat_ids']), true)) { $mode = 'card'; } } if (!in_array($mode, ['list', 'card', 'mini', 'grid-cms'], true)) { $mode = 'list'; } // Visual variant: list → style2; card → style3 (Zibll fieldsets). $style = ''; if ($mode === 'card') { $style = sanitize_key((string) ($list['card_variant'] ?? '')); if (!in_array($style, ['', 'style3'], true)) { $style = ''; } } else { $style = sanitize_key((string) ($list['list_style'] ?? '')); if (!in_array($style, ['', 'style2'], true)) { $style = ''; } } if (isset($overrides['style']) && is_string($overrides['style'])) { $style = sanitize_key($overrides['style']); if (in_array($style, ['default', 'null'], true)) { $style = ''; } } $excerpt_words = max(8, (int) round(((int) ($list['excerpt_length'] ?? 120)) / 4)); $config = [ 'context' => $context, 'mode' => $mode, // list_type token for text / thumb_if_has hooks (renderer card_style key). 'card_style' => $list_type, 'style' => $style === 'default' ? '' : $style, 'list_show_type' => (string) ($list['list_show_type'] ?? 'separate'), 'list_img_position' => (string) ($list['list_img_position'] ?? 'left'), 'thumb_if_has' => ($list_type === 'thumb_if_has'), 'show_thumb' => ($list_type !== 'text'), 'show_author' => !empty($list['show_author']), 'show_date' => !empty($list['show_date']), 'show_views' => !empty($list['show_views']), 'show_comments' => !empty($list['show_comments']), 'show_likes' => !empty($list['show_likes']), 'target_blank' => !empty($list['target_blank']), 'heading_bold' => !empty($list['heading_bold']), 'badge_show' => !empty($list['badge_show']), 'show_excerpt' => $mode !== 'card', 'excerpt_words' => $excerpt_words, ]; // Multi-thumb from global thumb settings + category allowlist. if (class_exists('AKSRT_Settings')) { $thumb_settings = AKSRT_Settings::get_post_thumb_settings(); if (!empty($thumb_settings['multi_enabled'])) { $config['multi_thumb_enabled'] = true; $config['multi_thumb_limit'] = (int) ($thumb_settings['multi_count'] ?? 4); $config['multi_thumb_min'] = 3; } if (($context === 'category' || $context === 'topics') && !empty($thumb_settings['mult_thumb_cat_ids']) && $term_id > 0) { if (in_array($term_id, array_map('intval', (array) $thumb_settings['mult_thumb_cat_ids']), true)) { $config['multi_thumb_enabled'] = true; $config['multi_thumb_limit'] = (int) ($thumb_settings['multi_count'] ?? 4); $config['multi_thumb_min'] = 3; } } } // Merge remaining overrides last (except mode/style already handled carefully). foreach ($overrides as $key => $value) { if (in_array($key, ['mode', 'type', 'is_card', 'style', 'context'], true)) { continue; } $config[$key] = $value; } // Re-apply forced mode after merge if present. if ($forced_mode !== '' && in_array($forced_mode, ['list', 'card', 'mini', 'grid-cms'], true)) { $config['mode'] = $forced_mode; } $config['context'] = $context; $config['style'] = $style === 'default' ? '' : $style; return $config; } endif; if (!function_exists('aksrt_archive_get_render_config')) : /** * Build render config for archive-like pages. * * @param array $overrides Context/mode overrides. * @return array */ function aksrt_archive_get_render_config(array $overrides = []): array { $context = sanitize_key((string) ($overrides['context'] ?? '')); $term_id = isset($overrides['term_id']) ? (int) $overrides['term_id'] : 0; // Only treat explicit mode as override; empty string means follow global resolver. $resolver_overrides = $overrides; if (isset($resolver_overrides['mode']) && $resolver_overrides['mode'] === '') { unset($resolver_overrides['mode']); } return aksrt_resolve_post_list_render_config([ 'context' => $context, 'term_id' => $term_id, 'overrides' => $resolver_overrides, ]); } endif; if (!function_exists('aksrt_archive_get_sort_state')) : /** * Shared latest/oldest/popular sort state for term archives. * * @return array{current:string,links:array} */ function aksrt_archive_get_sort_state(): array { $current_orderby = sanitize_key((string) get_query_var('orderby')); $current_order = strtoupper(sanitize_key((string) get_query_var('order'))); $current = 'latest'; if ($current_orderby === 'date' && $current_order === 'ASC') { $current = 'oldest'; } elseif ($current_orderby === 'comment_count') { $current = 'popular'; } return [ 'current' => $current, 'links' => [ 'latest' => remove_query_arg(['orderby', 'order', 'paged']), 'oldest' => add_query_arg(['orderby' => 'date', 'order' => 'asc', 'paged' => false]), 'popular' => add_query_arg(['orderby' => 'comment_count', 'order' => 'desc', 'paged' => false]), ], ]; } endif; if (!function_exists('aksrt_archive_has_sidebar')) : /** * Resolve whether a stream page should show an aside. * * @param string $preferred Preferred sidebar id. * @param bool $enabled Page-level sidebar toggle. */ function aksrt_archive_has_sidebar(string $preferred = '', bool $enabled = true): bool { if (!$enabled || wp_is_mobile()) { return false; } if ($preferred !== '' && is_active_sidebar($preferred)) { return true; } if (function_exists('aksrt_is_show_sidebar')) { return aksrt_is_show_sidebar(); } $fallback = function_exists('aksrt_resolve_sidebar_id') ? aksrt_resolve_sidebar_id() : 'sidebar-blog'; return is_active_sidebar($fallback) || is_active_sidebar('all_sidebar_top') || is_active_sidebar('all_sidebar_bottom'); } endif; if (!function_exists('aksrt_archive_render_widget_zone')) : /** * Render stacked sidebars when active. * * @param string[] $sidebar_ids Sidebar ids. * @param string $wrapper_class Wrapper class. */ function aksrt_archive_render_widget_zone(array $sidebar_ids, string $wrapper_class = ''): void { $active = []; foreach ($sidebar_ids as $sidebar_id) { if (is_active_sidebar($sidebar_id)) { $active[] = $sidebar_id; } } if (empty($active)) { return; } if ($wrapper_class !== '') { echo '
'; } foreach ($active as $sidebar_id) { dynamic_sidebar($sidebar_id); } if ($wrapper_class !== '') { echo '
'; } } endif; if (!function_exists('aksrt_archive_render_stream')) : /** * Shared list + pagination + empty state for archive surfaces. * * @param WP_Query|null $query Query or null for main loop. * @param array $render_config Renderer config. * @param array $args Stream args. */ function aksrt_archive_render_stream(?WP_Query $query, array $render_config, array $args = []): void { $args = wp_parse_args($args, [ 'page_kind' => 'archive', 'query_context' => 'archive', 'empty_text' => __('暂无文章', 'aksrt'), 'stream_class' => '', 'ajax_enabled' => false, 'ajax_attrs' => '', 'show_loading' => false, ]); $classes = [ 'content-stream', 'content-stream--' . sanitize_html_class((string) $args['page_kind']), ]; if (!empty($args['stream_class'])) { foreach (preg_split('/\s+/', trim((string) $args['stream_class'])) ?: [] as $class) { $class = sanitize_html_class($class); if ($class !== '') { $classes[] = $class; } } } if (!empty($args['ajax_enabled'])) { $classes[] = 'is-ajax-enabled'; } $mode = (string) ($render_config['mode'] ?? 'card'); $card_style = (string) ($render_config['card_style'] ?? 'standard'); $has_posts = $query instanceof WP_Query ? $query->have_posts() : have_posts(); ?>
data-ajax-wrap data-query-context="" > 'content-stream__list'])); } ?>

$args Shell args. */ function aksrt_archive_open_shell(array $args = []): void { $args = wp_parse_args($args, [ 'main_class' => 'site-main container', 'has_sidebar' => false, 'top_fluid' => [], 'page_kind' => 'archive', ]); $main_class = trim((string) $args['main_class']); ?>
$args Shell args. */ function aksrt_archive_close_shell(array $args = []): void { $args = wp_parse_args($args, [ 'has_sidebar' => false, 'bottom_fluid' => [], ]); ?>