WordPress创建自定义读者墙功能

249次阅读
72 条评论

前言

在逛 不亦乐乎博客 时,我被其留言页面上读者墙的样式深深吸引。此外,在 wys 的友链页面,我也看到了独特的样式,这让我心痒难耐。于是,我开始在网上搜索相关的信息,偶然发现了张戈博客之前写过的一个插件。虽然这个插件由于年代久远已不再适用,但我决定根据其代码进行修改,并将其实现到自己的博客中。

步骤

1. 添加代码至 functions.php

首先,在你博客的主题目录下找到并打开 functions.php 文件。然后,将以下代码添加到文件末尾:

// 注册并加载读者墙的 CSS 样式
function enqueue_readers_wall_styles() {
    global $post;
    if (is_a($post, 'WP_Post') && has_shortcode($post->post_content, 'readers_wall')) {wp_enqueue_style('readers-wall-style', get_template_directory_uri() . '/css/readers-wall.css', array(), '1.0.0');
    }
}
add_action('wp_enqueue_scripts', 'enqueue_readers_wall_styles');

// 辅助函数:生成排行列表
function generate_readers_list($title, $query, $limit) {
    global $wpdb;
    $output = '';

    // 使用 transient 缓存查询结果
    $transient_key = 'readers_wall_' . md5($query);
    $wall = get_transient($transient_key);

    if (false === $wall) {$wall = $wpdb->get_results($query);
        set_transient($transient_key, $wall, 3600);
    }

    $output .= '<div class="readers-section">';
    $output .= '<h2 class="entry-title">' . esc_html($title) . 'TOP' . esc_html($limit) . '</h2>';

    if ($wall) {
        $output .= "<ul class='readers-list'>";
        foreach ($wall as $comment) {$avatar = get_avatar($comment->comment_author_email, 64, '','', array('loading' => 'lazy'));
            $url = esc_url($comment->comment_author_url ? $comment->comment_author_url : "#");
            $author = esc_html($comment->comment_author);
            $count = intval($comment->cnt);
            // 用作者名称替代邮箱作为 tooltip 的 ID
            $tooltip_id = sanitize_title($author);

            $tooltip = "{$author}<br> 评论数: {$count}";

            $output .= "<li>
                            <a rel='friend' target='_blank' href='{$url}' aria-describedby='tooltip-{$tooltip_id}'>
                                {$avatar}
                                <div class='tooltip' id='tooltip-{$tooltip_id}' role='tooltip'>{$tooltip}</div>
                            </a>
                        </li>";
        }
        $output .= "</ul>";
    } else {$output .= "<p> 没有找到" . esc_html($title) . "数据。</p>";
    }

    $output .= '</div>';

    return $output;
}

