*/ private static function type_labels(): array { return [ '' => __('随机', 'aksrt'), 'a' => __('动画', 'aksrt'), 'b' => __('漫画', 'aksrt'), 'c' => __('游戏', 'aksrt'), 'd' => __('文学', 'aksrt'), 'e' => __('原创', 'aksrt'), 'f' => __('来自网络', 'aksrt'), 'g' => __('其他', 'aksrt'), 'h' => __('影视', 'aksrt'), 'i' => __('诗词', 'aksrt'), 'j' => __('网易云', 'aksrt'), 'k' => __('哲学', 'aksrt'), 'l' => __('抖机灵', 'aksrt'), ]; } private static function sanitize_type(string $type): string { $type = strtolower(trim($type)); return preg_match('/^[a-l]$/', $type) ? $type : ''; } public function __construct() { parent::__construct( 'aksrt_yiyan', __('AKSRT 一言轮播', 'aksrt'), [ 'description' => __('显示随机一言/每日语录,支持自动轮播。', 'aksrt'), 'classname' => 'widget_aksrt_yiyan yiyan-box', ] ); } /** * @param array $args * @param array $instance */ public function widget($args, $instance): void { $title = !empty($instance['title']) ? (string) $instance['title'] : ''; $count = !empty($instance['count']) ? max(1, min(10, (int) $instance['count'])) : 5; $interval = !empty($instance['interval']) ? max(3, min(30, (int) $instance['interval'])) : 5; $type = self::sanitize_type((string) ($instance['type'] ?? '')); $icon = !empty($instance['icon']) ? (string) $instance['icon'] : 'fas fa-quote-left'; $affix = function_exists('aksrt_widget_affix_attrs') ? aksrt_widget_affix_attrs($instance) : ['class' => '', 'attr' => '']; $anim = sanitize_key((string) ($instance['obs_animation'] ?? '')); $anim_repeat = !empty($instance['animation_repeat']); echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped if ($title !== '') { echo $args['before_title'] . esc_html($title) . $args['after_title']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } // zibll shell: theme-box + yiyan-box main-bg text-center box-body radius8 main-shadow. // NOTE: obs_animation is this widget's own per-widget animation business // field (kept as-is); the shared common `animation_in` field added via // render_common_form_section() is a separate additional control. $pack = function_exists('aksrt_obs_animate_attrs') ? aksrt_obs_animate_attrs($anim, $anim_repeat, 0) : ['class' => '', 'attr' => '']; $box_class = 'theme-box yiyan-box-wrap' . $pack['class']; echo ''; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo '
'; if (function_exists('aksrt_render_yiyan_block')) { aksrt_render_yiyan_block([ 'class' => 'aksrt-yiyan yiyan', 'type' => $type, 'count' => $count, 'interval' => $interval, 'icon' => $icon, ]); } else { ?>
>

'; echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } /** * @param array $instance */ public function form($instance): void { $title = !empty($instance['title']) ? (string) $instance['title'] : '一言'; $count = !empty($instance['count']) ? (int) $instance['count'] : 5; $interval = !empty($instance['interval']) ? (int) $instance['interval'] : 5; $type = self::sanitize_type((string) ($instance['type'] ?? '')); $icon = !empty($instance['icon']) ? (string) $instance['icon'] : 'fas fa-quote-left'; $labels = self::type_labels(); $form_types = ['', 'a', 'd', 'i', 'k', 'h', 'j']; ?>

render_common_form_section($instance); ?> $new_instance * @param array $old_instance * @return array */ public function update($new_instance, $old_instance): array { return $this->update_common_fields($new_instance, $old_instance, [ 'title' => sanitize_text_field((string) ($new_instance['title'] ?? '')), 'count' => max(1, min(10, absint($new_instance['count'] ?? 5))), 'interval' => max(3, min(30, absint($new_instance['interval'] ?? 5))), 'type' => self::sanitize_type((string) ($new_instance['type'] ?? '')), 'icon' => sanitize_text_field((string) ($new_instance['icon'] ?? 'fas fa-quote-left')), 'obs_animation' => sanitize_key((string) ($new_instance['obs_animation'] ?? '')), 'animation_repeat' => !empty($new_instance['animation_repeat']) ? 1 : 0, ]); } }