From e2decd8d71f7a3bc926a77f8547af489469bf48e Mon Sep 17 00:00:00 2001
From: unknown
Date: Sun, 19 Jul 2026 01:14:38 +0800
Subject: [PATCH] feat(widgets): friend-links bookmarks source, hot thumbs,
cover video
Deepen existing widgets toward zibll: WP bookmarks source for friend
links, optional hot-post thumbnails, and video backgrounds on cover
cards.
---
assets/css/frontend/widget-batch5.css | 10 ++
src/AKSRT/Widgets/FriendLinksWidget.php | 188 +++++++++++++++++-------
src/AKSRT/Widgets/HotPostsWidget.php | 14 +-
src/AKSRT/Widgets/WidgetCoverCards.php | 7 +-
4 files changed, 160 insertions(+), 59 deletions(-)
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 '
 . ')
';
echo '
';