// 短代码函数:读者墙
function readers_wall_shortcode() {
    global $wpdb;
    $output = '';

    // 评论总排行榜
    $query2 = $wpdb->prepare("SELECT COUNT(comment_ID) AS cnt, comment_author, comment_author_url, comment_author_email 
        FROM $wpdb->comments 
        LEFT JOIN $wpdb->posts ON ($wpdb->posts.ID = $wpdb->comments.comment_post_ID) 
        WHERE post_password = ''AND comment_approved ='1' 
        AND comment_author != %s 
        GROUP BY comment_author_email 
        ORDER BY cnt DESC 
        LIMIT %d",' 段先森 ',
        12
    );
    $output .= generate_readers_list('评论总排行榜', $query2, 12);

    // 年度评论排行
    $query1 = $wpdb->prepare("SELECT COUNT(comment_ID) AS cnt, comment_author, comment_author_url, comment_author_email 
        FROM (
            SELECT * FROM $wpdb->comments 
            LEFT JOIN $wpdb->posts ON ($wpdb->posts.ID = $wpdb->comments.comment_post_ID) 
            WHERE comment_date BETWEEN DATE_SUB(NOW(), INTERVAL 1 YEAR) AND NOW() 
            AND post_password = ''AND comment_approved ='1'
            AND comment_author != %s
        ) AS tempcmt 
        GROUP BY comment_author_email 
        ORDER BY cnt DESC 
        LIMIT %d",' 段先森 ',
        365
    );
    $output .= generate_readers_list('年度评论排行', $query1, 365);

    // 本月评论排行
    $query2 = $wpdb->prepare("SELECT COUNT(comment_ID) AS cnt, comment_author, comment_author_url, comment_author_email 
        FROM (
            SELECT * FROM $wpdb->comments 
            LEFT JOIN $wpdb->posts ON ($wpdb->posts.ID = $wpdb->comments.comment_post_ID) 
            WHERE DATE_FORMAT(comment_date, '%%Y-%%m') = DATE_FORMAT(NOW(), '%%Y-%%m') 
            AND post_password = ''AND comment_approved ='1'
            AND comment_author != %s
        ) AS tempcmt 
        GROUP BY comment_author_email 
        ORDER BY cnt DESC 
        LIMIT %d",' 段先森 ',
        31
    );
    $output .= generate_readers_list('本月评论排行', $query2, 31);

    // 本周评论排行
    $query3 = $wpdb->prepare("SELECT COUNT(comment_ID) AS cnt, comment_author, comment_author_url, comment_author_email 
        FROM (
            SELECT * FROM $wpdb->comments 
            LEFT JOIN $wpdb->posts ON ($wpdb->posts.ID = $wpdb->comments.comment_post_ID) 
            WHERE YEARWEEK(DATE_FORMAT(comment_date, '%%Y-%%m-%%d')) = YEARWEEK(NOW()) 
            AND post_password = ''AND comment_approved ='1'
            AND comment_author != %s
        ) AS tempcmt 
        GROUP BY comment_author_email 
        ORDER BY cnt DESC 
        LIMIT %d",' 段先森 ',
        7
    );
    $output .= generate_readers_list('本周评论排行', $query3, 7);

    return $output;
}
add_shortcode('readers_wall', 'readers_wall_shortcode');

2. 创建 CSS 文件

在你主题的目录下,找到 css 文件夹,并新建一个名为 readers-wall.css 的文件。将以下样式代码粘贴到该文件中:
/* readers-wall.css */

/* 容器样式 */
.readers-section {margin-bottom: 30px;}
.readers-section h2.entry-title {
    font-size: 24px;
    margin-bottom: 15px;
    color: #333;
}

/* 头像列表样式 */
.readers-list { 
    display: flex; 
    flex-wrap: wrap; 
    list-style: none; 
    padding: 0;
    margin: 0;
}
.readers-list li {
    position: relative;
    margin: 10px;
    width: 50px; /* 调整头像大小 */
    height: 50px;
}
.readers-list li a {
    display: block;
    width: 100%;
    height: 100%;
    text-align: center;
    text-decoration: none;
    position: relative;
}
.readers-list li img {
    width: 100%;
    height: 100%;
    border-radius: 50%;
    box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
    transition: transform 0.3s ease;
}
.readers-list li a:hover img,
.readers-list li a:focus img {transform: scale(1.1);
}

/* 悬停信息框样式 */
.readers-list li .tooltip {
    visibility: hidden;
    opacity: 0;
    width: 160px;
    background-color: rgba(0, 0, 0, 0.75);
    color: #fff;
    text-align: center;
    border-radius: 6px;
    padding: 8px;
    position: absolute;
    bottom: 60px; /* 头像上方 */
    left: 50%;
    transform: translateX(-50%);
    transition: opacity 0.3s ease;
    z-index: 10;
    font-size: 14px;
}
.readers-list li .tooltip::after {
    content: "";
    position: absolute;
    top: 100%; /* 箭头指向头像 */
    left: 50%;
    margin-left: -5px;
    border-width: 5px;
    border-style: solid;
    border-color: rgba(0, 0, 0, 0.75) transparent transparent transparent;
}
.readers-list li:hover .tooltip,
.readers-list li a:focus .tooltip {
    visibility: visible;
    opacity: 1;
}

