__('图片/视频封面 + 文字叠加的图文卡片(共享 graphic_card)。', 'aksrt')] ); } /** * @param array $args * @param array $instance */ public function widget($args, $instance): void { $title = !empty($instance['title']) ? (string) $instance['title'] : ''; $items = $this->normalize($instance['items'] ?? []); 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; } $pc_row = max(1, min(6, (int) ($instance['pc_row'] ?? $instance['columns'] ?? 2))); $m_row = max(1, min(3, (int) ($instance['m_row'] ?? 1))); $height_scale = max(30, min(120, (int) ($instance['height_scale'] ?? 70))); $mask_opacity = max(0, min(80, (int) ($instance['mask_opacity'] ?? 20))); $font_size_pc = max(12, min(32, (int) ($instance['font_size_pc'] ?? 18))); $font_size_m = max(11, min(24, (int) ($instance['font_size_m'] ?? 14))); $font_bold = !empty($instance['font_bold']); $font_color = sanitize_hex_color((string) ($instance['font_color'] ?? '')) ?: ''; 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 } $is_row = count($items) > 1; $pc_span = max(1, (int) floor(12 / $pc_row)); $m_span = max(1, (int) floor(12 / $m_row)); $row_class = 'col-sm-' . $pc_span . ($m_row > 1 ? ' col-xs-' . $m_span : ''); $style = ''; if ($font_size_pc !== 14) { $style .= '--font-size:' . $font_size_pc . 'px;'; } if ($font_size_m !== 14) { $style .= '--font-size-sm:' . $font_size_m . 'px;'; } if ($font_bold) { $style .= '--font-weight:bold;--font-weight-sm:bold;'; } if ($font_color !== '') { $style .= '--color:' . $font_color . ';--color-sm:' . $font_color . ';'; } echo '
'; if ($is_row) { echo '
'; } foreach ($items as $item) { $hide = sanitize_key((string) ($item['hide'] ?? '')); if ($hide === 'pc' || $hide === 'm') { $is_mobile = function_exists('wp_is_mobile') ? wp_is_mobile() : false; if ((!$is_mobile && $hide === 'pc') || ($is_mobile && $hide === 'm')) { continue; } } $card_title = (string) ($item['title'] ?? ''); $more = $card_title !== '' ? '
' . esc_html($card_title) . '
' : ''; $card = [ 'class' => 'noshadow mb10', 'img' => (string) ($item['image'] ?? ''), 'video' => (string) ($item['video'] ?? ''), 'alt' => wp_strip_all_tags($card_title), 'link' => [ 'url' => (string) ($item['link'] ?? ''), 'target' => (string) ($item['target'] ?? ''), ], 'lazy' => true, 'more' => $more, 'height_scale' => !empty($item['height']) && is_numeric($item['height']) ? (int) $item['height'] : $height_scale, 'mask_opacity' => isset($item['mask']) ? (int) $item['mask'] : $mask_opacity, ]; if ($is_row) { echo '
'; } if (function_exists('aksrt_graphic_card')) { echo aksrt_graphic_card($card); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } if ($is_row) { echo '
'; } } if ($is_row) { echo '
'; } echo '
'; echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } /** * @param mixed $raw * @return array> */ private function normalize($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; } $image = esc_url_raw(trim((string) ($row['image'] ?? ''))); $video = esc_url_raw(trim((string) ($row['video'] ?? ''))); if ($image === '' && $video === '') { continue; } $out[] = [ 'title' => sanitize_text_field((string) ($row['title'] ?? '')), 'desc' => sanitize_text_field((string) ($row['desc'] ?? '')), 'image' => $image, 'video' => $video, 'link' => esc_url_raw(trim((string) ($row['link'] ?? ''))), 'target' => sanitize_text_field((string) ($row['target'] ?? '')), 'hide' => sanitize_key((string) ($row['hide'] ?? '')), 'height' => isset($row['height']) ? (int) $row['height'] : 0, 'mask' => isset($row['mask']) ? (int) $row['mask'] : null, ]; if (count($out) >= 12) { break; } } return $out; } /** * @param array $instance */ public function form($instance): void { $items = $this->normalize($instance['items'] ?? []); $json = wp_json_encode($items, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); ?>

$new_instance * @param array $old_instance * @return array */ public function update($new_instance, $old_instance): array { return [ 'title' => sanitize_text_field((string) ($new_instance['title'] ?? '')), 'pc_row' => max(1, min(6, (int) ($new_instance['pc_row'] ?? 2))), 'm_row' => max(1, min(3, (int) ($new_instance['m_row'] ?? 1))), 'columns' => max(1, min(6, (int) ($new_instance['pc_row'] ?? $new_instance['columns'] ?? 2))), 'height_scale' => max(30, min(120, (int) ($new_instance['height_scale'] ?? 70))), 'mask_opacity' => max(0, min(80, (int) ($new_instance['mask_opacity'] ?? 20))), 'font_size_pc' => max(12, min(32, (int) ($new_instance['font_size_pc'] ?? 18))), 'font_size_m' => max(11, min(24, (int) ($new_instance['font_size_m'] ?? 14))), 'font_bold' => !empty($new_instance['font_bold']) ? 1 : 0, 'font_color' => sanitize_hex_color((string) ($new_instance['font_color'] ?? '')) ?: '', 'items' => $this->normalize($new_instance['items'] ?? []), ]; } }