esc_html__('数字统计卡片网格(站点数据展示)。', 'aksrt'), 'classname' => 'widget_aksrt_stats', ] ); } public function widget($args, $instance): void { $stats = $this->normalize_stats($instance['stats'] ?? []); if (!$stats) { return; } $cols = max(1, min(4, (int) ($instance['columns'] ?? 4))); $m_cols = max(1, min(3, (int) ($instance['mobile_columns'] ?? 2))); $intro_title = trim((string) ($instance['intro_title'] ?? '')); $intro_sub = trim((string) ($instance['intro_subtitle'] ?? '')); 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 } $style = sprintf('--aksrt-stats-pc:%d;--aksrt-stats-m:%d;', $cols, $m_cols); echo '
'; if ($intro_title !== '' || $intro_sub !== '') { echo '
'; if ($intro_title !== '') { echo '

' . esc_html($intro_title) . '

'; } if ($intro_sub !== '') { echo '

' . esc_html($intro_sub) . '

'; } echo '
'; } echo '
'; $palette = ['pink', 'purple', 'orange', 'blue', 'green']; $i = 0; foreach ($stats as $s) { $color = sanitize_key((string) ($s['color'] ?? 'auto')); if ($color === '' || $color === 'auto') { $color = $palette[$i % count($palette)]; } $i++; echo '
'; if ($s['icon'] !== '') { echo '
'; } echo '
'; if ($s['prefix'] !== '') { echo '' . esc_html($s['prefix']) . ''; } echo '' . esc_html($s['number']) . ''; if ($s['unit'] !== '') { echo '' . esc_html($s['unit']) . ''; } echo '
'; if ($s['label'] !== '') { echo '
' . esc_html($s['label']) . '
'; } echo '
'; } echo '
'; echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } /** * @param mixed $raw * @return array */ private function normalize_stats($raw): array { if (is_string($raw)) { $decoded = json_decode($raw, true); $raw = is_array($decoded) ? $decoded : []; } if (!is_array($raw)) { return []; } $out = []; foreach ($raw as $row) { if (!is_array($row)) { continue; } $number = sanitize_text_field((string) ($row['number'] ?? '')); if ($number === '') { continue; } $out[] = [ 'number' => $number, 'label' => sanitize_text_field((string) ($row['label'] ?? '')), 'unit' => sanitize_text_field((string) ($row['unit'] ?? '')), 'prefix' => sanitize_text_field((string) ($row['prefix'] ?? '')), 'icon' => sanitize_text_field((string) ($row['icon'] ?? '')), 'color' => sanitize_key((string) ($row['color'] ?? 'auto')), ]; if (count($out) >= 12) { break; } } return $out; } public function form($instance): void { $stats = is_string($instance['stats'] ?? null) ? (string) $instance['stats'] : wp_json_encode($this->normalize_stats($instance['stats'] ?? []), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); ?>

sanitize_text_field((string) ($new_instance['title'] ?? '')), 'stats' => $this->normalize_stats($new_instance['stats'] ?? []), 'columns' => max(1, min(4, (int) ($new_instance['columns'] ?? 4))), 'mobile_columns' => max(1, min(3, (int) ($new_instance['mobile_columns'] ?? 2))), 'intro_title' => sanitize_text_field((string) ($new_instance['intro_title'] ?? '')), 'intro_subtitle' => sanitize_text_field((string) ($new_instance['intro_subtitle'] ?? '')), ]; } }