/* 响应式设计 */
@media (max-width: 600px) {
    .readers-list li {
        width: 40px;
        height: 40px;
    }
    .readers-section h2.entry-title {font-size: 20px;}
    .readers-list li .tooltip {
        width: 140px;
        font-size: 12px;
    }
}

3. 新建页面并插入简码

在你的 WordPress 后台,创建一个新页面或编辑现有页面,并插入以下简码:
readers_wall

WordPress 创建自定义读者墙功能

结尾

以上就是我在个人博客上实现自定义读者墙功能的步骤。如果你希望根据自己的需求进行样式调整,可以随意修改 readers-wall.css 中的 CSS 代码,

[tip type=”info”]感谢 maie 的提醒,已修改 funtions.php 相关代码,隐藏邮箱地址。新增评论排行总榜[/tip]

正文完
 0
段先森
版权声明:本站原创文章,由 段先森 于2024-10-08发表,共计5214字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(72 条评论)
验证码
粽叶加米 评论达人 LV.2
2024-10-15 11:45:57 回复

真不错,我还上榜单了。

 Windows  Chrome  亚太地区亚太地区
wys 评论达人 LV.1
2024-10-15 08:00:16 回复

:roll: 哈哈,被点名了。。
//近两天还在啃初试笔记(/114.html),以至于今儿再次看到“三无青年”站名时,不自觉地就把“三无”与刚看过笔记里的“三无”进行匹配了:
三无:⑴无法定扶养人,或者虽有法定扶养人,但是扶养义务人无扶养能力的;⑵无劳动能力的;⑶无生活来源的。(《2021 社会工作实务(中级)》-p169) :mrgreen:

 Windows  Chrome  中国宁夏中卫市移动
    段先森 博主
    2024-10-15 08:01:37 回复

    @wys 啊哈,哈哈哈,我的三无是网络定义 :grin:

     Windows  Chrome
小陈故事 评论达人 LV.1
2024-10-14 16:06:42 回复

博客写着写着,就都成技术员了。 :lol:

 Windows  Chrome  中国重庆重庆市电信
acevs 评论达人 LV.1
2024-10-12 21:53:59 回复

这个好。我来上墙。多留言。

 Windows  Chrome  美国佐治亚亚特兰大
Kevin's 评论达人 LV.1
2024-10-12 17:01:20 回复

okok,空了我也搞一个!!估计就是最近了,我先换个首页去

 Windows  Chrome  中国香港电讯盈科
老麦 评论达人 LV.2
2024-10-12 12:03:01 回复

怎么每次进来的主题都不一样的呢,哈哈哈。
这样的功能能有效的提升博友间的互动,赞一个。

 Windows  Chrome  中国广东省清远市电信
Liudon 评论达人 LV.1
2024-10-11 12:19:26 回复

我记得wordpress支持钩子的吧,你这样后续升级有点麻烦吧

 Macintosh  Chrome  中国北京北京市联通
    段先森 博主
    2024-10-11 14:12:27 回复

    @Liudon 兴趣使然,准备弄成插件形式,修改张戈博客的插件

     Windows  Chrome
      Liudon 评论达人 LV.1
      2024-10-11 19:32:58 回复

      @段先森 你的邮件通知里点击的链接是空的

       Macintosh  Chrome  中国北京北京市联通
2024-10-11 09:05:04 回复

看着很溜啊,双击666。 :aini: :aini:

 Windows  Firefox  中国江苏省无锡市电信
竹语随风 评论达人 LV.1
2024-10-11 08:51:01 回复

厉害 前来膜拜大佬

 Windows  Chrome  中国湖北省黄冈市联通
wu先生 评论达人 LV.1
2024-10-10 11:48:33 回复

不明觉历哈。

 Windows  Edge  中国湖北省武汉市广电
