
把下方内容添加到func.php中,然后去外观-小工具-会员动态 添加到合适的位置
<?php
/**
* 会员动态小工具 - 单行紧凑版(含管理员)
*/
class Member_Activity_Widget extends WP_Widget {
public function __construct() {
parent::__construct(
'member_activity_widget',
'会员动态',
array('description' => '单行紧凑版会员动态(含管理员)')
);
}
public function widget($args, $instance) {
echo $args['before_widget'];
if (!empty($instance['title'])) {
echo $args['before_title'] . apply_filters('widget_title', $instance['title']) . $args['after_title'];
}
// 获取所有用户的活动记录(含管理员)
$activities = $this->get_user_activities(9);
// 如果没有数据,使用示例数据
if (empty($activities)) {
$activities = $this->get_sample_activities();
}
// 背景颜色配置
$bg_colors = array(
'rgba(255, 220, 235, 0.7)', // 粉色
'rgba(245, 245, 245, 0.8)', // 灰色
'rgba(220, 255, 235, 0.7)' // 绿色
);
// 将活动记录分组(每组3个)
$groups = array_chunk($activities, 3);
?>
<!-- 引入 Swiper.js -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css">
<script src="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js"></script>
<!-- 滚动容器 -->
<div class="member-activity-swiper-container">
<div class="swiper member-activity-swiper">
<div class="swiper-wrapper">
<?php foreach ($groups as $group_index => $group) : ?>
<div class="swiper-slide">
<div class="activity-row">
<?php foreach ($group as $index => $activity) :
$bg_color = $bg_colors[$index % 3];
?>
<div class="activity-card" style="background: <?php echo $bg_color; ?>;">
<div class="activity-inner">
<!-- 头像 -->
<div class="activity-avatar">
<?php echo get_avatar($activity['user_id'], 30); ?>
</div>
<!-- 内容区域 - 单行显示 -->
<div class="activity-info">
<div class="activity-row-content">
<span class="activity-name"><?php echo esc_html($activity['display_name']); ?></span>
<span class="activity-action"><?php echo esc_html($activity['action']); ?></span>
<?php if (!empty($activity['title'])) : ?>
<span class="activity-title"><?php echo esc_html($activity['title']); ?></span>
<?php endif; ?>
</div>
</div>
<!-- 时间 -->
<div class="activity-time"><?php echo $this->time_ago($activity['time']); ?></div>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
</div>
<!-- 初始化脚本 -->
<script>
document.addEventListener('DOMContentLoaded', function() {
new Swiper('.member-activity-swiper', {
direction: 'vertical',
loop: true,
autoplay: {
delay: 5000,
disableOnInteraction: false,
pauseOnMouseEnter: true
},
speed: 800,
slidesPerView: 1,
spaceBetween: 6,
centeredSlides: true
});
});
</script>
<?php
echo $args['after_widget'];
}
/**
* 获取所有用户的活动记录(含管理员)
*/
private function get_user_activities($limit = 9) {
global $wpdb;
$activities = array();
// 1. 查询所有用户的文章发布记录
$posts = $wpdb->get_results($wpdb->prepare(
"SELECT p.ID, p.post_author, p.post_title, p.post_date, u.display_name
FROM {$wpdb->posts} p
INNER JOIN {$wpdb->users} u ON p.post_author = u.ID
WHERE p.post_type = 'post' AND p.post_status = 'publish'
ORDER BY p.post_date DESC
LIMIT %d",
$limit
), ARRAY_A);
foreach ($posts as $post) {
$activities[] = array(
'user_id' => $post['post_author'],
'display_name' => $post['display_name'],
'action' => '发布了',
'title' => $post['post_title'],
'time' => $post['post_date'],
'type' => 'post'
);
}
// 2. 查询所有用户的评论记录
$comments = $wpdb->get_results($wpdb->prepare(
"SELECT c.comment_author, c.comment_date, c.user_id, c.comment_post_ID, p.post_title, u.display_name
FROM {$wpdb->comments} c
LEFT JOIN {$wpdb->users} u ON c.user_id = u.ID
LEFT JOIN {$wpdb->posts} p ON c.comment_post_ID = p.ID
WHERE c.comment_approved = '1'
ORDER BY c.comment_date DESC
LIMIT %d",
$limit
), ARRAY_A);
foreach ($comments as $comment) {
$user_name = !empty($comment['display_name']) ? $comment['display_name'] : $comment['comment_author'];
$activities[] = array(
'user_id' => $comment['user_id'] ? $comment['user_id'] : 0,
'display_name' => $user_name,
'action' => '评论了',
'title' => $comment['post_title'],
'time' => $comment['comment_date'],
'type' => 'comment'
);
}
// 3. 查询所有用户的下载记录
$activities = array_merge($activities, $this->get_download_records($limit));
// 4. 查询所有用户的付费阅读记录
$activities = array_merge($activities, $this->get_pay_read_records($limit));
// 按时间排序并去重
usort($activities, function($a, $b) {
return strtotime($b['time']) - strtotime($a['time']);
});
$seen = array();
$unique_activities = array();
foreach ($activities as $activity) {
$key = $activity['user_id'] . '-' . $activity['type'] . '-' . $activity['time'];
if (!isset($seen[$key])) {
$seen[$key] = true;
$unique_activities[] = $activity;
}
}
return array_slice($unique_activities, 0, $limit);
}
/**
* 查询所有用户的下载记录
*/
private function get_download_records($limit = 3) {
global $wpdb;
$records = array();
if ($wpdb->get_var("SHOW TABLES LIKE '{$wpdb->prefix}zibll_downloads'")) {
$downloads = $wpdb->get_results($wpdb->prepare(
"SELECT d.user_id, d.post_id, d.download_time, p.post_title, u.display_name
FROM {$wpdb->prefix}zibll_downloads d
LEFT JOIN {$wpdb->posts} p ON d.post_id = p.ID
LEFT JOIN {$wpdb->users} u ON d.user_id = u.ID
ORDER BY d.download_time DESC
LIMIT %d",
$limit
), ARRAY_A);
foreach ($downloads as $download) {
$records[] = array(
'user_id' => $download['user_id'],
'display_name' => $download['display_name'],
'action' => '下载了',
'title' => $download['post_title'],
'time' => $download['download_time'],
'type' => 'download'
);
}
}
return $records;
}
/**
* 查询所有用户的付费阅读记录
*/
private function get_pay_read_records($limit = 3) {
global $wpdb;
$records = array();
if ($wpdb->get_var("SHOW TABLES LIKE '{$wpdb->prefix}zibll_pay_records'")) {
$pay_records = $wpdb->get_results($wpdb->prepare(
"SELECT user_id, post_id, pay_time, u.display_name, p.post_title
FROM {$wpdb->prefix}zibll_pay_records
LEFT JOIN {$wpdb->users} u ON user_id = u.ID
LEFT JOIN {$wpdb->posts} p ON post_id = p.ID
ORDER BY pay_time DESC
LIMIT %d",
$limit
), ARRAY_A);
foreach ($pay_records as $record) {
$records[] = array(
'user_id' => $record['user_id'],
'display_name' => $record['display_name'],
'action' => '付费阅读了',
'title' => $record['post_title'],
'time' => $record['pay_time'],
'type' => 'pay_read'
);
}
}
return $records;
}
/**
* 示例数据
*/
private function get_sample_activities() {
return array(
array('user_id' => 1, 'display_name' => 'admin', 'action' => '发布了', 'title' => '子比美化-在线状态功能', 'time' => date('Y-m-d H:i:s', strtotime('-1 days'))),
array('user_id' => 2, 'display_name' => 'anlan', 'action' => '付费阅读了', 'title' => '子比美化-在线状态功能', 'time' => date('Y-m-d H:i:s', strtotime('-28 days'))),
array('user_id' => 3, 'display_name' => 'qq692589425', 'action' => '热烈欢迎!', 'title' => '新用户入驻本站', 'time' => date('Y-m-d H:i:s', strtotime('-2 days'))),
array('user_id' => 1, 'display_name' => 'admin', 'action' => '更新了', 'title' => '主题设置', 'time' => date('Y-m-d H:i:s', strtotime('-6 hours'))),
array('user_id' => 4, 'display_name' => '东方桃桃', 'action' => '每日登录', 'title' => '获得积分-5', 'time' => date('Y-m-d H:i:s', strtotime('-5 days'))),
array('user_id' => 5, 'display_name' => '用户A', 'action' => '下载了', 'title' => '主题模板', 'time' => date('Y-m-d H:i:s', strtotime('-3 days'))),
);
}
/**
* 时间格式化
*/
private function time_ago($datetime) {
$now = current_time('timestamp');
$time = strtotime($datetime);
$diff = $now - $time;
if ($diff < 60) return '刚刚';
if ($diff < 3600) return floor($diff / 60) . '分钟前';
if ($diff < 86400) return floor($diff / 3600) . '小时前';
if ($diff < 604800) return floor($diff / 86400) . '天前';
if ($diff < 2592000) return floor($diff / 604800) . '周前';
return floor($diff / 2592000) . '个月前';
}
public function form($instance) {
$title = !empty($instance['title']) ? $instance['title'] : '会员动态';
?>
<p>
<label for="<?php echo esc_attr($this->get_field_id('title')); ?>">标题:</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>
<?php
}
public function update($new_instance, $old_instance) {
$instance = array();
$instance['title'] = (!empty($new_instance['title'])) ? strip_tags($new_instance['title']) : '';
return $instance;
}
}
function register_member_activity_widget() {
register_widget('Member_Activity_Widget');
}
add_action('widgets_init', 'register_member_activity_widget');
// 添加CSS样式
function member_activity_widget_styles() {
?>
<style>
/* 滚动容器 - 超低高度 */
.member-activity-swiper-container {
height: 55px; /* 超低高度 */
overflow: hidden;
position: relative;
width: 100%;
}
.member-activity-swiper {
height: 100%;
width: 100%;
}
/* 一行三列布局 */
.activity-row {
display: flex;
gap: 8px;
width: 100%;
height: 100%;
}
/* 单个卡片 */
.swiper-slide {
width: 100% !important;
flex-shrink: 0;
height: 100%;
}
.activity-card {
flex: 1;
padding: 6px 8px; /* 极少内边距 */
border-radius: 8px;
min-width: 0;
transition: all 0.3s ease;
box-sizing: border-box;
height: 100%;
display: flex;
align-items: center;
}
.activity-card:hover {
transform: translateY(-1px);
box-shadow: 0 2px 6px rgba(0,0,0,0.06);
}
/* 内部布局 */
.activity-inner {
display: flex;
align-items: center;
gap: 6px;
width: 100%;
}
/* 头像 - 极小尺寸 */
.activity-avatar {
flex-shrink: 0;
width: 30px; /* 小头像 */
height: 30px;
border-radius: 50%;
overflow: hidden;
border: 1.5px solid rgba(255,255,255,0.9);
box-shadow: 0 1px 3px rgba(0,0,0,0.06);
}
.activity-avatar img {
width: 100% !important;
height: 100% !important;
object-fit: cover;
}
/* 内容区域 */
.activity-info {
flex: 1;
min-width: 0;
}
/* 单行内容显示 */
.activity-row-content {
display: flex;
align-items: center;
gap: 3px;
white-space: nowrap;
overflow: hidden;
}
/* 用户名 - 彩虹渐变 */
.activity-name {
font-size: 11px; /* 极小字体 */
font-weight: 600;
background-image: linear-gradient(90deg, #07c160, #fb6bea 25%, #3aedff 50%, #fb6bea 75%, #28d079);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
background-size: 200% 100%;
animation: rainbow-scroll 3s linear infinite;
flex-shrink: 0;
}
@keyframes rainbow-scroll {
0% { background-position: 0% 50%; }
100% { background-position: 200% 50%; }
}
/* 动作 */
.activity-action {
font-size: 10px; /* 极小字体 */
color: #666;
flex-shrink: 0;
}
/* 活动标题 */
.activity-title {
font-size: 10px; /* 极小字体 */
color: #1E90FF;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
min-width: 0;
}
/* 时间 */
.activity-time {
flex-shrink: 0;
font-size: 10px; /* 极小字体 */
color: #ff6699;
font-weight: 600;
white-space: nowrap;
margin-left: 4px;
}
/* 响应式 */
@media (max-width: 768px) {
.member-activity-swiper-container {
height: 100px;
}
.activity-row {
flex-direction: column;
gap: 6px;
}
.activity-card {
height: auto;
}
}
</style>
<?php
}
add_action('wp_head', 'member_activity_widget_styles');
?>
重要提示
如有解压密码: 看下载页、看下载页、看下载页。
源码工具资源类具有可复制性: 建议具有一定思考和动手能力的用户购买。
请谨慎考虑: 小白用户和缺乏思考动手能力者不建议赞助。
虚拟商品购买须知: 虚拟类商品,一经购买打赏赞助,不支持退款。请谅解,谢谢合作!
© 版权声明
THE END












![子比主题美化 – 文章列表显示修改 列表[一行两个]卡片[一行五个]-源码资源网](/wp-content/uploads/2026/09/12/1ac3a94d5772e2b11a0ee37f3fbe3763.webp)

















暂无评论内容