151 lines
6.8 KiB
PHP
151 lines
6.8 KiB
PHP
<?php
|
||
/**
|
||
* AKSRT User Card Widget — 侧栏用户卡片
|
||
*
|
||
* @package AKSRT
|
||
*/
|
||
|
||
defined('ABSPATH') || exit;
|
||
|
||
class AKSRT_Widget_User_Card extends WP_Widget {
|
||
|
||
public function __construct() {
|
||
parent::__construct(
|
||
'aksrt_user_card',
|
||
__('用户卡片', 'aksrt'),
|
||
['description' => __('在侧栏显示当前登录用户或指定用户的信息卡片。', 'aksrt')]
|
||
);
|
||
}
|
||
|
||
public function widget($args, $instance): void {
|
||
$title = !empty($instance['title']) ? $instance['title'] : '';
|
||
$show_stats = !empty($instance['show_stats']);
|
||
$show_actions = !empty($instance['show_actions']);
|
||
|
||
// 获取目标用户
|
||
$user_id = !empty($instance['user_id']) ? (int) $instance['user_id'] : 0;
|
||
if ($user_id <= 0 && is_user_logged_in()) {
|
||
$user_id = get_current_user_id();
|
||
}
|
||
|
||
if ($user_id <= 0) return;
|
||
|
||
$user = get_userdata($user_id);
|
||
if (!$user) return;
|
||
|
||
// 获取用户统计
|
||
$post_count = count_user_posts($user_id, 'post', true);
|
||
$comment_count = get_comments(['user_id' => $user_id, 'count' => true]);
|
||
$follower_count = 0;
|
||
$following_count = 0;
|
||
if (class_exists('AKSRT_Follow')) {
|
||
$follower_count = AKSRT_Follow::get_instance()->get_follower_count($user_id);
|
||
$following_count = AKSRT_Follow::get_instance()->get_following_count($user_id);
|
||
}
|
||
|
||
// 头像
|
||
$avatar_url = function_exists('aksrt_get_avatar_url')
|
||
? aksrt_get_avatar_url($user_id, ['size' => 144])
|
||
: get_avatar_url($user_id, ['size' => 144]);
|
||
|
||
// 用户主页链接
|
||
$profile_url = function_exists('aksrt_get_user_home_url')
|
||
? aksrt_get_user_home_url($user_id)
|
||
: get_author_posts_url($user_id);
|
||
|
||
// 简介
|
||
$bio = get_user_meta($user_id, 'description', true);
|
||
if (!$bio) $bio = $user->description ?: '';
|
||
|
||
echo $args['before_widget'];
|
||
|
||
if ($title) {
|
||
echo $args['before_title'] . esc_html($title) . $args['after_title'];
|
||
}
|
||
|
||
echo '<div class="aksrt-user-card">';
|
||
|
||
// 头像
|
||
echo '<div class="aksrt-user-card__avatar">';
|
||
echo '<a href="' . esc_url($profile_url) . '">';
|
||
echo '<img src="' . esc_url($avatar_url) . '" alt="' . esc_attr($user->display_name) . '"' . (function_exists('aksrt_lazy_loading') ? aksrt_lazy_loading('avatar') : ' loading="lazy"') . '>';
|
||
echo '</a>';
|
||
echo '</div>';
|
||
|
||
// 昵称
|
||
echo '<h4 class="aksrt-user-card__name">';
|
||
echo '<a href="' . esc_url($profile_url) . '">' . esc_html($user->display_name) . '</a>';
|
||
echo '</h4>';
|
||
|
||
// 简介
|
||
if ($bio) {
|
||
echo '<p class="aksrt-user-card__bio">' . esc_html(wp_trim_words($bio, 20)) . '</p>';
|
||
}
|
||
|
||
// 统计
|
||
if ($show_stats) {
|
||
echo '<div class="aksrt-user-card__stats">';
|
||
echo '<div class="aksrt-user-card__stat"><span class="aksrt-user-card__stat-value">' . number_format_i18n($post_count) . '</span><span class="aksrt-user-card__stat-label">' . esc_html__('文章', 'aksrt') . '</span></div>';
|
||
echo '<div class="aksrt-user-card__stat"><span class="aksrt-user-card__stat-value">' . number_format_i18n($follower_count) . '</span><span class="aksrt-user-card__stat-label">' . esc_html__('粉丝', 'aksrt') . '</span></div>';
|
||
echo '<div class="aksrt-user-card__stat"><span class="aksrt-user-card__stat-value">' . number_format_i18n($following_count) . '</span><span class="aksrt-user-card__stat-label">' . esc_html__('关注', 'aksrt') . '</span></div>';
|
||
echo '</div>';
|
||
}
|
||
|
||
// 操作按钮
|
||
if ($show_actions) {
|
||
echo '<div class="aksrt-user-card__actions">';
|
||
if (is_user_logged_in() && (int) get_current_user_id() === $user_id) {
|
||
echo '<a href="' . esc_url($profile_url) . '" class="aksrt-user-card__btn aksrt-user-card__btn--primary">' . esc_html__('个人主页', 'aksrt') . '</a>';
|
||
if (function_exists('aksrt_get_user_center_url')) {
|
||
echo '<a href="' . esc_url(aksrt_get_user_center_url()) . '" class="aksrt-user-card__btn aksrt-user-card__btn--ghost">' . esc_html__('设置', 'aksrt') . '</a>';
|
||
}
|
||
} else {
|
||
echo '<a href="' . esc_url($profile_url) . '" class="aksrt-user-card__btn aksrt-user-card__btn--primary">' . esc_html__('查看主页', 'aksrt') . '</a>';
|
||
}
|
||
echo '</div>';
|
||
}
|
||
|
||
echo '</div>';
|
||
|
||
echo $args['after_widget'];
|
||
}
|
||
|
||
public function form($instance): void {
|
||
$title = !empty($instance['title']) ? $instance['title'] : '';
|
||
$user_id = !empty($instance['user_id']) ? (int) $instance['user_id'] : 0;
|
||
$show_stats = !empty($instance['show_stats']);
|
||
$show_actions = !empty($instance['show_actions']);
|
||
?>
|
||
<p>
|
||
<label for="<?php echo esc_attr($this->get_field_id('title')); ?>"><?php esc_html_e('标题(可选):', 'aksrt'); ?></label>
|
||
<input class="widefat" id="<?php echo esc_attr($this->get_field_id('title')); ?>" name="<?php echo esc_attr($this->get_field_name('title')); ?>" type="text" value="<?php echo esc_attr($title); ?>">
|
||
</p>
|
||
<p>
|
||
<label for="<?php echo esc_attr($this->get_field_id('user_id')); ?>"><?php esc_html_e('用户 ID(0 = 当前登录用户):', 'aksrt'); ?></label>
|
||
<input class="widefat" id="<?php echo esc_attr($this->get_field_id('user_id')); ?>" name="<?php echo esc_attr($this->get_field_name('user_id')); ?>" type="number" value="<?php echo esc_attr((string) $user_id); ?>" min="0">
|
||
</p>
|
||
<p>
|
||
<label>
|
||
<input type="checkbox" id="<?php echo esc_attr($this->get_field_id('show_stats')); ?>" name="<?php echo esc_attr($this->get_field_name('show_stats')); ?>" value="1" <?php checked($show_stats); ?>>
|
||
<?php esc_html_e('显示统计(文章、粉丝、关注)', 'aksrt'); ?>
|
||
</label>
|
||
</p>
|
||
<p>
|
||
<label>
|
||
<input type="checkbox" id="<?php echo esc_attr($this->get_field_id('show_actions')); ?>" name="<?php echo esc_attr($this->get_field_name('show_actions')); ?>" value="1" <?php checked($show_actions); ?>>
|
||
<?php esc_html_e('显示操作按钮', 'aksrt'); ?>
|
||
</label>
|
||
</p>
|
||
<?php
|
||
}
|
||
|
||
public function update($new_instance, $old_instance): array {
|
||
$instance = [];
|
||
$instance['title'] = sanitize_text_field($new_instance['title'] ?? '');
|
||
$instance['user_id'] = (int) ($new_instance['user_id'] ?? 0);
|
||
$instance['show_stats'] = !empty($new_instance['show_stats']);
|
||
$instance['show_actions'] = !empty($new_instance['show_actions']);
|
||
return $instance;
|
||
}
|
||
}
|