子比主题会员动态轮播小工具

子比主题会员动态轮播小工具

把下方内容添加到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
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容