diff --git a/assets/css/frontend/widget-batch5.css b/assets/css/frontend/widget-batch5.css index 1932594b..bfcfd826 100644 --- a/assets/css/frontend/widget-batch5.css +++ b/assets/css/frontend/widget-batch5.css @@ -367,3 +367,13 @@ text-decoration: none; } .aksrt-scroll-notice__item i { margin-right: 6px; opacity: .85; } + +.hot-post-item { display: flex; align-items: center; gap: 10px; } +.hot-post-item__thumb { + width: 48px; height: 48px; border-radius: 8px; overflow: hidden; flex-shrink: 0; + background: var(--surface-2, #eee); +} +.hot-post-item__thumb img { width: 100%; height: 100%; object-fit: cover; display: block; } +.aksrt-cover-card__bg.is-video video { + width: 100%; height: 100%; object-fit: cover; display: block; +} diff --git a/src/AKSRT/Widgets/FriendLinksWidget.php b/src/AKSRT/Widgets/FriendLinksWidget.php index 3114456c..b4b9de51 100644 --- a/src/AKSRT/Widgets/FriendLinksWidget.php +++ b/src/AKSRT/Widgets/FriendLinksWidget.php @@ -1,5 +1,7 @@ esc_html__('显示友情链接列表', 'aksrt'), - ]); - } + public function __construct() { + parent::__construct('aksrt_friend_links', esc_html__('AKSRT 友情链接', 'aksrt'), [ + 'description' => esc_html__('显示友情链接(设置项或 WordPress 书签)。', 'aksrt'), + ]); + } - public function widget($args, $instance): void { - echo $args['before_widget']; - $title = apply_filters('widget_title', $instance['title'] ?? __('友情链接', 'aksrt'), $instance, $this->id_base); - $show_icon = !empty($instance['show_icon']); - $columns = max(1, min(4, (int) ($instance['columns'] ?? 2))); + public function widget($args, $instance): void { + echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + $title = apply_filters('widget_title', (string) ($instance['title'] ?? __('友情链接', 'aksrt')), $instance, $this->id_base); + $show_icon = !empty($instance['show_icon']) || !isset($instance['show_icon']); + $columns = max(1, min(4, (int) ($instance['columns'] ?? 2))); + $source = sanitize_key((string) ($instance['source'] ?? 'settings')); + $go_link = !empty($instance['go_link']); + $limit = max(1, min(100, (int) ($instance['limit'] ?? 24))); - if ($title) echo $args['before_title'] . esc_html($title) . $args['after_title']; + if ($title) { + echo $args['before_title'] . esc_html($title) . $args['after_title']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + } - $links = class_exists('\AKSRT\Settings\Settings') ? \AKSRT\Settings\Settings::get_friend_links() : []; + $links = $this->resolve_links($source, $instance, $limit); + if (!$links) { + 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; + } + ?> + + - - - ' . esc_html__('暂无友情链接', 'aksrt') . '

'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?> - $instance + * @return array> + */ + private function resolve_links(string $source, array $instance, int $limit): array { + if ($source === 'bookmarks') { + $bm_args = [ + 'orderby' => sanitize_key((string) ($instance['orderby'] ?? 'name')) ?: 'name', + 'order' => strtoupper((string) ($instance['order'] ?? 'ASC')) === 'DESC' ? 'DESC' : 'ASC', + 'limit' => $limit, + ]; + $cats = trim((string) ($instance['cats'] ?? '')); + if ($cats !== '') { + $bm_args['category'] = $cats; + } + $out = []; + foreach (get_bookmarks($bm_args) as $b) { + $out[] = [ + 'name' => (string) $b->link_name, + 'url' => (string) $b->link_url, + 'description' => (string) $b->link_description, + 'icon' => (string) $b->link_image, + ]; + } + return $out; + } - echo $args['after_widget']; - } + $links = class_exists('\AKSRT\Settings\Settings') ? \AKSRT\Settings\Settings::get_friend_links() : []; + if (!is_array($links) || !$links) { + // Fallback to WP bookmarks when settings empty. + return $this->resolve_links('bookmarks', $instance, $limit); + } + return array_slice(array_values($links), 0, $limit); + } - public function form($instance): void { - ?> -

- - -

-

- - -

-

- -

-

- +

+ +

+

+ +

+

+ + +

+

+ +

+

+
+ +

+ sanitize_text_field($new_instance['title'] ?? ''), - 'columns' => max(1, min(4, (int) ($new_instance['columns'] ?? 2))), - 'show_icon'=> !empty($new_instance['show_icon']), - ]; - } + public function update($new_instance, $old_instance): array { + return [ + 'title' => sanitize_text_field((string) ($new_instance['title'] ?? '')), + 'source' => ($new_instance['source'] ?? '') === 'bookmarks' ? 'bookmarks' : 'settings', + 'columns' => max(1, min(4, (int) ($new_instance['columns'] ?? 2))), + 'limit' => max(1, min(100, (int) ($new_instance['limit'] ?? 24))), + 'cats' => sanitize_text_field((string) ($new_instance['cats'] ?? '')), + 'show_icon' => !empty($new_instance['show_icon']) ? 1 : 0, + 'go_link' => !empty($new_instance['go_link']) ? 1 : 0, + 'orderby' => sanitize_key((string) ($new_instance['orderby'] ?? 'name')), + 'order' => strtoupper((string) ($new_instance['order'] ?? 'ASC')) === 'DESC' ? 'DESC' : 'ASC', + ]; + } } diff --git a/src/AKSRT/Widgets/HotPostsWidget.php b/src/AKSRT/Widgets/HotPostsWidget.php index 0ce3448e..0c52ba49 100644 --- a/src/AKSRT/Widgets/HotPostsWidget.php +++ b/src/AKSRT/Widgets/HotPostsWidget.php @@ -27,6 +27,7 @@ class HotPostsWidget extends \WP_Widget { $count = absint($instance['count'] ?? 5); $order_by = $instance['order_by'] ?? 'views'; $days = absint($instance['days'] ?? 30); + $show_thumb = !empty($instance['show_thumb']); if ($title) { echo $args['before_title'] . esc_html($title) . $args['after_title']; @@ -85,6 +86,13 @@ class HotPostsWidget extends \WP_Widget { ?>
+ + + + +
@@ -132,7 +140,11 @@ class HotPostsWidget extends \WP_Widget {

- + +

+'; - if ($image) { + if ($video) { + echo '
'; + echo ''; + echo '
'; + } elseif ($image) { echo '
'; echo '' . esc_attr($card_title) . ''; echo '
';