diff --git a/src/AKSRT/Widgets/IconCardsWidget.php b/src/AKSRT/Widgets/IconCardsWidget.php index 1237a020..c34988b2 100644 --- a/src/AKSRT/Widgets/IconCardsWidget.php +++ b/src/AKSRT/Widgets/IconCardsWidget.php @@ -1,6 +1,6 @@ esc_html__('图标在上、文案在下的竖版图标卡片网格。', 'aksrt'), + 'classname' => 'widget_aksrt_icon_cards', ]); } + /** + * @param array $args + * @param array $instance + */ public function widget($args, $instance): void { - $cards = isset($instance['cards']) && is_array($instance['cards']) ? $instance['cards'] : []; - $columns = max(1, min(4, (int) ($instance['columns'] ?? $instance['pc_row'] ?? 2))); - $m_cols = max(1, min(3, (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(18, min(48, (int) ($instance['icon_size'] ?? 28))); - - $valid = []; - foreach ($cards as $card) { - if (!is_array($card)) { - continue; - } - $title = sanitize_text_field((string) ($card['title'] ?? '')); - if ($title === '') { - continue; - } - $url = esc_url_raw(trim((string) ($card['link'] ?? $card['url'] ?? ''))); - if ($url !== '' && $go_link && function_exists('aksrt_go_link')) { - $url = aksrt_go_link($url, true); - } - $valid[] = [ - 'title' => $title, - 'icon' => sanitize_text_field((string) ($card['icon'] ?? '')), - 'desc' => sanitize_text_field((string) ($card['description'] ?? $card['desc'] ?? '')), - 'url' => $url, - ]; - } - if (!$valid) { + $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 } - $style = sprintf('--ic-columns:%d;--ic-m-columns:%d;--ic-icon:%dpx;', $columns, $m_cols, $icon_size); - echo '
'; - foreach ($valid as $card) { - $tag = $card['url'] !== '' ? 'a' : 'div'; - $extra = $card['url'] !== '' ? ' href="' . esc_url($card['url']) . '" target="_blank" rel="noopener noreferrer"' : ''; - echo '<' . $tag . ' class="widget-icon-cards__item is-vertical"' . $extra . '>'; - if ($card['icon'] !== '') { - echo '
'; + $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); } - echo '
'; - echo '
' . esc_html($card['title']) . '
'; - if ($card['desc'] !== '') { - echo '
' . esc_html($card['desc']) . '
'; + $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 } - echo '
'; + + 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 = isset($instance['cards']) && is_array($instance['cards']) ? $instance['cards'] : []; + $cards = $this->normalize($instance['cards'] ?? []); while (count($cards) < 4) { - $cards[] = ['title' => '', 'icon' => '', 'link' => '', 'description' => '']; + $cards[] = ['title' => '', 'icon' => '', 'url' => '', 'desc' => '']; } ?>

@@ -89,56 +166,43 @@ class IconCardsWidget extends \WP_Widget {

+


$card) : ?>
" value="" placeholder=""> " value="" placeholder=""> - " value="" placeholder=""> - " value="" placeholder=""> + " value="" placeholder=""> + " value="" placeholder="">
$new_instance + * @param array $old_instance + * @return array + */ public function update($new_instance, $old_instance): array { - $cards = []; - if (isset($new_instance['cards']) && is_array($new_instance['cards'])) { - foreach ($new_instance['cards'] as $card) { - if (!is_array($card)) { - continue; - } - $title = sanitize_text_field((string) ($card['title'] ?? '')); - if ($title === '') { - continue; - } - $cards[] = [ - 'title' => $title, - 'icon' => sanitize_text_field((string) ($card['icon'] ?? '')), - 'link' => esc_url_raw(trim((string) ($card['link'] ?? ''))), - 'description' => sanitize_text_field((string) ($card['description'] ?? '')), - ]; - if (count($cards) >= 12) { - break; - } - } - } return [ 'title' => sanitize_text_field((string) ($new_instance['title'] ?? '')), - 'columns' => max(1, min(4, (int) ($new_instance['columns'] ?? 2))), - 'm_row' => max(1, min(3, (int) ($new_instance['m_row'] ?? 2))), + '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, - 'cards' => $cards, + 'icon_radius' => !empty($new_instance['icon_radius']) ? 1 : 0, + 'obs_animation' => sanitize_key((string) ($new_instance['obs_animation'] ?? '')), + 'cards' => $this->normalize($new_instance['cards'] ?? []), ]; } } diff --git a/src/AKSRT/Widgets/WidgetIconCoverCards.php b/src/AKSRT/Widgets/WidgetIconCoverCards.php index 4aca3f14..f00c221d 100644 --- a/src/AKSRT/Widgets/WidgetIconCoverCards.php +++ b/src/AKSRT/Widgets/WidgetIconCoverCards.php @@ -1,6 +1,6 @@ $args + * @param array $instance + */ public function widget($args, $instance): void { $cards = $this->normalize($instance['cards'] ?? []); if (!$cards) { return; } - $cols = max(1, min(4, (int) ($instance['pc_row'] ?? 2))); - $m_cols = max(1, min(2, (int) ($instance['m_row'] ?? 1))); + $pc_row = max(1, min(4, (int) ($instance['pc_row'] ?? 2))); + $m_row = max(1, min(2, (int) ($instance['m_row'] ?? 1))); $icon_size = max(16, min(48, (int) ($instance['icon_size'] ?? 25))); $radius = !empty($instance['icon_radius4']); $go_link = !empty($instance['go_link']); + $show_bg = !empty($instance['show_widget_bg']); echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped $title = apply_filters('widget_title', (string) ($instance['title'] ?? ''), $instance, $this->id_base); @@ -39,31 +44,49 @@ class WidgetIconCoverCards extends \WP_Widget { echo $args['before_title'] . esc_html($title) . $args['after_title']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } - $style = sprintf('--aksrt-icc-pc:%d;--aksrt-icc-m:%d;--aksrt-icc-icon:%dpx;', $cols, $m_cols, $icon_size); - echo '
'; + $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 '
'; + } + foreach ($cards as $card) { - $url = $card['url']; + $url = (string) ($card['url'] ?? ''); if ($url !== '' && $go_link && function_exists('aksrt_go_link')) { $url = aksrt_go_link($url, true); } - $tag = $url !== '' ? 'a' : 'div'; - $href = $url !== '' ? ' href="' . esc_url($url) . '"' . ($card['target'] !== '' ? ' target="' . esc_attr($card['target']) . '" rel="noopener noreferrer"' : '') : ''; - echo '<' . $tag . ' class="aksrt-icon-cover__item"' . $href . '>'; - echo '
'; - if ($card['icon_image'] !== '') { - echo ''; - } elseif ($card['icon'] !== '') { - echo ''; + $card_args = [ + 'class' => $show_bg ? 'padding-10' : 'zib-widget mb10', + 'icon' => (string) ($card['icon'] ?? ''), + 'icon_image' => (string) ($card['icon_image'] ?? ''), + 'icon_size' => $icon_size, + 'icon_class' => $radius ? 'radius4' : '', + 'icon_color' => (string) ($card['icon_color'] ?? ''), + 'title' => (string) ($card['title'] ?? ''), + 'desc' => (string) ($card['desc'] ?? ''), + 'link' => [ + 'url' => $url, + 'target' => (string) ($card['target'] ?? ''), + ], + ]; + + if ($is_row) { + echo '
'; } + if (function_exists('aksrt_icon_cover_card')) { + echo aksrt_icon_cover_card($card_args); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + } + if ($is_row) { + echo '
'; + } + } + + if ($is_row) { echo '
'; - echo '
'; - if ($card['title'] !== '') { - echo '
' . esc_html($card['title']) . '
'; - } - if ($card['desc'] !== '') { - echo '
' . esc_html($card['desc']) . '
'; - } - echo '
'; } echo '
'; @@ -94,6 +117,7 @@ class WidgetIconCoverCards extends \WP_Widget { continue; } $url = ''; + $target = ''; if (is_array($row['link'] ?? null)) { $url = esc_url_raw(trim((string) ($row['link']['url'] ?? ''))); $target = sanitize_text_field((string) ($row['link']['target'] ?? '')); @@ -106,6 +130,7 @@ class WidgetIconCoverCards extends \WP_Widget { 'desc' => sanitize_text_field((string) ($row['desc'] ?? '')), 'icon' => $icon, 'icon_image' => $icon_image, + 'icon_color' => sanitize_html_class((string) ($row['icon_color'] ?? '')), 'url' => $url, 'target' => $target, ]; @@ -116,6 +141,9 @@ class WidgetIconCoverCards extends \WP_Widget { return $out; } + /** + * @param array $instance + */ public function form($instance): void { $json = is_string($instance['cards'] ?? null) ? (string) $instance['cards'] @@ -144,20 +172,27 @@ class WidgetIconCoverCards extends \WP_Widget {


+

$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'] ?? '')), - 'cards' => $this->normalize($new_instance['cards'] ?? []), - 'pc_row' => max(1, min(4, (int) ($new_instance['pc_row'] ?? 2))), - 'm_row' => max(1, min(2, (int) ($new_instance['m_row'] ?? 1))), - 'icon_size' => max(16, min(48, (int) ($new_instance['icon_size'] ?? 25))), - 'icon_radius4' => !empty($new_instance['icon_radius4']) ? 1 : 0, - 'go_link' => !empty($new_instance['go_link']) ? 1 : 0, + 'title' => sanitize_text_field((string) ($new_instance['title'] ?? '')), + 'cards' => $this->normalize($new_instance['cards'] ?? []), + 'pc_row' => max(1, min(4, (int) ($new_instance['pc_row'] ?? 2))), + 'm_row' => max(1, min(2, (int) ($new_instance['m_row'] ?? 1))), + 'icon_size' => max(16, min(48, (int) ($new_instance['icon_size'] ?? 25))), + 'icon_radius4' => !empty($new_instance['icon_radius4']) ? 1 : 0, + 'show_widget_bg' => !empty($new_instance['show_widget_bg']) ? 1 : 0, + 'go_link' => !empty($new_instance['go_link']) ? 1 : 0, ]; } }