Logo

site iconDuan | 段先森

段博,运营「博客圈」。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Duan | 段先森 RSS 预览

好的吧,折腾晕了

2024-11-16 18:04:38

发个邀请链接:http://bkq.net.cn/invites/jtAvmM8WzQ

我也是第一次玩discourse,这个链接可以邀请100人,完了可以自己邀请博友进来,欢迎各位博友大驾光临,之前的discuz论坛的用户我想尽了办法,官方的转移脚本我也试了好几次没成功。哎,就连一个一个往进导入都是好难啊。也没办法,所以抱歉。

还有这个bokequan.cn,想来的自己申请吧,只要不是太过分就行,注重生活类的博客优先考虑。

就这么多吧,这段时间折腾discourse好几个晚上都没睡觉了。

可恶,这边的暖气出现问题了,冻出毛病了。

24-十月小结

2024-11-06 13:55:26

生活

这个月过得很快,主要是因为有国庆节和中秋节。今年的国庆假期,我去了临夏附近转了转,其他地方没有去。期间,我学会了不少做饭的技能,终于能够和媳妇儿一起在家做饭,而不是总是出去吃,算是个进步吧,哈哈。

此外,我成功戒烟了,之前一直觉得戒烟很难,但没想到在国庆假期的一周里没抽烟,反而不太想抽了。现在抽一根烟竟然感觉有点恶心,应该算是戒烟成功吧。

今年医保政策有所调整,每人可以享受400元的医保待遇,如果家庭人口多,这笔金额也不小。最近我发现了一个新技能——可以用医保卡里的余额为家人缴纳医保。只要把家人添加到支付宝中的“家庭共济”账户,就可以将医保余额划拨给他们。这个操作需要进行人脸识别,但因为我爸在新疆,远程操作就做不到,只好自己花钱缴纳了。

国庆假期最后一天,我和几个兄弟聚了聚。现在大家都在天南地北,能聚到一起实属不易,还是得珍惜眼前的相聚时光。

另外,我们单位里新增了台球桌,原先有麻将桌,下班后大家常常一起玩,算是新旧交替吧,哈哈。

工作

往年这个时节工作通常会比较忙,但今年不知道为何比较清闲。乡村振兴的考核工作已经接近开始,虽然总感觉有点儿无动于衷,但最终还是没能逃脱责任。因为我负责的村子资料准备得不太充分,被批评了。确实是我的失职,虽然后来事情处理完了,也没有太大变化,但这次的失误让我警醒,还是要尽心尽力。

博客

这个月我更新了4篇博客文章,比上个月多了一些。主要是研究了Memos、足迹地图和留言板中的读者墙功能,尤其是Memos,研究得比较深入。@老张对事情的专注和执着,我真是佩服,自己则是尝试了一下就放弃,哈哈。

我给博客加上了“CDN”,其实不能完全算是CDN。灵感来源于@夜未央,访问速度超快,看到他的博客配置后,我也按他的方式安装了插件。但由于服务器的原因,缓存插件安装后遇到了一些问题。所以我选择直接使用腾讯云的EdgeOne,兼容CDN功能,效果真是太好了,速度快得让人满意。

另外,博客圈这个话题其实已经谈了很多次了。自从2021年开始,我就没有停止过维护博客圈。RSS订阅已经成为我博客的一部分,博客圈也是通过RSS订阅进行的。为了避免出现纠纷,我会提前通知博友是否会收录他们的博客。如果他们不想被收录,我会手动取消订阅。

我还建立了Bokequan社区论坛,并采用了邀请制,避免注册机滥用。前期我邀请了一些博友,如果有人希望加入,可以通过邮件联系我,或者直接留言给我,我会邀请他们加入。

如何在 WordPress 首页显示 Memos 最新动态

2024-10-17 15:00:31

准备工作

确保已安装 WordPress 并启用了适合的主题:以我的主题为例,适用于大多数 WordPress 主题。

获取 Memos 的 RSS 订阅地址:比如我的链接为 https://memos.duanxiansen.com/u/1/rss.xml,根据你的 Memos 实际 RSS 链接替换。

编写函数获取 Memos 最新动态

需要编写一个函数,使用 WordPress 的 wp_remote_get() 函数从 RSS 链接获取数据,并解析出最新的一条动态。

首先,打开 WordPress 主题目录中的 functions.php 文件,添加以下代码:

// 获取 Memos 最新一条动态并显示
function display_latest_memo() {
    // 通过 wp_remote_get 获取 RSS 数据
    $response = wp_remote_get('https://memos.duanxiansen.com/u/1/rss.xml'); // 替换为你的 Memos RSS 网址
    if (is_wp_error($response)) {
        return '无法获取 Memos 数据';
    }

    // 获取响应的主体内容
    $body = wp_remote_retrieve_body($response);

    // 将 RSS 数据解析为 XML
    $data = simplexml_load_string($body);

    // 检查返回的数据是否为空
    if (empty($data) || !isset($data->channel->item[0])) {
        return '没有找到最新的 Memos 动态';
    }

    // 获取最新一条动态
    $latest_memo = $data->channel->item[0];

    // 将 RSS 中的时间转换为 WordPress 时区时间
    $rss_date = (string)$latest_memo->pubDate; // 获取 RSS 中的发布时间

    // 创建 DateTime 对象并设置为 RSS 的时间
    $date = new DateTime($rss_date);

    // 将时间转换为 WordPress 时区
    $date->setTimezone(new DateTimeZone(get_option('timezone_string')));

    // 格式化时间为 Y-m-d H:i:s 格式
    $formatted_date = $date->format('Y-m-d H:i:s');

    // 获取描述内容(通常是动态的主要内容)
    $content = (string)$latest_memo->description;

    // 限制字数(例如,显示最多300个字符)
    $excerpt = mb_substr($content, 0, 300);
    if (mb_strlen($content) > 300) {
        $excerpt .= '... <a href="' . esc_url($latest_memo->link) . '" target="_blank">阅读更多</a>'; // 链接到原文
    } else {
        $excerpt .= ' <a href="' . esc_url($latest_memo->link) . '" target="_blank">查看原文</a>'; // 如果字数较短,显示“查看原文”
    }

    // 输出最新动态的内容、时间和链接
    $output = '<div class="latest-memo memos-center">';
    $output .= '<h3>最新动态:</h3>';
    $output .= '<p>' . $excerpt . '</p>';
    $output .= '<p>时间:' . esc_html($formatted_date) . '</p>';
    $output .= '</div>';

    return $output;
}