逐风 评论达人 LV.1
2024-10-10 09:34:46 回复

又换主题了哇? 这个主题蛮简洁嘞,好看! :mrgreen:

 Windows  Edge  中国四川省成都市电信
Jeffer.Z 评论达人 LV.1
2024-10-10 09:32:59 回复

如果是wordpress可以给没有头像的人,设置一个默认头像,不然一堆无头像的堆里面不好看,我首页就是一个读者墙,特意加了个超链接,方便博友互相串门。😁

 Android  Chrome  中国北京北京市联通
    段先森 博主
    2024-10-10 09:38:08 回复

    @Jeffer.Z 可以调用本地静态,我没弄,我这是显示的太多了,哈哈

     Windows  Chrome
落落vici 评论达人 LV.1
2024-10-09 22:15:05 回复

那个词叫啥来着,狂炫酷拽吊炸天。

 Macintosh  Chrome  中国广东省深圳市电信
土拨许 评论达人 LV.1
2024-10-09 19:09:11 回复

刚好需要一个类似的功能̋(ˊ•͈ꇴ•͈ˋ)

 iPhone  Safari  中国安徽省蚌埠市联通
冰剑 评论达人 LV.1
2024-10-09 15:44:13 回复

想起了以前弄得血条墙。

 Windows  Chrome  中国湖北省武汉市电信
老狼 评论达人 LV.1
2024-10-09 14:19:26 回复

对于评论活跃的博客,更有意义,其他都是浮云

 Windows  Edge  中国广东省广州市联通
网友小宋 评论达人 LV.2
2024-10-09 11:19:19 回复

年度咱上排行榜了,不过handsome好像自带的有。

 Windows  Edge  中国河南省漯河市联通
    段先森 博主
    2024-10-09 11:22:01 回复

    @网友小宋 嘿嘿,榜一大哥来咯,handsome主题确实自带,所以说他优秀嘛,哈哈 :grin:

     Windows  Chrome
老张博客 评论达人 LV.2
2024-10-09 10:20:09 回复

我的广场被我调好了,来试试呀。

 Windows  Edge  中国江苏省宿迁市移动
maie 评论达人 LV.1
2024-10-09 09:40:52 回复

看起来有点意思 :qiang:

 Windows  Chrome  中国四川省成都市电信
    段先森 博主
    2024-10-09 09:42:38 回复

    @maie 嘿嘿,想一出是一出,瞎折腾

     Windows  Chrome
      maie 评论达人 LV.1
      2024-10-09 17:38:38 回复

      @段先森 貌似页面头像处html会泄漏邮箱,建议修改优化一下

       Windows  Chrome  中国四川省成都市电信
茗总 评论达人 LV.1
2024-10-09 07:20:41 回复

哎呦不错哦

 Windows  Chrome  中国新疆阿勒泰电信
zwwooooo 评论达人 LV.1
2024-10-08 23:40:27 回复

现在还在坚持博客的人很少,能评个论的更少,像我偶尔还会回访的甚少 :xiaoku:

 Windows  Firefox  中国广东省梅州市电信
    段先森 博主
    2024-10-09 07:24:02 回复

    @zwwooooo 哈哈,确实呢,都是熟悉的才会呢 :grin:

     Windows  Chrome
    土拨许 评论达人 LV.1
    2024-10-09 19:08:31 回复

    @zwwooooo 大佬啊,上初中就经常去看的博客。

     iPhone  Safari  中国安徽省蚌埠市联通
皇家元林 评论达人 LV.1
2024-10-08 22:45:31 回复

你这个文章里显示代码这段用的什么插件?很好看啊!
你是用经典编辑器还是区块编辑器?

 Windows  Firefox  中国安徽省移动
Evan 评论达人 LV.1
2024-10-08 22:01:18 回复

