esc_html__('多图轮播(共享 new-swiper / Swiper 栈),支持链接与标题。', 'aksrt'), 'classname' => 'widget_aksrt_slider slide-widget', ] ); } public function widget($args, $instance): void { $slides = $this->normalize_slides($instance['slides'] ?? []); if (!$slides) { 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') . '' . esc_html__('当前配置下没有可显示的内容,请正确配置或移出该模块', 'aksrt') . '
'; echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } return; } $interval = max(0, min(20, (int) ($instance['interval'] ?? 4))); $loop = !isset($instance['loop']) || !empty($instance['loop']); $dots = !isset($instance['pagination']) || !empty($instance['pagination']); $nav = !isset($instance['button']) || !empty($instance['button']); $blank = !empty($instance['blank']); $height = max(80, min(800, (int) ($instance['height'] ?? $instance['pc_height'] ?? 400))); $m_height = max(60, min(800, (int) ($instance['m_height'] ?? $height))); $effect = sanitize_key((string) ($instance['effect'] ?? 'slide')); if (!in_array($effect, ['slide', 'fade', 'cube', 'coverflow', 'flip'], true)) { $effect = 'slide'; } // Zibll CFS_Module::slide() options parity. $direction = sanitize_key((string) ($instance['direction'] ?? 'horizontal')); if (!in_array($direction, ['horizontal', 'vertical'], true)) { $direction = 'horizontal'; } $autoplay = !isset($instance['autoplay']) || !empty($instance['autoplay']); $speed = max(0, min(3000, (int) ($instance['speed'] ?? 0))); $spacebetween= max(0, min(500, (int) ($instance['spacebetween'] ?? 15))); $scale_height= !empty($instance['scale_height']) || !isset($instance['scale_height']); $scale = max(10, min(300, (int) ($instance['scale'] ?? 35))); $slide_payload = []; foreach ($slides as $slide) { $slide_payload[] = [ 'image' => $slide['image'], 'link' => $slide['href'], 'title' => $slide['title'], 'desc' => $slide['desc'], 'alt' => $slide['title'], 'target' => $blank ? '_blank' : '_self', ]; } 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 } if (function_exists('aksrt_render_slider')) { // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo aksrt_render_slider([ 'slides' => $slide_payload, 'effect' => $effect, 'loop' => $loop, 'autoplay' => $autoplay, 'interval' => $interval * 1000, 'speed' => $speed, 'direction' => $direction, 'spaceBetween' => $spacebetween, 'pc_height' => $height . 'px', 'm_height' => $m_height . 'px', 'scale_height' => $scale_height && $direction !== 'vertical', 'scale_ratio' => $scale / 100, 'show_nav' => $nav, 'show_pagination' => $dots, 'slider_class' => 'slide-widget', 'wrapper_class' => 'aksrt-widget-slider-wrap', ]); } else { // Minimal fallback without helper. echo '
'; foreach ($slide_payload as $i => $slide) { $active = $i === 0 ? ' is-active' : ''; echo '
'; $img = '' . esc_attr($slide['title']) . ''; if ($slide['link'] !== '') { echo '' . $img . ''; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } else { echo $img; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } echo '
'; } echo '
'; } echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } public function form($instance): void { $title = (string) ($instance['title'] ?? ''); $interval = (int) ($instance['interval'] ?? 4); $height = (int) ($instance['height'] ?? $instance['pc_height'] ?? 400); $m_height = (int) ($instance['m_height'] ?? $height); $effect = sanitize_key((string) ($instance['effect'] ?? 'slide')); $direction = sanitize_key((string) ($instance['direction'] ?? 'horizontal')); $speed = (int) ($instance['speed'] ?? 0); $spacebetween = (int) ($instance['spacebetween'] ?? 15); $scale = (int) ($instance['scale'] ?? 35); $slides = $this->normalize_slides($instance['slides'] ?? []); if (!$slides) { $slides = [ ['image' => '', 'href' => '', 'title' => '', 'desc' => ''], ['image' => '', 'href' => '', 'title' => '', 'desc' => ''], ]; } ?>





$slide) : ?>


" placeholder=""> " placeholder=""> " placeholder=""> " placeholder="">

render_common_form_section($instance); } public function update($new_instance, $old_instance): array { $slides = $this->normalize_slides($new_instance['slides'] ?? []); $effect = sanitize_key((string) ($new_instance['effect'] ?? 'slide')); if (!in_array($effect, ['slide', 'fade', 'cube', 'coverflow', 'flip'], true)) { $effect = 'slide'; } $direction = sanitize_key((string) ($new_instance['direction'] ?? 'horizontal')); if (!in_array($direction, ['horizontal', 'vertical'], true)) { $direction = 'horizontal'; } $business = [ 'title' => sanitize_text_field((string) ($new_instance['title'] ?? '')), 'interval' => max(0, min(20, (int) ($new_instance['interval'] ?? 4))), 'height' => max(80, min(800, (int) ($new_instance['height'] ?? $new_instance['pc_height'] ?? 400))), 'm_height' => max(60, min(800, (int) ($new_instance['m_height'] ?? ($new_instance['height'] ?? $new_instance['pc_height'] ?? 400)))), 'effect' => $effect, 'direction' => $direction, 'speed' => max(0, min(3000, (int) ($new_instance['speed'] ?? 0))), 'spacebetween'=> max(0, min(500, (int) ($new_instance['spacebetween'] ?? 15))), 'scale_height'=> !empty($new_instance['scale_height']) ? 1 : 0, 'scale' => max(10, min(300, (int) ($new_instance['scale'] ?? 35))), 'loop' => !empty($new_instance['loop']) ? 1 : 0, 'button' => !empty($new_instance['button']) ? 1 : 0, 'pagination' => !empty($new_instance['pagination']) ? 1 : 0, 'autoplay' => !empty($new_instance['autoplay']) ? 1 : 0, 'blank' => !empty($new_instance['blank']) ? 1 : 0, 'slides' => $slides, ]; return $this->update_common_fields($new_instance, $old_instance, $business); } /** * @param mixed $raw * @return array */ private function normalize_slides($raw): array { if (!is_array($raw)) { return []; } $out = []; foreach ($raw as $row) { if (!is_array($row)) { continue; } $image = esc_url_raw(trim((string) ($row['image'] ?? $row['link'] ?? ''))); if ($image === '') { continue; } $out[] = [ 'image' => $image, 'href' => esc_url_raw(trim((string) ($row['href'] ?? ''))), 'title' => sanitize_text_field((string) ($row['title'] ?? '')), 'desc' => sanitize_text_field((string) ($row['desc'] ?? $row['dec'] ?? '')), ]; if (count($out) >= 8) { break; } } return $out; } }