diff --git a/src/AKSRT/Core/WidgetAjax.php b/src/AKSRT/Core/WidgetAjax.php index f4878580..c16a409e 100644 --- a/src/AKSRT/Core/WidgetAjax.php +++ b/src/AKSRT/Core/WidgetAjax.php @@ -39,6 +39,11 @@ class WidgetAjax { 'callback' => [$this, 'rest_paid_posts'], 'permission_callback' => '__return_true', ]); + register_rest_route('aksrt/v1', '/widgets/category-tabs', [ + 'methods' => 'GET', + 'callback' => [$this, 'rest_category_tabs'], + 'permission_callback' => '__return_true', + ]); } public function rest_main_posts(\WP_REST_Request $request) { @@ -116,4 +121,38 @@ class WidgetAjax { 'total' => (int) ($payload['total'] ?? 0), ], 200); } + + public function rest_category_tabs(\WP_REST_Request $request) { + $cat = max(0, (int) ($request->get_param('cat') ?? 0)); + $count = max(1, min(12, (int) ($request->get_param('count') ?? 6))); + $layout = sanitize_key((string) ($request->get_param('layout') ?? 'card')); + $columns = max(1, min(4, (int) ($request->get_param('columns') ?? 3))); + $context = sanitize_key((string) ($request->get_param('context') ?? 'homepage')); + if ($cat <= 0) { + return new \WP_REST_Response(['success' => true, 'html' => ''], 200); + } + $post_types = function_exists('aksrt_home_widget_post_types') ? aksrt_home_widget_post_types() : ['post']; + $query = new \WP_Query([ + 'post_type' => $post_types, + 'post_status' => 'publish', + 'posts_per_page' => $count, + 'ignore_sticky_posts' => true, + 'no_found_rows' => true, + 'cat' => $cat, + ]); + ob_start(); + if (function_exists('aksrt_home_widget_render_post_grid')) { + aksrt_home_widget_render_post_grid($query, $layout, $columns, $context); + } elseif ($query->have_posts()) { + echo ''; + } + wp_reset_postdata(); + $html = (string) ob_get_clean(); + return new \WP_REST_Response(['success' => true, 'html' => $html], 200); + } } diff --git a/src/AKSRT/Widgets/CategoryTabsWidget.php b/src/AKSRT/Widgets/CategoryTabsWidget.php index a996a157..aa738b19 100644 --- a/src/AKSRT/Widgets/CategoryTabsWidget.php +++ b/src/AKSRT/Widgets/CategoryTabsWidget.php @@ -38,7 +38,7 @@ class CategoryTabsWidget extends \WP_Widget { $tabs = $this->resolve_tabs($instance); echo $args['before_widget']; - echo '
'; + echo '
'; if (empty($tabs)) { echo function_exists('aksrt_get_widget_null') ? aksrt_get_widget_null(__('暂无可用分类', 'aksrt')) : '

' . esc_html__('暂无可用分类', 'aksrt') . '

'; @@ -69,33 +69,96 @@ class CategoryTabsWidget extends \WP_Widget { $tab) { - $query = new \WP_Query([ - 'post_type' => aksrt_home_widget_post_types(), - 'post_status' => 'publish', - 'posts_per_page' => $count, - 'ignore_sticky_posts' => true, - 'no_found_rows' => true, - 'cat' => (int) $tab['id'], - ]); ?> -
> - - - +
> + aksrt_home_widget_post_types(), + 'post_status' => 'publish', + 'posts_per_page' => $count, + 'ignore_sticky_posts' => true, + 'no_found_rows' => true, + 'cat' => (int) $tab['id'], + ]); + aksrt_home_widget_render_post_grid($query, $layout, $columns, $context); + wp_reset_postdata(); + if ($show_more) : ?> + + +
+ + '; echo $args['after_widget']; } - public function form($instance): void { +public function form($instance): void { $title = (string) ($instance['title'] ?? ''); $category_ids = aksrt_home_widget_normalize_category_ids($instance['category_ids'] ?? [], 6); $count = (int) ($instance['count'] ?? 6); diff --git a/src/AKSRT/Widgets/WidgetUserRanking.php b/src/AKSRT/Widgets/WidgetUserRanking.php index c64dd3c2..b8fb394d 100644 --- a/src/AKSRT/Widgets/WidgetUserRanking.php +++ b/src/AKSRT/Widgets/WidgetUserRanking.php @@ -23,7 +23,8 @@ class WidgetUserRanking extends \WP_Widget { $count = max(1, min(20, (int) ($instance['count'] ?? 5))); $show_avatar = !empty($instance['show_avatar']); - $users = $this->get_ranking($rank_by, $count); + $desc_mode = sanitize_key((string) ($instance['desc'] ?? 'desc')); + $users = $this->get_ranking($rank_by, $count, $desc_mode); if (empty($users)) return; echo $args['before_widget']; @@ -60,8 +61,13 @@ class WidgetUserRanking extends \WP_Widget { echo ''; } - // 昵称 + // 昵称 + 可选签名/附加信息 + echo '
'; echo '' . esc_html($user['name']) . ''; + if (!empty($user['desc'])) { + echo '
' . esc_html((string) $user['desc']) . '
'; + } + echo '
'; // 数值 echo '' . esc_html($user['value']) . ''; @@ -73,7 +79,7 @@ class WidgetUserRanking extends \WP_Widget { echo $args['after_widget']; } - private function get_ranking(string $rank_by, int $count): array { + private function get_ranking(string $rank_by, int $count, string $desc_mode = 'desc'): array { $users = []; switch ($rank_by) { @@ -93,6 +99,7 @@ class WidgetUserRanking extends \WP_Widget { 'id' => (int) $row['user_id'], 'name' => $user->display_name, 'value' => number_format_i18n((int) $row['credits']) . ' 积分', + 'desc' => $this->user_extra_desc((int) $row['user_id'], $user, $desc_mode), ]; } } @@ -112,6 +119,7 @@ class WidgetUserRanking extends \WP_Widget { 'id' => $user->ID, 'name' => $user->display_name, 'value' => number_format_i18n($post_count) . ' 篇', + 'desc' => $this->user_extra_desc($user->ID, $user, $desc_mode), ]; } } @@ -137,6 +145,7 @@ class WidgetUserRanking extends \WP_Widget { 'id' => $uid, 'name' => $user->display_name, 'value' => number_format_i18n((int) $row['val']) . ' 天', + 'desc' => $this->user_extra_desc($uid, $user, $desc_mode), ]; } if (count($users) >= $count) break; @@ -163,6 +172,7 @@ class WidgetUserRanking extends \WP_Widget { 'id' => $uid, 'name' => $user->display_name, 'value' => number_format_i18n((int) $row['val']) . ' 天', + 'desc' => $this->user_extra_desc($uid, $user, $desc_mode), ]; } if (count($users) >= $count) break; @@ -189,6 +199,7 @@ class WidgetUserRanking extends \WP_Widget { 'id' => (int) $row['following_id'], 'name' => $user->display_name, 'value' => number_format_i18n((int) $row['cnt']) . ' 粉丝', + 'desc' => $this->user_extra_desc((int) $row['following_id'], $user, $desc_mode), ]; } } @@ -200,6 +211,37 @@ class WidgetUserRanking extends \WP_Widget { return $users; } + + private function user_extra_desc(int $user_id, $user, string $mode): string { + switch ($mode) { + case 'user_registered': + if ($user && !empty($user->user_registered)) { + $days = max(0, (int) floor((time() - strtotime($user->user_registered)) / DAY_IN_SECONDS)); + return sprintf(__('加入 %d 天', 'aksrt'), $days); + } + return ''; + case 'last_login': + $t = (string) get_user_meta($user_id, 'aksrt_last_login', true); + if ($t === '') { + $t = (string) get_user_meta($user_id, 'last_login', true); + } + return $t !== '' ? sprintf(__('最近登录 %s', 'aksrt'), $t) : ''; + case 'last_checkin': + $t = (string) get_user_meta($user_id, 'aksrt_last_checkin', true); + if ($t === '') { + $t = (string) get_user_meta($user_id, 'last_checkin', true); + } + return $t !== '' ? sprintf(__('最近签到 %s', 'aksrt'), $t) : ''; + case 'desc': + default: + $bio = get_user_meta($user_id, 'description', true); + if (!is_string($bio) || $bio === '') { + $bio = $user ? (string) $user->description : ''; + } + return $bio !== '' ? wp_trim_words($bio, 12) : ''; + } + } + public function form($instance): void { $title = !empty($instance['title']) ? $instance['title'] : __('排行榜', 'aksrt'); $rank_by = !empty($instance['rank_by']) ? $instance['rank_by'] : 'credits'; @@ -230,6 +272,15 @@ class WidgetUserRanking extends \WP_Widget {

+

+ + +