搞定了,不过不同浏览器中样式还是会有不同,现在 Chrome中表现最好 ^_^
https://www.evan.xin/say/

 Macintosh  Chrome  中国北京北京市联通
    段先森 博主
    2024-10-09 07:22:50 回复

    @Evan 可以的呀,可以尝试头像圆角化

     Windows  Chrome
      Evan 评论达人 LV.1
      2024-10-09 10:16:58 回复

      @段先森 不知道怎么设置,这个要改CSS里面的代码吧。

       Macintosh  Chrome  中国北京北京市联通
        段先森 博主
        2024-10-09 10:48:56 回复

        @Evan 是的呢,我的代码里有,应该跟你的主题没有适配,你可以调整一下css代码

         Windows  Chrome
          Evan 评论达人 LV.1
          2024-10-09 10:58:39 回复

          @段先森 是的,我看了设置里面,你这个代码确实已经是圆形了,但是在这个主题里面是不起作用的。我暂时不知道改pix主题的什么位置。抽时间再找找

           Macintosh  Chrome  中国北京北京市联通
          Evan 评论达人 LV.1
          2024-10-13 13:02:20 回复

          @段先森 现在的效果跟你的一样了。哈哈。我用了!important 保证了优先级,然后就解决了。哈哈哈哈

           Macintosh  Chrome  中国北京北京市联通
阿杰 Jack 评论达人 LV.1
2024-10-08 21:23:21 回复

挺有意思的~

 Macintosh  Chrome  中国上海上海市联通
Evan 评论达人 LV.1
2024-10-08 18:35:38 回复

[img]https://www.evan.xin/wp-content/uploads/2024/10/20241008182831.png[/img]

这下可以看到了吧。。晕倒。

 Macintosh  Chrome  中国北京北京市联通
    段先森 博主
    2024-10-08 18:37:38 回复

    @Evan 你第一条评论的就可以看到图片啊。横线是在一个容器里。还有你说的小圈圈都可以用css代码解决

     Windows  Chrome
      Evan 评论达人 LV.1
      2024-10-08 19:38:04 回复

      @段先森 不太懂,代码。。我找找。。 :xiaoku:

       Macintosh  Chrome  中国北京北京市联通
Evan 评论达人 LV.1
2024-10-08 18:34:27 回复

[img]https://imgse.com/i/pAG6RT1[/img]
这个图片上的小横线和小圈圈。。。

 Macintosh  Chrome  中国北京北京市联通
Evan 评论达人 LV.1
2024-10-08 18:33:03 回复

对了,前面的小圈圈。。也是。。我这个怎么跟你的现实不一样啊。

 Macintosh  Chrome  中国北京北京市联通
Evan 评论达人 LV.1
2024-10-08 18:30:32 回复

[img]https://s21.ax1x.com/2024/10/08/pAG6RT1.png[/img]
这个下面的横线,如何去掉???

 Macintosh  Chrome  中国北京北京市联通
Lvtu 评论达人 LV.2
2024-10-08 18:00:35 回复

优秀。。。 :qiang: :qiang: :qiang:

 Macintosh  Safari  中国广东省东莞市移动
obaby 评论达人 LV.1
2024-10-08 16:43:06 回复

这个不错,等找时间抄作业

 Macintosh  Chrome  中国山东省青岛市联通
    段先森 博主
    2024-10-08 16:43:39 回复

    @obaby 嘿嘿,对于你来说易如反掌

     Windows  Chrome
    耳朵的主人 评论达人 LV.1
    2024-10-09 21:18:58 回复

    @obaby 我晚上就开抄,哈哈,好久没有折腾拓展功能了。
    这有完整教学,拿来主义。哈哈

     iPhone  Safari  中国福建省厦门市移动
明明同学 评论达人 LV.1
2024-10-08 16:32:20 回复

博主这个动手能力好强

 Windows  Edge  中国上海上海市联通
满心 评论达人 LV.1
2024-10-08 15:39:42 回复

牛逼,这个不错

 Windows  Chrome  中国湖北省武汉市电信