// 创建一个短代码来显示 Memos 最新动态
add_shortcode('latest_memo', 'display_latest_memo');

在首页显示最新动态

接下来,要让 Memos 最新动态只显示在首页文章的最上方。为此,需要修改 header.php 或者 index.php 文件,在首页判断条件下调用定义的短代码。

  1. 打开主题目录下的 header.php 文件,找到适当位置(如头部模板部分)插入以下代码:
    <!-- 在首页显示最新的 Memos 动态 -->
    <?php if ( is_home() || is_front_page() ) : ?>
        <div class="memos-latest">
            <?php echo do_shortcode('[raw][latest断开_memo][/raw]'); ?>
        </div>
    <?php endif; ?>
    
  2. is_home()is_front_page():这两个函数确保只有在首页显示动态,而其他页面不会显示。is_home() 用于判断博客文章列表页,is_front_page() 用于判断自定义的前端首页。

样式调整(居中显示)

将以下 CSS 代码添加到你的主题 style.css 文件中:

.memos-latest {
    text-align: center; /* 水平居中内容 */
    margin: 20px auto; /* 上下外边距并居中容器 */
    padding: 10px;
    background-color: #f5f5f5; /* 背景颜色 */
    max-width: 600px; /* 设置容器最大宽度 */
    border-radius: 10px; /* 圆角效果 */
}

.memos-latest h3 {
    font-size: 1.5em;
}

.memos-latest p {
    font-size: 1.2em;
}

.memos-latest a {
    text-decoration: none;
    color: #0073aa; /* 链接颜色 */
}

结尾

就这样吧,不完美的就是不能直接评论,需要点进去到memos页面,继续完善吧。

独立博客的自省与思考

2024-10-12 22:26:23

最近看到雅余兄的《独立博客自省问卷15题》,不少博友都写了自己的回答,我也借此机会反思一下我的博客历程。

1. 博客更新频率是多少? 更新频率不太稳定,懒癌发作的时候会好几个月不更新。但最近几周更新频繁,有时候甚至一天几篇。

2. 博客上次更新是什么时候?上周。自从八月份以来,还是保持了比较高的更新频率。

3. 博客文章是原创的吗? 大多数文章是原创,但有时也会借助共创的代码或教程来帮助完成一些技术性的内容。毕竟它不给我代码,我也没办法写下去。

4. 文章对他人有帮助吗? 多少会有些意义吧。尽管有些文章是自我记录,但相信对某些读者来说,可能也有启发。

5. 上次更换博客主题是什么时候? 这个问题对我来说很容易回答——前两天刚换!换主题对我来说就像日常活动一样,最高记录是一周内换了十个。

6. 上一次捣腾博客代码是什么时候? 昨天刚折腾到半夜,时常在代码上摸索,有时表达不清还会和GPT沟通不顺畅(笑)。

7. 会进行二次开发吗? 会的,虽然主题设置是为了方便,但我还是忍不住加些个人风格,比如更换字体。我每次换主题都必须用霞鹭文楷。

8. 多久会打开博客自我陶醉一次? 几乎每天都要看几次,尤其是查看流量,虽然大多数PV可能都是我自己刷的。

9. 近期对博客域名的感受? 域名目前没什么想法,虽然博客的主题和程序经常变动,但域名倒是一直稳定。

10. 每天看网站流量统计吗? 是的,每天看几次,尤其是睡前看看访客来源。使用的是百度统计,非常方便。

11. 通过博客赚到钱了吗? 没有,我拒绝广告。广告真的会影响阅读体验,所以我宁愿保持纯净的界面。

12. 浏览别人的博客主要为什么? 主要是为了学习他们的设计和排版,看到别人的博客总觉得比自己做得好,这也是我频繁更换主题的原因之一。

13. 看到别人分享的文章,第一反应是什么? 首先会注意网站的加载速度,尤其是图片延迟加载的效果,真的是一种丝滑的体验。

14. 觉得博客哪方面更重要? 内容和主题都很重要,二者不可或缺,毕竟鱼与熊掌我都想兼得。

15. 通过写博客有哪些新收获? 确实学到了不少新知识,认知也提升了。很多之前不理解的地方现在懂了,甚至在技术上有了更多的自信。

WordPress创建自定义读者墙功能

2024-10-08 15:01:25

前言

在逛不亦乐乎博客时,我被其留言页面上读者墙的样式深深吸引。此外,在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

结尾

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

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