__('显示论坛热门话题列表(头像/身份/阅读)。', 'aksrt'), 'classname' => 'widget_aksrt_forum_hot_topics', ] ); } public static function build_query_args(array $instance, int $paged = 1): array { $count = max(1, min(20, (int) ($instance['count'] ?? 5))); $period = sanitize_key((string) ($instance['period'] ?? 'week')); $orderby = sanitize_key((string) ($instance['orderby'] ?? 'views')); $plate = max(0, (int) ($instance['plate'] ?? $instance['plate_id'] ?? 0)); $date_query = []; if ($period === 'week') { $date_query = [['after' => '7 days ago']]; } elseif ($period === 'month') { $date_query = [['after' => '30 days ago']]; } $query = [ 'post_type' => 'aksrt_forum_topic', 'posts_per_page' => $count, 'paged' => max(1, $paged), 'post_status' => 'publish', 'date_query' => $date_query, ]; if ($orderby === 'comments') { $query['orderby'] = 'comment_count'; $query['order'] = 'DESC'; } elseif ($orderby === 'date') { $query['orderby'] = 'date'; $query['order'] = 'DESC'; } elseif ($orderby === 'essence') { $query['meta_query'] = [[ 'key' => '_aksrt_essence', 'value' => '1', ]]; $query['orderby'] = 'date'; $query['order'] = 'DESC'; } else { $query['meta_key'] = '_aksrt_views'; $query['orderby'] = 'meta_value_num'; $query['order'] = 'DESC'; } if ($plate > 0) { $mq = isset($query['meta_query']) ? $query['meta_query'] : []; $mq[] = [ 'key' => '_aksrt_plate_id', 'value' => $plate, ]; $query['meta_query'] = array_values($mq); } return $query; } public static function render_items_html(\WP_Query $query, int $start = 0, string $style = 'mini'): string { if (!$query->have_posts()) { return ''; } $style = $style === 'rank' ? 'rank' : 'mini'; ob_start(); if ($style === 'rank') { echo '
'; } else { echo '
'; } $i = $start; while ($query->have_posts()) { $query->the_post(); $i++; if ($style === 'rank') { $tone = $i === 1 ? 'jb-red' : ($i === 2 ? 'jb-yellow' : ($i === 3 ? 'b-gray' : '')); echo '
'; if ($i <= 3 && $tone !== '') { echo 'TOP' . (int) $i . ''; } else { echo '' . esc_html((string) $i) . ''; } if (function_exists('aksrt_render_forum_topic_mini')) { echo aksrt_render_forum_topic_mini(null, 'ajax-item is-rank-item', true); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } else { $views = (int) get_post_meta(get_the_ID(), '_aksrt_views', true); echo '' . esc_html(get_the_title()) . ''; echo ' ' . esc_html((string) $views) . ''; } echo '
'; } elseif (function_exists('aksrt_render_forum_topic_mini')) { echo aksrt_render_forum_topic_mini(null, 'ajax-item', true); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } else { $views = (int) get_post_meta(get_the_ID(), '_aksrt_views', true); echo '
'; echo '' . esc_html(get_the_title()) . ''; echo ' ' . esc_html((string) $views) . ''; echo '
'; } } echo '
'; wp_reset_postdata(); return (string) ob_get_clean(); } /** * @return array{html:string,paginate_html:string,has_more:bool,page:int,max_pages:int,total:int} */ public static function query_payload(array $instance, int $page = 1): array { $page = max(1, $page); $count = max(1, min(20, (int) ($instance['count'] ?? 5))); $paginate = sanitize_key((string) ($instance['paginate'] ?? 'ajax')); $style = sanitize_key((string) ($instance['style'] ?? 'mini')); if (!in_array($style, ['mini', 'rank'], true)) { $style = 'mini'; } $q = new \WP_Query(self::build_query_args($instance, $page)); $html = self::render_items_html($q, ($page - 1) * $count, $style); if ($html === '' && $page === 1) { $html = function_exists('aksrt_get_ajax_null') ? aksrt_get_ajax_null(__('暂无话题', 'aksrt')) : '

' . esc_html__('暂无话题', 'aksrt') . '

'; } $max_pages = max(1, (int) $q->max_num_pages); $total = (int) $q->found_posts; $has_more = $page < $max_pages; $base_qs = array_filter([ 'count' => $count, 'period' => sanitize_key((string) ($instance['period'] ?? 'week')), 'orderby' => sanitize_key((string) ($instance['orderby'] ?? 'views')), 'style' => $style, 'plate' => max(0, (int) ($instance['plate'] ?? 0)), 'paginate' => $paginate, ], static function ($v) { return $v !== '' && $v !== null; }); $rest_base = add_query_arg($base_qs, rest_url('aksrt/v1/widgets/forum-topics')); $paginate_html = ''; if ($paginate === 'ajax' && $has_more) { $next = add_query_arg(['page' => $page + 1], $rest_base); $paginate_html = function_exists('aksrt_get_ajax_next_paginate') ? aksrt_get_ajax_next_paginate($total, $page, $count, $next) : '
'; } elseif ($paginate === 'number' && $max_pages > 1) { $paginate_html = function_exists('aksrt_get_ajax_number_paginate') ? aksrt_get_ajax_number_paginate($total, $page, $count, $rest_base) : '
'; } else { $paginate_html = '
'; } return compact('html', 'paginate_html', 'has_more', 'page', 'max_pages', 'total'); } public function widget($args, $instance): void { if (!post_type_exists('aksrt_forum_topic')) { return; } $title = !empty($instance['title']) ? $instance['title'] : __('热门话题', 'aksrt'); $instance['paginate'] = sanitize_key((string) ($instance['paginate'] ?? 'ajax')); $payload = self::query_payload($instance, 1); echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo $args['before_title'] . esc_html($title) . $args['after_title']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped $rest = rest_url('aksrt/v1/widgets/forum-topics'); $in_affix = !empty($instance['in_affix']); $wrap = 'ajaxpager' . ($in_affix ? ' is-affix' : ''); echo '
'; echo $payload['html']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo $payload['paginate_html']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo ''; echo '
'; echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } public function form($instance): void { $title = !empty($instance['title']) ? $instance['title'] : __('热门话题', 'aksrt'); $count = !empty($instance['count']) ? (int) $instance['count'] : 5; $period = !empty($instance['period']) ? $instance['period'] : 'week'; $orderby = !empty($instance['orderby']) ? $instance['orderby'] : 'views'; $style = !empty($instance['style']) ? $instance['style'] : 'mini'; $plate = (int) ($instance['plate'] ?? 0); ?>

sanitize_text_field($new_instance['title'] ?? ''), 'count' => max(1, min(20, (int) ($new_instance['count'] ?? 5))), 'period' => in_array($new_instance['period'] ?? '', ['all', 'week', 'month'], true) ? $new_instance['period'] : 'week', 'orderby' => $orderby, 'style' => $style, 'plate' => max(0, (int) ($new_instance['plate'] ?? 0)), 'paginate' => in_array(sanitize_key((string) ($new_instance['paginate'] ?? 'ajax')), ['none', 'ajax', 'number'], true) ? sanitize_key((string) ($new_instance['paginate'] ?? 'ajax')) : 'ajax', ]; } }