esc_html__('展示站点用户头像网格,支持排序与筛选。', 'aksrt'), 'classname' => 'widget_aksrt_user_lists', ] ); } public function widget($args, $instance): void { $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 = $this->parse_ids((string) ($instance['include'] ?? '')); $exclude = $this->parse_ids((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': // Fallback: registered date; fan ranking needs denormalized meta when available. $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; } // If follower meta empty for all, re-query by registered when fan order requested. if ($orderby === 'followed-user-count' && !$include) { $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 && class_exists('\AKSRT\User\Follow')) { // Rank by live follower counts (small N only). 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; }); } } 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 } $wrap = $hide_box ? 'aksrt-user-lists is-bare' : 'aksrt-user-lists'; echo '
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, ]; } }