esc_html__('展示站点用户头像网格,支持排序与筛选。', 'aksrt'), 'classname' => 'widget_aksrt_user_lists', ] ); } /** @return array */ public static function parse_ids_static(string $raw): array { if ($raw === '') { return []; } $ids = []; foreach (preg_split('/[\s,]+/', $raw) ?: [] as $p) { $id = (int) $p; if ($id > 0) { $ids[] = $id; } } return array_values(array_unique($ids)); } public static function render_html(array $instance): string { $number = max(1, min(50, (int) ($instance['number'] ?? 8))); $orderby = sanitize_key((string) ($instance['orderby'] ?? 'user_registered')); $order = strtoupper((string) ($instance['order'] ?? 'DESC')) === 'ASC' ? 'ASC' : 'DESC'; $include = self::parse_ids_static((string) ($instance['include'] ?? '')); $exclude = self::parse_ids_static((string) ($instance['exclude'] ?? '')); $hide_box = !empty($instance['hide_box']); $query = [ 'number' => $number, 'order' => $order, 'fields' => ['ID', 'display_name', 'user_nicename'], ]; if ($include) { $query['include'] = $include; $query['orderby'] = 'include'; } else { switch ($orderby) { case 'display_name': $query['orderby'] = 'display_name'; break; case 'post_count': $query['orderby'] = 'post_count'; break; case 'last_login': $query['meta_key'] = 'aksrt_last_login'; $query['orderby'] = 'meta_value'; break; case 'followed-user-count': $query['meta_key'] = 'aksrt_follower_count'; $query['orderby'] = 'meta_value_num'; break; default: $query['orderby'] = 'user_registered'; } } if ($exclude) { $query['exclude'] = $exclude; } $users = get_users($query); if (!$users) { return function_exists('aksrt_get_ajax_null') ? aksrt_get_ajax_null(__('暂无用户', 'aksrt')) : '

' . esc_html__('暂无用户', 'aksrt') . '

'; } if ($orderby === 'followed-user-count' && !$include && class_exists('\AKSRT\User\Follow')) { $has_meta = false; foreach ($users as $u) { if ((int) get_user_meta($u->ID, 'aksrt_follower_count', true) > 0) { $has_meta = true; break; } } if (!$has_meta) { usort($users, static function ($a, $b) { $fa = \AKSRT\User\Follow::get_instance()->get_follower_count((int) $a->ID); $fb = \AKSRT\User\Follow::get_instance()->get_follower_count((int) $b->ID); return $fb <=> $fa; }); } } ob_start(); $wrap = $hide_box ? 'aksrt-user-lists is-bare ajax-item' : 'aksrt-user-lists ajax-item'; echo '
'; foreach ($users as $user) { $uid = (int) $user->ID; $avatar = function_exists('aksrt_get_avatar_url') ? aksrt_get_avatar_url($uid, ['size' => 96]) : get_avatar_url($uid, ['size' => 96]); $home = function_exists('aksrt_get_user_home_url') ? aksrt_get_user_home_url($uid) : get_author_posts_url($uid); $name = $user->display_name ?: $user->user_nicename; echo ''; echo '' . esc_attr($name) . ''; echo '' . esc_html($name) . ''; echo ''; } echo '
'; return (string) ob_get_clean(); } public function widget($args, $instance): void { $html = self::render_html($instance); 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 } $rest = rest_url('aksrt/v1/widgets/user-lists'); echo '
'; echo $html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo '
'; echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } private function parse_ids(string $raw): array { return self::parse_ids_static($raw); } public function form($instance): void { ?>

sanitize_text_field((string) ($new_instance['title'] ?? '')), 'number' => max(1, min(50, (int) ($new_instance['number'] ?? 8))), 'include' => sanitize_text_field((string) ($new_instance['include'] ?? '')), 'exclude' => sanitize_text_field((string) ($new_instance['exclude'] ?? '')), 'orderby' => $orderby, 'order' => strtoupper((string) ($new_instance['order'] ?? 'DESC')) === 'ASC' ? 'ASC' : 'DESC', 'hide_box' => !empty($new_instance['hide_box']) ? 1 : 0, ]; } }