esc_html__('图标在上、文案在下的竖版图标卡片网格。', 'aksrt'), 'classname' => 'widget_aksrt_icon_cards', ]); } /** * @param array $args * @param array $instance */ public function widget($args, $instance): void { $cards = $this->normalize($instance['cards'] ?? []); if (!$cards) { return; } $pc_row = max(1, min(6, (int) ($instance['columns'] ?? $instance['pc_row'] ?? 2))); $m_row = max(1, min(4, (int) ($instance['m_row'] ?? 2))); $go_link = !empty($instance['go_link']); $show_bg = !isset($instance['show_widget_bg']) || !empty($instance['show_widget_bg']); $icon_size = max(0, min(64, (int) ($instance['icon_size'] ?? $instance['size'] ?? 0))); $icon_radius = !empty($instance['icon_radius']); $anim = sanitize_key((string) ($instance['obs_animation'] ?? '')); $anim_repeat = !empty($instance['animation_repeat']); 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 } $is_row = count($cards) > 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 : ''); echo $show_bg ? '
' : '
'; if ($is_row) { echo '
'; } $idx = 0; foreach ($cards as $card) { $url = (string) ($card['url'] ?? ''); if ($url !== '' && $go_link && function_exists('aksrt_go_link')) { $url = aksrt_go_link($url, true); } $card_args = [ 'class' => $show_bg ? 'box-body nopw-sm' : 'mb20', 'icon' => (string) ($card['icon'] ?? ''), 'icon_image' => (string) ($card['icon_image'] ?? ''), 'icon_size' => $icon_size > 0 ? (16 + $icon_size) : 0, 'icon_radius' => $icon_radius || !empty($card['icon_radius']), 'icon_color' => (string) ($card['icon_color'] ?? ''), 'icon_class' => (string) ($card['icon_class'] ?? ''), 'title' => (string) ($card['title'] ?? ''), 'desc' => (string) ($card['desc'] ?? ''), 'link' => [ 'url' => $url, 'target' => (string) ($card['target'] ?? ''), ], ]; $anim_pack = function_exists('aksrt_obs_animate_attrs') ? aksrt_obs_animate_attrs($anim, $anim_repeat, $idx * 0.08) : ['class' => '', 'attr' => '']; if ($is_row) { echo '
'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } elseif ($anim_pack['class'] !== '') { echo '
'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } if (function_exists('aksrt_icon_card')) { echo aksrt_icon_card($card_args); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } if ($is_row || $anim_pack['class'] !== '') { echo '
'; } $idx++; } 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 $card) { if (!is_array($card)) { continue; } $title = sanitize_text_field((string) ($card['title'] ?? '')); $icon = sanitize_text_field((string) ($card['icon'] ?? '')); $icon_image = esc_url_raw(trim((string) ($card['icon_image'] ?? $card['customize_icon'] ?? ''))); if ($title === '' && $icon === '' && $icon_image === '') { continue; } $url = esc_url_raw(trim((string) ($card['link'] ?? $card['url'] ?? ''))); if (is_array($card['link'] ?? null)) { $url = esc_url_raw(trim((string) ($card['link']['url'] ?? ''))); $target = sanitize_text_field((string) ($card['link']['target'] ?? '')); } else { $target = sanitize_text_field((string) ($card['target'] ?? '')); } $out[] = [ 'title' => $title, 'desc' => sanitize_text_field((string) ($card['description'] ?? $card['desc'] ?? '')), 'icon' => $icon, 'icon_image' => $icon_image, 'icon_color' => sanitize_html_class((string) ($card['icon_color'] ?? '')), 'icon_class' => sanitize_html_class((string) ($card['icon_class'] ?? '')), 'url' => $url, 'target' => $target, ]; if (count($out) >= 12) { break; } } return $out; } /** * @param array $instance */ public function form($instance): void { $cards = $this->normalize($instance['cards'] ?? []); while (count($cards) < 4) { $cards[] = ['title' => '', 'icon' => '', 'url' => '', 'desc' => '']; } ?>


$card) : ?>
" value="" placeholder=""> " value="" placeholder=""> " value="" placeholder=""> " value="" placeholder="">
$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'] ?? '')), 'columns' => max(1, min(6, (int) ($new_instance['columns'] ?? 2))), 'm_row' => max(1, min(4, (int) ($new_instance['m_row'] ?? 2))), 'go_link' => !empty($new_instance['go_link']) ? 1 : 0, 'show_widget_bg' => !empty($new_instance['show_widget_bg']) ? 1 : 0, 'icon_radius' => !empty($new_instance['icon_radius']) ? 1 : 0, 'obs_animation' => sanitize_key((string) ($new_instance['obs_animation'] ?? '')), 'cards' => $this->normalize($new_instance['cards'] ?? []), ]; } }