esc_html__('热门/最新/精华等栏目切换的帖子列表(共享迷你行 + 懒加载)。', 'aksrt'), 'classname' => 'widget_aksrt_forum_tab_topics', ] ); } public function widget($args, $instance): void { if (!post_type_exists('aksrt_forum_topic')) { return; } $tabs = $this->normalize_tabs($instance['tabs'] ?? []); if (!$tabs) { $tabs = [ ['title' => __('最新', 'aksrt'), 'orderby' => 'date'], ['title' => __('热门', 'aksrt'), 'orderby' => 'views'], ['title' => __('精华', 'aksrt'), 'orderby' => 'essence'], ]; } $count = max(1, min(20, (int) ($instance['count'] ?? 6))); $style = sanitize_key((string) ($instance['style'] ?? 'mini')); if (!in_array($style, ['mini', 'rank'], true)) { $style = 'mini'; } $plate = max(0, (int) ($instance['plate'] ?? 0)); $uid = 'aksrt-ftab-' . esc_attr($this->id); // Prefer WidgetAjax forum-topics (HotTopics payload with style/plate). $rest = rest_url('aksrt/v1/widgets/forum-topics'); echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped $title = apply_filters('widget_title', (string) ($instance['title'] ?? ''), $instance, $this->id_base); if ($title !== '') { echo $args['before_title'] . esc_html($title) . $args['after_title']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } echo '
'; ?> */ private function normalize_tabs($raw): array { $out = []; if (is_string($raw)) { foreach (array_filter(explode("\n", $raw)) as $line) { $parts = array_map('trim', explode('|', $line)); if ($parts[0] === '') { continue; } $out[] = [ 'title' => $parts[0], 'orderby' => sanitize_key($parts[1] ?? 'date'), ]; } return $out; } if (is_array($raw)) { foreach ($raw as $tab) { if (!is_array($tab)) { continue; } $title = trim((string) ($tab['title'] ?? '')); if ($title === '') { continue; } $out[] = [ 'title' => $title, 'orderby' => sanitize_key((string) ($tab['orderby'] ?? 'date')), ]; } } return $out; } public function form($instance): void { $defaults = [ 'title' => __('论坛栏目', 'aksrt'), 'count' => 6, 'style' => 'mini', 'plate' => 0, 'tabs' => "最新|date\n热门|views\n精华|essence", ]; $instance = wp_parse_args($instance, $defaults); $tabs_val = $instance['tabs']; if (is_array($tabs_val)) { $lines = []; foreach ($tabs_val as $t) { $lines[] = ($t['title'] ?? '') . '|' . ($t['orderby'] ?? 'date'); } $tabs_val = implode("\n", $lines); } ?>
sanitize_text_field((string) ($new_instance['title'] ?? '')), 'count' => max(1, min(20, (int) ($new_instance['count'] ?? 6))), 'style' => $style, 'plate' => max(0, (int) ($new_instance['plate'] ?? 0)), 'tabs' => sanitize_textarea_field((string) ($new_instance['tabs'] ?? '')), ]; } }