热爱生活,重新开始

「wordpress」的搜索结果

  • WordPress 展示 GoToSocial 的说说内容(朋友圈风格插件 + Access Token 获取教程)

    写在前面

    最近折腾了一套自己的 Fediverse 微博系统 —— GoToSocial,并搭配自己博客做了一个说说页面,把我日常发布的内容聚合进来,就像一个“朋友圈”一样。

    为了方便管理和扩展,我写了一个 WordPress 插件,通过短代码 [...gotosocial_say_ajax] (去掉...)实现在页面中展示自己的 GoToSocial 说说内容,支持图片、评论、点赞数展示,还实现了“加载更多”的功能。

    今天这篇文章,我就把这个插件和实现方法分享出来,并附上完整使用教程与 Access Token 的获取方法,希望能帮到也想整合去中心化社交内容的博友们。


     插件介绍:GoToSocial 说说展示 for WordPress

    这个插件的主要功能包括:

    • 展示指定 GoToSocial 用户的说说内容
    • 支持图片展示,点击放大,自动横排布局
    • 展示评论内容(头像 + 用户名 + 评论)
    • 显示点赞(❤️)、转发(🔁)、评论(💬)统计
    • 加载更多功能,自动分页
    • 样式优化为“朋友圈”风格
    • 兼容手机端,响应式布局

    插件完全开源,使用无门槛:

    GitHub 地址:
    https://github.com/2443266417/gotosocial-wordpress-plugin

    插件效果演示:
    https://www.duanxiansen.com/gotosocial


     插件安装教程(详细步骤)

    第一步:下载插件

    直接访问 GitHub:
    https://github.com/2443266417/gotosocial-wordpress-plugin

    下载 ZIP 压缩包后解压上传:

    1. 登录 WordPress 后台 → 插件 → 安装插件 → 上传插件 → 选择 ZIP 上传
    2. 或者 FTP 上传到 wp-content/plugins/ 目录

    安装并启用插件。


    第二步:配置插件参数

    插件启用后,在后台「设置」菜单下会多出一项「GoToSocial 设置」。

    需要配置以下参数:

    配置项 示例值 说明
    GoToSocial 用户名 duanxiansen 即你的帐号名
    实例地址 https://duanbo.cc 必须是完整网址
    每页加载数量 10 建议为 10 或更小
    Access Token xxxxxxx 用于私密 API 授权

    注意:Access Token 为必选字段,必须填写。


    如何获取 GoToSocial Access Token?

    如果你使用的是我推荐的 duanbo.cc 实例部署方式或自建并启用了后台面板,那获取 Access Token 非常简单。

     推荐方法:后台面板直接获取

    进入你部署的 GoToSocial 实例后台,使用管理员账号登录后台控制面板。

    进入【Applications / 应用】管理页面。

    新建一个应用。

    点击应用详情,点击Request access token。

    复制其中的 Access Token(访问令牌)。


    在页面中插入短代码

    插件通过短代码实现动态展示。

    • 进入 WordPress → 页面 → 新建页面
    • 输入如下短代码: [...gotosocial_say_ajax] (去掉...
    • 发布页面,访问即可看到你发布的 GoToSocial 动态内容。

    支持“加载更多”、“评论展示”、“点击放大图片”等功能。


    展示效果

    以下是插件展示效果:

    说说展示

    • 显示头像、昵称、时间
    • 自动分页加载

    多图支持

    • 多图自动横排布局
    • 图片点击放大

    评论展示

    • 显示评论者头像、昵称、内容
    • 支持点击跳转查看更多评论

    常见问题 FAQ

    1. 为什么图片不显示?

    • 检查实例地址是否 https:// 开头
    • 检查是否填写 Access Token

    2. 评论为什么不全?

    • 默认最多显示 3 条评论,其余通过“查看更多评论”跳转查看

    3. 多图为什么没有横排?

    • 检查主题是否影响 p 标签自动嵌套问题,可用插件或主题兼容

    4. 插件是否支持 Mastodon?

    • 原生接口兼容 Mastodon,但评论结构等差异较大,仅建议用于 GoToSocial

    总结

    这个插件是我用来展示 GoToSocial 说说内容的轻量方案,基于 AJAX 动态加载,并优化了移动端和展示样式。

    功能虽然简单,但基本满足了“朋友圈”展示的需求,非常适合喜欢折腾博客 + 去中心化社交的朋友。

    如果你也搭建了自己的 GoToSocial 实例,不妨试试这款插件,轻松打造你自己的公开“朋友圈”页面。

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

    准备工作

    确保已安装 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页面,继续完善吧。

  • WordPress创建自定义读者墙功能

    前言

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

  • 整站搬遷wordpress

    今天没出去,早上被我爸叫起来干活。他们砌墙,我给搬砖,看着他们热火朝天的干活,心里不是滋味。要是让我去干这个活,我怕是半天也坚持不下来吧。让我去给别人干活,别人看我干活的样子肯定得赶我走……


    下午折腾博客了一下午,翻看了好多程序的博客,看了半天,免费的博客主题还是以前用的specs大佬的主题。趁着下午全部迁移到wordpress上,到底是大气,不过有点儿不足之处,就是在手机端没有搜索,真实可惜。听林海草原说,在网址后面加上 /search/搜索内容,搜索就出来了。这是个不足之处,其他地方其实还挺满意的,有一股久违的感觉。

  • 谈从typecho迁移到WordPress,支持WordPress最新版

    用了一个多月的typecho,感觉typecho的有些功能实在是不尽人意,而且段先森也不是技术高手,懒得开发(工作一天忙的要死),还是决定转移阵地,来到了WordPress这个大家庭,毕竟WordPress不必太在意技术问题,大量的插件以及美观的主题够你享用了

    言归正传,从网上找了好久,从WordPress迁移到typecho的文章很多,但从typecho迁移到WordPress的文章寥寥无几,为什么要迁移呢,如果是新博客的话,我还迁个毛!!!

    首先会遇到一款typecho的插件ByeTyp,它迁移的原理是:将Typecho中的数据导出为WordPress可识别的WXR文件。

    访问ByeTyp项目主页:https://github.com/panxianhai/TypExport 下载最新版的插件。下载后将插件上传并安装到Typecho上。注意上传的时候要为插件的文件夹命名为ByeTyp,否则插件将无法正常运行。

    启用插件后:控制台→数据导出→导出XML文件

    然后在WordPress后台里按照这个顺序操作:工具->导入->WordPress->运行导入器(未安装的话就先安装)->选择文件->上传并导入->选择导入的文章所属的用户,之后提示是否导入媒体,随便点就行

    最后,打开你的新博客,是不是已经迁过来了呢

  • 近期博客的一些变化

    趁着这个快要放假的间隙,写下这篇文章。明天开始就要进入五一假期,很可能有一段时间不碰电脑了。

    博客方面相较于之前有了很大的变化,也尽量的简化了不必要的页面,目前就只剩下了书影、相册、友链(友圈&留言)、关于这四个页面,还想要搭建一个音乐页面,没头绪,正在思考中。

    关于书影。找了很久,才找到大发的这个插件,随着使用,愈发感到熟悉,才想起几年前使用过这个插件,为此,这段时间我也看了电影,读书也是拾了起来。它的安装至少激励了我读书的兴趣,只要空余时间,我都会在微信读书上面看书,有的书籍需要付费,正考虑买纸质版的。现在开车都把听音乐改成了听微信读书的朗读。话说,微信朗读现在好像听上了瘾,比喜马拉雅那种更令我陶醉。

    关于友链。换主题后,这个页面一直停留在我的后台,前台一直没有放出,等我其他页面整理的差不多时,就该考虑到它了,原先后台有个链接,换主题后不见了,网上一搜是因为WordPress3.5版本以后去掉了,但不是真正的去掉,是把它隐藏了,使用一段代码就把它展现了出来,我根据这个就直接调用在了页面上,就先这样吧,之后还想调用头像。留言版是博客搭建起来就存在的页面,只是它其实也没存在的必要,文章的评论代替了它,但我想,其实还是有必要的,有时候博友想联系你,告诉你一件事儿,不适合在文章底下评论,发邮件也麻烦,那么这个留言板的作用就体现出来了。关于相册,是我在中文博客微信群里听1900说的他想弄个相册页面,展现文章里的照片。我也感兴趣了,这不当时就开整了,使用的画廊插件无缝的全屏的展现了出来,但还是感觉不是我心里面想的那个意思,所以又关掉了插件,只留下了单纯的WordPress自带的相册将其展现,还在思考中。友圈,这段时间朋友圈也是非常流行,我前段时间也写了这篇文章搭建,在上网冲浪时蚁阅的最新版本的更新吸引了我,我先是自己部署了蚁阅,结果他最新版本跟官方自用的差了一大截,好吧,想要体验他的最新功能还得使用官方的,一年30,也不贵,索性就用它了,在体验它的最新功能遇到了点儿问题,蚁阅开发者也是给了我解答。我用反代让它显示在了我自己的域名之下,rss.duanxiansen.com,又把它嵌入在了友链这个页面里,订阅的是我经常看的一些博客以及回访频率较高的博客。友链、友圈以及留言版被我三合一了,我是不是聪明,哈哈哈。

    相比较上个月,我又把主题换了,目前这个主题很赞,我比较喜欢,可能会长期使用下去,至少在我研究透之前是不会跟换的,自定义真是完美。

  • 周报#2:依旧茫然

    本来应该是上周写,但是上周的生活有点儿不太愉快,所以一直在摆烂,就放到今天了。

    生活&思考

    这是我妈最爱吃的其中一种饭了,干懒饭,也叫洋芋盖被子
    第二把就输破产了

    周末回家媳妇第二天就回娘家了,所以家里只有我和老妈两人。在家里平躺了两天,吃了睡,睡醒一直在手机上搓麻将。我现在想着是不是有点儿太颓废了,该给自己找事情干了,一点儿也没目标与规划,就算是到现在我写这段话,依然是茫然。

    阅读

    《明朝那些事儿》我读到了中间部分。有明一朝,不纳贡,不和亲,天子守国门,君王死社稷。是众多网络历史作家最爱描写的一段历史。而当年明月的文笔更引人入胜。我发现听书比看书更有感觉,源于我回家路上在车上把音乐关了,放起了微信读书的朗读,尽管朗读有些僵硬,仍是听得津津有味,后面我想应该使用喜马拉雅听,应该更有代入感。

    博客圈

    摆烂的原因就在这里,折腾了一周,啥也没折腾好,还把数据丢失了,废寝忘食的意义就没了。

    我想给博客圈加个圈子功能,所以发现了youzify这个插件,和buddypress结合起来真的是一绝,在我心目中如果使用插件搭建圈子那就是天花板了,不过很可惜,它跟博客圈不兼容,我心里的想法是登录界面和注册界面用博客圈的,因为它有自己的用户中心。而如果是这样的话用户就登录不了,解决的办法是关闭博客圈的用户中心,但我不想关,所以弃之。

    结果在卸载buddypress时,我所有的页面全部消失了,而我并没有备份,无语。

    后面用上了Asgaros论坛,它是我心目中完美的 WordPress 论坛插件,看上去和Discuz很像,比bbpress更加易用。https://bokequan.cn/forum

    软云

    我也用上了它,源于张老师的一篇博文。对于身处博客加载慢的我来说,随即用上了,在一个月的体验中,感觉不错,4h4g我是第一次用,加载速度很快(其他我也不懂),建议不要安装宝塔面板。https://ruan.cloud/aff/LOAUWDRW(更优惠)

     

  • 跟风利用FreshRSS实现朋友圈

    前言

    最开始我用的是阿锋的朋友圈插件,这是我第一次见把友链整合到RSS订阅把它展现出来,那会儿很好奇,就使用了阿锋的晨风自定义插件。后面看到了hexo-circle-of-friends,网上找了半天没看到WordPress上面实现的方法。后面才看到了若志的这篇文章,索性就搞了起来。

    实现步骤

    首先要搭建FreshRSS,这个教程很多,我使用的是服务器搭建,纯宝塔操作,简单不复杂。

    1、添加站点,注意:需要确认已经安装了 PHP 扩展 fileinfo(我的默认安装了)。接下来在宝塔面板创建新站点,设置好数据库与 PHP 版本。数据库我选择的是mysql,PHP版本是0。然后,删去网站根目录下默认添加创建的所有文件,确保文件夹全部清空。打开站点根目录,把 FreshRSS 源代码上传到网站根目录,域名访问开始安装。

    2、安装完成后进入设置-账户-API 管理,填写api密码提交。

    3、进入设置-认证,勾选允许 API 访问 (用于手机应用),提交。

    4、添加你的友链feed地址,我试了一下,直接输入友链域名大部分的rss地址可以自动获取,少部分不知道rss地址的可以安装浏览器插件查看或者问博主本人。

    5、不知道是不是我安装的有问题,点击添加的友链管理,会弹出502 Bad Gateway nginx。不过双击还是就进去了,可以进行删除修改等操作,凑合着用吧。

    6、在自己站点根目录下创建一个php文件,用于放FreshRSS api调用函数,例如:rss.php。访问https://你的博客域名/rss.php,显示数据已保存到JSON文件中。

    <?php
    /**
     * 获取最新订阅文章并生成JSON文件
     */
    function getAllSubscribedArticlesAndSaveToJson($user, $password)
    {
        $apiUrl = 'https://你部署FreshRSS的域名/p/api/greader.php';
        $loginUrl = $apiUrl . '/accounts/ClientLogin?Email=' . urlencode($user) . '&Passwd=' . urlencode($password);
        $loginResponse = curlRequest($loginUrl);
        if (strpos($loginResponse, 'Auth=') !== false) {
            $authToken = substr($loginResponse, strpos($loginResponse, 'Auth=') + 5);
            $articlesUrl = $apiUrl . '/reader/api/0/stream/contents/reading-list?&n=1000';
            $articlesResponse = curlRequest($articlesUrl, $authToken);
            $articles = json_decode($articlesResponse, true);
            if (isset($articles['items'])) {
                usort($articles['items'], function ($a, $b) {
                    return $b['published'] - $a['published'];
                });
                $subscriptionsUrl = $apiUrl . '/reader/api/0/subscription/list?output=json';
                $subscriptionsResponse = curlRequest($subscriptionsUrl, $authToken);
                $subscriptions = json_decode($subscriptionsResponse, true);
                if (isset($subscriptions['subscriptions'])) {
                    $subscriptionMap = array();
                    foreach ($subscriptions['subscriptions'] as $subscription) {
                        $subscriptionMap[$subscription['id']] = $subscription;
                    }
                    $formattedArticles = array();
                    foreach ($articles['items'] as $article) {
                        $desc_length = mb_strlen(strip_tags(html_entity_decode($article['summary']['content'], ENT_QUOTES, 'UTF-8')), 'UTF-8');
                        if ($desc_length > 20) {
                            $short_desc = mb_substr(strip_tags(html_entity_decode($article['summary']['content'], ENT_QUOTES, 'UTF-8')), 0, 99, 'UTF-8') . '...';
                        } else {
                            $short_desc = strip_tags(html_entity_decode($article['summary']['content'], ENT_QUOTES, 'UTF-8'));
                        }
                        
                        $formattedArticle = array(
                            'site_name' => $article['origin']['title'],
                            'title' => $article['title'],
                            'link' => $article['alternate'][0]['href'],
                            'time' => date('Y-m-d H:i', $article['published']),
                            'description' => $short_desc,
                        );
    
                        $subscriptionId = $article['origin']['streamId'];
                        if (isset($subscriptionMap[$subscriptionId])) {
                            $subscription = $subscriptionMap[$subscriptionId];
                            $iconUrl = $subscription['iconUrl'];
                            $filename = 'https://你部署FreshRSS的域名/p/'.substr($iconUrl, strrpos($iconUrl, '/') + 1);
                            $formattedArticle['icon'] = $filename;
                        }
    
                        $formattedArticles[] = $formattedArticle;
                    }
    
                    saveToJsonFile($formattedArticles);
                    return $formattedArticles;
                } else {
                    echo 'Error retrieving articles.';
                }
            } else {
                echo 'Error retrieving articles.';
            }
        } else {
            echo 'Login failed.';
        }
        return null;
    }
    function curlRequest($url, $authToken = null)
    {
        $ch = curl_init($url);
        if ($authToken) {
            $headers = array(
                'Authorization: GoogleLogin auth=' . $authToken,
            );
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        }
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $response = curl_exec($ch);
        curl_close($ch);
        return $response;
    }
    /**
     * 将数据保存到JSON文件中
     */
    function saveToJsonFile($data)
    {
        $json = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
        file_put_contents('output.json', $json);
        echo '数据已保存到JSON文件中';
    }
    
    // 调用函数并提供用户名和密码
    getAllSubscribedArticlesAndSaveToJson('这里是FreshRSS的用户名', '这里是第3步设置的api密码');

    注意:'https://你部署FreshRSS的域名/p/,没证书是http(最好带上证书,不然图标获取不到),还有后面的/p/. 新建页面,在正文里面输入简码:

    7、我是用的是添加页面使用简码将其显示出来,在子主题的funtions.php里添加以下代码:

    // 在 functions.php 中添加 shortcode 函数
    function display_articles_shortcode() {
        // 获取JSON数据
        $jsonData = file_get_contents('./output.json');
        // 将JSON数据解析为PHP数组
        $articles = json_decode($jsonData, true);
        // 对文章按时间排序(最新的排在前面)
        usort($articles, function ($a, $b) {
            return strtotime($b['time']) - strtotime($a['time']);
        });
        // 设置每页显示的文章数量
        $itemsPerPage = 30;
    
        // 生成文章列表
        ob_start(); // 开始缓存输出
        foreach (array_slice($articles, 0, $itemsPerPage) as $article) {
        ?>
            <div class="article">
                <h3>
                    <img src="<?php echo htmlspecialchars($article['icon']); ?>" alt="Icon" class="icon">
                    <a href="<?php echo htmlspecialchars($article['link']); ?>" target="_blank"><?php echo htmlspecialchars($article['title']); ?></a>
                </h3>
                <p>作者:<?php echo htmlspecialchars($article['site_name']); ?></p>
                <p><?php echo htmlspecialchars($article['description']); ?></p>
                <time><?php echo htmlspecialchars($article['time']); ?></time>
            </div>
        <?php
        }
        return ob_get_clean(); // 返回缓存的输出并清除缓存
    }
    
    // 注册简码
    add_shortcode('display_articles', 'display_articles_shortcode');

    8、可以自定义css样式让其精致的显示,这是我的css代码:

    /* Article container */
    .article {
        border: 1px solid #ccc;
        border-radius: 5px;
        padding: 15px;
        margin-bottom: 20px;
    }
    
    /* Article title */
    .article h3 {
        margin-top: 0;
    }
    
    /* Article icon */
    .icon {
        width: 50px;
        height: 50px;
        margin-right: 10px;
        border-radius: 50%;
    }
    
    /* Article metadata */
    .article p, .article time {
        margin: 5px 0;
    }
    
    /* Article time */
    .article time {
        font-style: italic;
    }
    
    /* Hover effect on article */
    .article:hover {
        box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        transition: box-shadow 0.3s ease;
    }
    /* Article icon */
    .icon {
        width: 1.5em; /* 使用 em 单位可以根据标题字体大小调整图标大小 */
        height: auto; /* 自动调整高度以保持宽高比 */
        margin-right: 10px;
        vertical-align: middle; /* 垂直居中对齐 */
        border-radius: 50%;
    }
    

    9、在宝塔添加一个计划任务,定时访问执行第6步创建的php文件,以更新订阅数据。官网里说的那个自动刷新订阅源的方法,我按照官网设置了每隔30分钟刷新,不知道咋回事儿不管用,每次都要自己刷新后才更新订阅源。

    结语

    自己部署rss订阅源是一件非常有成就感的事儿,过程也是艰辛,尤其是我这种不会代码的,更是辛苦,一步一步地查看错误,幸好有GPT,帮我可以查找问题,解决问题,不至于求人。

  • 博客圈的发展历程

     

    前言

    很早之前,我的心里就产生了这种想法,把喜欢的博客收集起来,供自己随时随地的查看他们,这种想法在脑子里想之又想,最开始是看到了blogwe(博客我们),界面非常清新,舒服,很佩服这位大佬,尽管很长一段时间没有更新了。然后就是十年之约,不错的组织,一种约定,不知多少人能够坚持下来。后来又发现了了小志的优秀个人独立博客导航,里面按年份收集了非常优秀的个人博客,非常简单的页面,汇集了优秀的博客,还有各种工具以及建博方面的知识。后面又出现了各种各样的博客聚合平台,比如很精致的个站商店等等等等,就不一一列举了。还有小胡的中文博客圈微信群,相比较其他各种博客聚合平台,中文博客圈微信群具有很好的交流性,在里面也认识了很多大佬,学到了较多的知识。

    经过

    在2021年7月24日,我的这个想法终于可以实现了,尽管自己是个小白,不懂得自己研究。但还是根据自己很长时间的探索发现了一个优秀的导航网站可以供自己收集博客,那就是OneNav导航主题,基于WordPress。关于这个主题在另一个免费开源的同名导航的争论,我也就不说明,也不管,自己用着就行。在这之前我也尝试着用过zblog的轻导航系列收集过博客,因为小白不懂问问题而被其站长那啥,索性转行进入了WordPress。尽管WordPress有些臃肿,但是它比任何程序适合小白,各式各样的主题与插件极好的满足了我的需求。

    域名

    最开始时博客圈用的是子域名dh.duanxiansen.com博客圈-致力于个人独立博客 | 段先森 (duanxiansen.com),后面经过仔细了解在2021年11月25日换成了bokequan.net郑重声明,博客圈换域名了 | 段先森 (duanxiansen.com),这个域名其实很好的诠释了博客圈这三个字,不过仅仅的坚持了一年多,由于工作生活等种种原因域名过期后没续费导致被某体育sq网站抢注(应该是抢续),由于之前备案过而导致我被警察叔叔问候过。没办法还没想好新域名所以迁移到了博客的子域名bkq.duanxiansen.com上,近期才注册了bkq.net.cn,重新起航了。

    博客圈的功能

    博客排行榜:也就是热度排行榜,根据查看次数也就是点击次数决定,分别为今日、昨日、本月以及点击总榜,每种呈现50个博客。

    RSS聚合:简单的聚合展示了博友们的最新文章,有的博友的博客由于rss抓取不到所以展示不出来。

    博友社区:其实就是简单的问答页面,由于没有嵌入主题,所以显得有点儿不搭,等后面更新吧。

    博客详情页:抓取了博主博文的最新5条文章。

    提交收录:填写博客地址后一键获取其他信息,如果没有只能手动填写了,图标可以不上传,后台就获取了。

    最后,如果方便合适,可以把博客圈加在您博客的底部或者其他位置,哈哈

    页脚添加代码

    <a href="https://bokequan.cn/" title="博客圈" target="_blank" > <img src="https://bokequan.cn/bokequan.cn.png" alt="本站已加入博客圈" style="width:auto;height:16px;"> </a>
  • 速度,我emo了

    晚上好,我是段先森。

    几天的王者在昨天的战斗摧残下,以不服气的结果结束了战斗。海诺到底是哪种英雄,显示的是法师,感觉不太像,我记得大招是那种把人可以拉进幻境,但从昨天的战斗来看,不然。我很怀疑是我的记忆出现了问题,她的招式打残可以瞬间回血,也可以瞬移。到最后结束战斗,她的伤害竟然高达40多,给我整无语了。

    新买的域名shuping.cc今天被我把数据全部清除光了,一时兴起。我不知道用来干啥,几年前在闪电博买的电子书资源主题前段时间用在了它的身上,总感觉有点儿不尽人意。当初的喜欢现在感觉成了负担,人总是会喜新厌旧,无所例外。就像我用的知更鸟主题,我想换掉它,但又舍不得放弃当初买它的价值。

    博客有点儿卡,WordPress(臃肿)+知更鸟(庞大)是这个原因吗,我不太清楚,又把插件卸载的剩下几个必须的了。

    我使用的插件:

    Autoptimize-sub:通过优化 CSS、JS、图像等,使您的网站更快。(由知更鸟优化)

    Wenprise Pinyin Slug:自动转换 WordPress 中的中文文章别名、分类项目别名、图片文件名称为汉语拼音。

    多合一搜索自动推送管理插件:多合一搜索自动推送管理插件(原百度搜索推送管理插件)是一款针对WP开发的功能非常强大的百度、Google、Bing、IndexNow、Yandex、神马和头条搜索引擎链接推送插件。协助站长将网站资源快速推送至百度、Bing、360等各大搜索引擎,有利于提升网站的搜索引擎收录效率;该插件还提供文章百度收录查询功能。(由闪电博开发)

    WP Super Cache:WordPress的快速缓存插件。(由知更鸟优化)

    就这四个插件,不太多吧。

    测了一下速,满屏红。

    晚安。

  • 世界,您好!

    欢迎使用WordPress。这是您的第一篇文章。编辑或删除它,然后开始写作吧!

  • 本博客所用的插件

    本博客所使用的插件罗列在这里(WordPress)

    小工具

    这还是以前我刚从typecho迁移过来林海草原大哥推荐给我的插件,那时候还没用Begin主题,用来快速开启、关闭一些功能。

    WP Super Cache

    WordPress的快速缓存插件,缓存必装插件,虽然不知道用法,但是它在自动清理缓存。

    多合一搜索自动推送管理插件

    是一款针对WP开发的功能非常强大的百度、谷歌、Bing、360、神马和头条搜索引擎链接推送插件。协助站长将网站资源快速推送至百度、Bing、360等各大搜索引擎,有利于提升网站的搜索引擎收录效率;该插件还提供文章百度收录查询功能。这是我当初买的闪电博的一款插件,还是有点儿用的。

    Spider Analyser

    是一款用于跟踪WordPress网站各种搜索引擎蜘蛛爬行日志,并进行详细的蜘蛛爬行数据统计、蜘蛛行为分析、蜘蛛爬取分析及伪蜘蛛拦截等。我是用它来发现死链以便提交百度。

    Autoptimize

    通过优化 CSS、JS、图像等,使您的网站更快。

    Comment Info Detecto

    检测您评论者的国家名称、网络浏览器和操作系统等信息,然后将它们显示在评论部分或喜欢的任何地方。

    Custom Post Type Permalinks

    添加自定义帖子类型的帖子存档和可自定义的永久链接。

    这是我基本用的插件,7款,说多不多,说少也不少,还凑合吧,再多就有点儿臃肿了。