Files
wordpress-theme-aksrt/inc/classes/widgets/class-aksrt-user-card-widget.php
T

151 lines
6.8 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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;
}
}