*/ function aksrt_homepage_get_tab_configs(): array { if (!class_exists('\AKSRT\Settings\Settings')) { return []; } $structured_tabs = \AKSRT\Settings\Settings::homepage_tabs(); if (empty($structured_tabs)) { return []; } $excluded_cat_ids = array_flip(\AKSRT\Settings\Settings::home_exclude_category_ids()); $configs = []; foreach ($structured_tabs as $tab) { if ($tab['term_id'] <= 0) { continue; } if (isset($excluded_cat_ids[$tab['term_id']])) { continue; } $term = get_term($tab['term_id']); if (!$term || is_wp_error($term)) { continue; } if ($term->taxonomy !== 'category') { continue; } $configs[] = [ 'term' => $term, 'term_id' => (int) $tab['term_id'], 'title' => $tab['title'] !== '' ? $tab['title'] : $term->name, 'orderby' => $tab['orderby'] ?: '', ]; } return $configs; } } if (!function_exists('aksrt_homepage_get_sort_mode')) { /** * Current homepage main-stream sort mode. */ function aksrt_homepage_get_sort_mode(): string { $allowed = class_exists('\AKSRT\Settings\Settings') ? \AKSRT\Settings\Settings::homepage_allowed_sorts() : ['modified', 'date', 'views', 'like', 'comment_count', 'favorite', 'rand']; $default_sort = class_exists('\AKSRT\Settings\Settings') ? \AKSRT\Settings\Settings::homepage_default_sort() : 'modified'; $override_sort = get_query_var('aksrt_homepage_sort_override'); $sort = is_string($override_sort) && $override_sort !== '' ? sanitize_key($override_sort) : $default_sort; return in_array($sort, $allowed, true) ? $sort : $default_sort; } } if (!function_exists('aksrt_homepage_get_request_sort')) { /** * Main-stream sort requested by URL (?orderby=), legacy zib_sift_posts_per_orde. * * 排序菜单(.ajax-option)点击后原位刷新的响应页靠它同序。 */ function aksrt_homepage_get_request_sort(): string { $get_sort = isset($_GET['orderby']) ? sanitize_key(wp_unslash((string) $_GET['orderby'])) : ''; if ($get_sort === '') { return ''; } $allowed = class_exists('\AKSRT\Settings\Settings') ? \AKSRT\Settings\Settings::homepage_allowed_sorts() : ['modified', 'date', 'views', 'like', 'comment_count', 'favorite', 'rand']; return in_array($get_sort, $allowed, true) ? $get_sort : ''; } } if (!function_exists('aksrt_homepage_apply_sort_args')) { /** * Apply sort args to a query configuration. */ function aksrt_homepage_apply_sort_args(array $args): array { $sort_mode = aksrt_homepage_get_sort_mode(); // Meta sorts: keep posts without the meta key via OR NOT EXISTS so lists never collapse empty. $apply_meta_sort = static function (array $args, string $meta_key): array { $args['meta_key'] = $meta_key; $args['orderby'] = [ 'meta_value_num' => 'DESC', 'date' => 'DESC', ]; $args['meta_query'] = [ 'relation' => 'OR', [ 'key' => $meta_key, 'compare' => 'EXISTS', ], [ 'key' => $meta_key, 'compare' => 'NOT EXISTS', ], ]; return $args; }; switch ($sort_mode) { case 'modified': $args['orderby'] = 'modified'; $args['order'] = 'DESC'; break; case 'views': // Canonical public views key (align hotspot consumers later). $args = $apply_meta_sort($args, 'aksrt_post_views'); break; case 'like': $args = $apply_meta_sort($args, '_aksrt_like_count'); break; case 'favorite': $args = $apply_meta_sort($args, '_aksrt_favorite_count'); break; case 'comment_count': $args['orderby'] = 'comment_count'; $args['order'] = 'DESC'; break; case 'rand': $args['orderby'] = 'rand'; unset($args['order']); break; case 'date': default: $args['orderby'] = 'date'; $args['order'] = 'DESC'; break; } return $args; } } if (!function_exists('aksrt_homepage_apply_named_sort_args')) { /** * Apply a specific named sort to query args (used by per-tab orderby). */ function aksrt_homepage_apply_named_sort_args(array $args, string $sort_mode): array { $allowed = class_exists('\AKSRT\Settings\Settings') ? \AKSRT\Settings\Settings::homepage_allowed_sorts() : ['modified', 'date', 'views', 'like', 'comment_count', 'favorite', 'rand']; if (!in_array($sort_mode, $allowed, true)) { $sort_mode = 'modified'; } $previous = get_query_var('aksrt_homepage_sort_override'); set_query_var('aksrt_homepage_sort_override', $sort_mode); $result = aksrt_homepage_apply_sort_args($args); set_query_var('aksrt_homepage_sort_override', $previous); return $result; } } if (!function_exists('aksrt_homepage_render_ajax_option_menu')) { /** * 首页排序菜单,1:1 zib_ajax_option_menu('home')。 * * 输出 .ajax-option.ajax-replace[win-ajax-replace="filter"],点击 .ajax-next * 排序链接由 runtime post_ajax 原位替换 #index-tab-main 内的列表。 */ function aksrt_homepage_render_ajax_option_menu(): void { if (!empty($_GET['nofilter'])) { return; } if (!class_exists('\AKSRT\Settings\Settings') || !\AKSRT\Settings\Settings::home_list_sort_enabled()) { return; } $con = aksrt_homepage_get_option_orderby_but([ 'lists' => (array) \AKSRT\Settings\Settings::home_list_sort_options(), 'dropdown' => (bool) \AKSRT\Settings\Settings::home_list_sort_dropdown(), ]); if (!$con) { return; } echo '
' . $con . '
'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo '
'; // 空白内容,解决css奇数偶数行 } } if (!function_exists('aksrt_homepage_get_option_orderby_but')) { /** * 排序方式按钮组,1:1 zib_get_option_orderby_but。 * * @param array{lists?:string[],dropdown?:bool} $option Sort option config. */ function aksrt_homepage_get_option_orderby_but($option = []): string { $defaults = [ 'lists' => [], 'dropdown' => false, ]; $option = wp_parse_args((array) $option, $defaults); if (!$option['lists'] && !$option['dropdown']) { return ''; } $labels = class_exists('\AKSRT\Settings\Settings') ? \AKSRT\Settings\Settings::homepage_sort_labels() : ['modified' => '更新', 'date' => '发布', 'views' => '浏览', 'like' => '点赞', 'comment_count' => '评论', 'favorite' => '收藏', 'rand' => '随机']; $dropdown_but = ''; $but = ''; $uri = aksrt_homepage_url_del_paged(aksrt_homepage_get_current_url()); foreach ($option['lists'] as $key) { if (!isset($labels[$key])) { continue; } $_class = 'ajax-next'; if (isset($_GET['orderby']) && sanitize_key(wp_unslash((string) $_GET['orderby'])) === $key) { $_class .= ' focus-color'; } $href = add_query_arg(['orderby' => $key], $uri); $but .= '' . esc_html($labels[$key]) . ''; } if ($option['dropdown']) { foreach ($labels as $key => $value) { $_class = 'ajax-next'; if (isset($_GET['orderby']) && sanitize_key(wp_unslash((string) $_GET['orderby'])) === $key) { $_class .= ' focus-color'; } $href = add_query_arg(['orderby' => $key], $uri); $dropdown_but .= '
  • ' . esc_html($value) . '
  • '; } } if (!$but && !$dropdown_but) { return ''; } $is_dropdown = ($option['dropdown'] && $dropdown_but) ? true : false; $d_but = $is_dropdown ? '' . esc_html__('排序', 'aksrt') . '' : esc_html__('排序', 'aksrt'); $html = '
    '; $html .= ''; $html .= ''; $html .= '
    '; return $html; } } if (!function_exists('aksrt_homepage_get_current_url')) { /** * 当前页面链接,1:1 zib_get_current_url。 */ function aksrt_homepage_get_current_url(): string { $home_url = home_url(); $host = preg_replace('/^(http|https)(:\/\/)(?)([^\/]+).*$/im', '$1$2$3', $home_url); return $host . add_query_arg(null, false); } } if (!function_exists('aksrt_homepage_url_del_paged')) { /** * 移除分页参数的链接,1:1 zib_url_del_paged。 */ function aksrt_homepage_url_del_paged(string $url): string { $url = remove_query_arg(['paged', 'page'], $url); global $wp_rewrite; return preg_replace('/\/' . $wp_rewrite->pagination_base . '\/\d*/', '', $url); } }