esc_html__('多条公告垂直滚动(共享 Swiper 栈)。', 'aksrt'), 'classname' => 'widget_aksrt_notice', ]); } public function widget($args, $instance): void { $items = $this->normalize_items($instance); if (!$items) { if (current_user_can('manage_options')) { echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo function_exists('aksrt_get_widget_null') ? aksrt_get_widget_null(__('请添加至少一条公告', 'aksrt')) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped : '

' . esc_html__('请添加至少一条公告', 'aksrt') . '

'; echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } return; } $color = sanitize_html_class((string) ($instance['color'] ?? 'c-blue')); $blank = !empty($instance['blank']); $radius = !empty($instance['radius']); $interval = max(2, min(15, (int) ($instance['interval'] ?? 4))); $align = sanitize_html_class((string) ($instance['alignment'] ?? '')); 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 } $wrap_cls = 'aksrt-scroll-notice swiper-bulletin color-' . $color; if ($radius) { $wrap_cls .= ' is-radius radius'; } if ($align !== '') { $wrap_cls .= ' ' . $align; } echo '
'; echo '
'; // Prefer shared vertical new-swiper (zib_notice parity) via slider.js Type C. echo '
'; echo '
'; foreach ($items as $item) { $inner = ''; if ($item['icon'] !== '') { $icon = $item['icon']; if (strpos($icon, 'fa-') === 0 && strpos($icon, ' ') === false) { $icon = 'fa ' . $icon; } $inner .= '
'; } $inner .= esc_html($item['title']); echo '
'; if ($item['href'] !== '') { echo '' . $inner . ''; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } else { echo '' . $inner . ''; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } echo '
'; } echo '
'; echo '
'; echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } /** * @param array $instance * @return array */ private function normalize_items(array $instance): array { $raw = $instance['items'] ?? $instance['img_ids'] ?? null; if ($raw === null && !empty($instance['content'])) { return [[ 'title' => wp_strip_all_tags((string) $instance['content']), 'icon' => sanitize_text_field((string) ($instance['icon'] ?? 'fas fa-bullhorn')), 'href' => '', ]]; } 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; } $title = sanitize_text_field((string) ($row['title'] ?? $row['content'] ?? '')); if ($title === '') { continue; } $out[] = [ 'title' => $title, 'icon' => sanitize_text_field((string) ($row['icon'] ?? '')), 'href' => esc_url_raw(trim((string) ($row['href'] ?? $row['url'] ?? $row['link'] ?? ''))), ]; if (count($out) >= 12) { break; } } return $out; } public function form($instance): void { $items = $this->normalize_items($instance); if (!$items) { $items = [ ['title' => '', 'icon' => 'fas fa-bullhorn', 'href' => ''], ['title' => '', 'icon' => 'fas fa-info-circle', 'href' => ''], ]; } $json = wp_json_encode($items, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); $colors = [ 'c-blue' => __('透明蓝', 'aksrt'), 'c-green' => __('透明绿', 'aksrt'), 'c-yellow' => __('透明黄', 'aksrt'), 'c-red' => __('透明粉红', 'aksrt'), 'c-purple' => __('透明紫', 'aksrt'), 'c-blue-2' => __('透明深蓝', 'aksrt'), 'c-green-2' => __('透明墨绿', 'aksrt'), 'c-yellow-2' => __('透明橘黄', 'aksrt'), 'c-red-2' => __('透明红', 'aksrt'), 'c-purple-2' => __('透明深紫', 'aksrt'), 'b-theme' => __('主题色', 'aksrt'), 'b-red' => __('红色', 'aksrt'), 'b-yellow' => __('黄色', 'aksrt'), 'b-blue' => __('蓝色', 'aksrt'), 'b-green' => __('绿色', 'aksrt'), 'b-purple' => __('紫色', 'aksrt'), ]; ?>


sanitize_text_field((string) ($new_instance['title'] ?? '')), 'items' => $this->normalize_items(['items' => $new_instance['items'] ?? []]), 'interval' => max(2, min(15, (int) ($new_instance['interval'] ?? 4))), 'color' => sanitize_html_class((string) ($new_instance['color'] ?? 'c-blue')), 'alignment' => sanitize_html_class((string) ($new_instance['alignment'] ?? '')), 'blank' => !empty($new_instance['blank']) ? 1 : 0, 'radius' => !empty($new_instance['radius']) ? 1 : 0, ]; } }