普通视图

再建“一个人的论坛”,体验折腾的快乐

作者 老张
2024年12月16日 21:28

再建“一个人的论坛”,体验折腾的快乐 - 第1张图片

2000年工作以后就接触网络,沉迷于中。2003开始搭建网站,最初以dedecms建的娱乐网。其中内容涉及笑话、美图、在线小游戏等,当然都是采集的。当QQ农场大火之后,想着如何来建QQ农场,记不得是一年了,发现DZ论坛里有QQ农场这款插件,便着手搭建论坛。那个时候QQ农场还需要收费,而我的论坛各种游戏全免费,吸引了很大一批用户。当时论坛在QQ农场、牧场以及无心宠物游戏积分与论坛积分互通的基础上,带动了论坛的发展,经过数年的发展,注册量达数万,日IP过千。另外一个论坛是和一位网友合开的“雷友论坛”,这位网友会编程,开发出了当时可以自动刷迅雷积分的一个软件。通过这款软件,论坛聚集了大量的注册用户,鼎盛时期的流量也是非常的可观。上面说的两个论坛后来因为QQ农场的普及、迅雷的没落等而慢慢失去人气。后来在“QQ时空”论坛做超版、也在本地的地方论坛做过管理。可以说,建论坛、管论坛的经历至少也有五六年的时间。 论坛创建容易,但是想要把论坛经营好真的是需要方法。论坛必须要有一个实质性的东西能吸引住大家。论坛建好之后,其实只是做好了一个框架,坛主得要给论坛以灵魂,用户再给论坛注以血肉,这样论坛才会像一个活生生的人呈现在你面前。一个论坛的发展,你必须要有一个“亮点”、要有一个发展的方向,用亮点来吸引人,在你的方向上去发展。也就是说,用亮点来引流。比如我前面说的两个论坛,就是靠免费的QQ农场和迅雷积分这两个亮点来吸引流量。

每个人都是有“虚荣心”和“荣誉感”,应该以这个为契机来让用户参与进行、互动起来。泡论坛和“砍传奇”是一样的,砍传奇是通过砍小怪升级、打BOSS爆好装备,而泡论坛就想过通过发帖来提高等级、通过发优质帖等来获取勋章等。这就是为什么有很多大型的论坛UID、勋章、特殊会员组等能卖到好几百甚至几千块。

对于建论坛这块,我明明知道自己拿不出来什么东西来吸引人,但还是去折腾了,只是想体验下折腾的快乐罢了。前两年经常泡“非主流论坛”,知道非主流论坛是用“修罗”程序后,就着手自己折腾了一个。花了很大的精力在上面,折腾了有两三个月,当然也花了不少钱买了主题和一些插件。对于“修罗”论坛,作者在好多年前就不更新了,导致PHP版本还停留在7.3,另外就是一些好用的插件基本上都收费,找插件花了大量的时间,折腾折腾也就没有热度了。

这段时间经常泡nodeloc论坛,又开始折腾Flarum了。花了一个星期这样的时间,我的“一个人的论坛”功能就初步建成了,https://bbs.laozhang.org。用修罗折腾两三个月,而用Flarum只折腾了一个多星期,这应该利益于Flarum知名度要大、各类插件丰富;另外就是有一群小伙伴,比如https://sx.sd/的热心帮忙与指导;当然,最后还是利益于AI,遇到很多问题,通过AI就能够在较短的时间内完美的解决。

一个人的论坛建好了,Flarum后台也熟悉了,各种插件的功能也了解了,那么接下来就是吃灰了!明知建了论坛没有人气,但是还是折腾了,就是想检验下Flarum、检验下折腾的快乐罢了!

Syncthing多端同步神器win版SyncTrayzor安装及升级内核方法

作者 老张
2024年12月8日 07:47

Syncthing多端同步神器win版SyncTrayzor安装及升级内核方法 - 第1张图片

我在使用Obsidian笔记软件折腾文件同步的时候遇到了多端同步神器Syncthing,在《Obsidian多端同步终极大法Syncthing、备份终极大法Kopia》只是简单的提及一下,至于安装、使用方法并没有过多的去阐述,毕竟官方文档介绍的非常的清楚。我使用Syncthing网络环境是这样的,在办公室的服务器上安装了Docker版的Syncthing,而在家里台式机、办公室台式机、笔记本上则是安装了有GUI界面的SyncTrayzor,在win环境下有系统托盘图标,使用非常的方便。

SyncTrayzor官方文档也有推荐,详细请看官文档https://docs.syncthing.net/users/contrib.html,呵呵,其实也就是一句话介绍。SyncTrayzor的项目地址在https://github.com/canton7/SyncTrayzor,细心的朋友应该会发现,SyncTrayzor最新1.1.29版还是2021年8月份发布的,由于长时间项目没有更新,导致Syncthing从1.28.0升级到1.28.1时不能自动更新。这里老张告诉大家如何在Syncthing更新上避坑,毕竟因为这个升级,周六折腾了半天的时间。

SyncTrayzor版本选择

SyncTrayzor版本我们选择绿色解压版,即SyncTrayzorPortable-x64.zip或是SyncTrayzorPortable-x86.zip,这两个版本亲测在win11上均可完美运行,不要下载安装版,安装版手动更新Syncthing无效。

Syncthing多端同步神器win版SyncTrayzor安装及升级内核方法 - 第2张图片

更新Syncthing

到syncthing的项目地址https://github.com/syncthing/syncthing中下载最新版1.28.1,我们选择syncthing-windows-386-v1.28.1.zip这个版本,解压后将所有文件复制到SyncTrayzor目录的data文件夹下即可。OK,完成升级!SyncTrayzor的安装版没有data目录,即使把升级文件复制到根目录也不成功。

其他推荐syncthingtray

昨天折腾的时候又发现一款Syncthing的win版项目syncthingtray,这个项目更新的更是比较频繁,也安装试用了,但是GUI真的不是太喜欢!有兴趣的可以试试!

使用避坑

在同步文件设置的时候,文件夹ID不要设置为sync。昨天在折腾的时候我无意将文件夹ID设置成了sync,结果发现“全局状态”的文件及文件夹数量是实际数量的两倍,同步进度条只能到50%。(实际是同步完了)

利用雷池WAF,把博客“搬回家”!

作者 老张
2024年11月9日 10:55

利用雷池WAF,把博客“搬回家”! - 第1张图片 这几天在折腾雷池WAF,其实还是很好折腾的。我在《把服务器“藏”起来,让网站快起来!》可能说的不是太直接了当,后来又重新上了一张图,这样看起来更加一目了然。当然,还得要说下硬件环境,就是从海鲜上花了三四十块钱买了阿里云香港轻量24元每月的那款VPS安装雷池作为前端,而后端同样需要采用香港的VPS,这样速度才可以真正快起来。 利用雷池WAF,把博客“搬回家”! - 第2张图片今天就来折腾折腾怎么利用雷池WAF,把博客放在家里的服务器上。

首先介绍下我的硬件环境,家里一台J4125配置了16G内存、1T固态硬盘、4T机械硬盘,这台做成了all in one。ESXI虚拟机做底层,虚拟了爱快做为主路由拨号、Op旁路由、黑群晖,前几天又才折腾了一个debian安装了宝塔准备放网站。网络环境同家里500M电信,上行是40M、公网IP。而外部网络环境就是从海鲜上花了三四十块钱收的阿里云香港轻量24块钱每月的那一款。首先来上个图吧!

利用雷池WAF,把博客“搬回家”! - 第3张图片 博友们访问博客首先向安装了雷池WAF阿里云香港轻量发送请求,由雷池反代后再直接访问了家里的虚拟机上的博客。是的,路线是绕到香港去了,但是这条路线是优质线路,速度方面并没有感觉到慢。下面来说说设置方法吧!

设置动态域名解析、端口映射

家里有公网IP,但是是动态的,每次重启光猫后IP就会变化。我这里是从爱快上设置了动态域名解析,网上教程很多,不再赘述。把相关服务的端口必须要映射出去,这个也是在爱快的操作。

设置域名解析

网站的域名解析IP设置为安装雷池WAF的那台香港轻量。

雷池WAF设置

首先申请证书,傻瓜化,会点鼠标就行;然后就是添加站点。

利用雷池WAF,把博客“搬回家”! - 第4张图片

域名填写你网站的域名;证书选择你刚才申请的证书;上游服务器填写你动态域名解析的那个域名+网站映射出来的端口,如:http://xxx.laozhang.org:5425/

完成以上操作后,你就可以不需要加端口号直接使用域名访问家里虚拟机上的网站了!怎么样,即没有端口号、速度也不慢、还有雷池WAF安全保护,不是美滋滋!

 

 

把服务器“藏”起来,让网站快起来!

作者 老张
2024年11月4日 21:05

把服务器“藏”起来,让网站快起来! - 第1张图片

网站给用户最好的体检就是速度要快,想要网站速度要快,可以把域名备案选国内的服务服务器。但是大家都知道域名备案后把网站放在国内后续会有很多问题。所以很大一部分人就干脆放弃了速度而选择把服务器放在海外。把服务器放在海外,也可以选择对大陆优化的线路,但是这样的线路成本是非常的高。

阿里云香港轻量,那个速度真的是杠杠的,谁用谁知道。但是,24元每月的那款配置只有2C1G的,说真的1G内存真的有点太小了。34块钱每月的配置是2C2G,这款拿来做站还不错,一年408块钱虽然可以接受但是感觉还是有点高。最为重要的一点就是听不少人说阿里云香港轻量虽然线路非常的好,硬件性能却非常的拉,安装个Docker都会把CPU给干爆了。阿里云发放的学生300元优惠卷,用这个卷可以买到一年的2C1G的那一款香港轻量,海鲜上这个卷最初卖30块钱,后来9月中旬新卷被阿里指定商品后老卷涨到了70元,也就是说70块钱可以搞到阿里云香港轻量2C1G款一年时间。

那怎么样花最少的钱让网站的速度飞起来呢,这里老张来谈一谈怎么样花最少的钱让网站的速度最大化。请出今天的主角,雷池WAF。

雷池WAF:网站防护软件,它本质是一个反向代理,架设在网站前面,可以灵活设定各种规则,对所有请求进行过滤,不让黑客"越雷池半步"。它底层基于 Nginx,自带图形操作界面,简单好用。它的核心是智能语义分析算法,用来判断可疑请求,相当于一层自定义的软件防火墙,它在 GitHub 已经收获了12.5K star,目前是全球排名第一的开源 WAF 项目。它可以自己架设,很适合个人和小企业使用。如果你需要防护暴露在公网的 Web 服务器,不妨用它试试看。

目前我准备的方案是阿里云香港轻量作为前端,安装雷池WAF;后端采用HH家的香港性能机(去年黑五推出的一款2刀一个月可以搞到2C6G的香港VPS。),安装宝塔做网站。通过雷池WAF,把阿里香港轻量和HH香港性能机组合起来,既有了HH机器的性能又有了阿里香港轻量的速度,同时还多了一层安全保护。至于花费嘛,和34元每月的阿里香港轻量差不多,但是性能得到了提长、防护上有了保障。

把服务器“藏”起来,让网站快起来! - 第2张图片

雷池的安装、设置非常的简单,不做赘述。这里给大家避一个坑,我在把甲骨文新加坡VPS的两个小破站做雷池WAF反代的时候,出现了一个问题,只要通过雷池反代,wordpress的CSS文件就加载不出来,。AI给出的解释如下:

在使用雷池进行前端代理和后端反向代理时,老张遇到了WordPress样式丢失和后台无法访问的问题。初步分析认为是SSL跳转的问题,但检查后发现实际上宝塔配置没有问题。更深入的分析显示,网站在反向代理期间,由于回源使用HTTP协议,导致WordPress误认为站点也是HTTP,从而加载了错误的资源(CSS、JS等),最终导致样式丢失和重定向过多的错误。

为了解决这一问题,建议采取以下步骤:

  1. 确保前端使用HTTPS,回源采用HTTP:这样可以利用Cloudflare(CF)的证书,免去直接在源服务器上处理SSL证书的烦恼,简化维护和更新。
  2. 更新WordPress配置:在wp-settings.php文件中添加$_SERVER['HTTPS'] = 'on';一行代码,以强制WordPress将网站协议识别为HTTPS,这样可以防止出现HTTP资源加载的问题。

通过以上方法,最终达到了正确加载资源并解决了访问问题,确保了WordPress的正常运行。

具体原因可以看NL论坛坛主的文章分析《WordPress 反代后,css丢失或者后台进不去的问题的解决》,解决的方法是编辑 wp-settings.php ,在 <? php 下增加一行

$_SERVER['HTTPS'] = 'on';

把服务器“藏”起来,让网站快起来! - 第3张图片

 

 

 

WordPress首页调用typecho方法!

作者 老张
2024年10月28日 14:10

Wordpress首页调用typecho方法! - 第1张图片

前段时间花了那么多的时间折腾了《WordPress首页调用memos方法!》后,怎么又来折腾Wordpress首页调用typecho呢!原因有这样的两点,首先memos的作者对memos的更新真的是太随意了,每次版本的升级,你会想不到他会把什么功能给删掉、或是更想不到把数据库的结构给改了、还有就是随意改变API的接口。也正因为他的随意,一部分人还保持在低版本来使用,另外一部分人就是直接弃用了,所以我想着说不定哪一天也会弃用memos。另外的一个原因就是除了老张博客之外,我还有一个老张随笔,一直保持每日一更新,字数都是在二百字,就像朋友圈一样,最初是用typecho程序,后来改用memos,目前那个typecho上面还放着一千两百多篇随笔。我想与其这样牵强的用着memos,不如退回来用typecho算了。

有了上面的想法后,就想着把我的wordpress和typecho来个“整合”,在wordpress调用typecho的首篇文章。有了上一次的折腾,这次算是轻车熟路了,前前后后的折腾有两个小时。通过这次的折腾,让我对AI又有了新的认识,上次我认为是“豆包最聪明”,结果经过这次的“折腾”发现把相同的问题多次的提问同一个AI,每次他给出的答案也是不一样的。单单就响应速度来说,官方的GPT最为快,所以这次代码就是借助官方GPT来完成的。话不多说,直接上代码吧!

忘了一个重要的事: typecho本身没有提供API接口服务,这里我找到一款插件,Restful,安装后直接启用就行,因为我是直接调用文章的,其他的API接口就被我给关了!

1.把下面的代码插入到主题文件的index.php合适位置。

<?php
$data = fetch_typecho_data();
if ($data):
?>
<div class="latest-update" style="background-color: #f8f8f8;">
<div class="latest-update-header">
<h2>最新动态</h2>
<span class="latest-update-time"><?php echo esc_html($data['time_content']); ?></span>
</div>
<div class="latest-update-divider"></div>
<div class="latest-update-content"><?php echo esc_html($data['content']); ?></div>
<div class="latest-update-images">
<?php foreach ($data['image_content'] as $img_url): ?>
<a href="<?php echo esc_url($img_url); ?>" data-lightbox="latest-update-gallery">
<img src="<?php echo esc_url($img_url); ?>" alt="Image">
</a>
<?php endforeach; ?>
</div>
<div class="latest-update-footer">
<span class="latest-update-tag"><?php echo esc_html($data['tag_content']); ?></span>
<a class="latest-update-link" href="<?php echo esc_url($data['link_content']); ?>" target="_blank">查看全文</a>
</div>
</div>
<?php endif; ?>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.11.4/js/lightbox-plus-jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.11.4/css/lightbox.min.css">

2.把CSS样式代码放置到主题CSS定义设置里,当然也可以直接放到style.css中。


/* 首页调用typecho样式 */
.latest-update {
    width: calc(100% - 40px); /* 设置宽度为100%减去40px,确保有左右边距 */
    background-color: #f8f8f8 ; /* 强制设置背景颜色为浅灰色 */
    border: 1px solid #ddd; /* 添加1像素的灰色边框 */
    border-radius: 10px; /* 圆角边框,半径为10px */
    padding: 20px 20px 10px 20px; /* 内边距,上下10px,左右20px */
    margin: 20px 0; /* 外边距,上下20px,左右0 */
    text-align: left; /* 文本左对齐 */
    margin-top: -10px; /* 减少与顶部的距离为0 */
    margin-bottom: 30px; /* 增加与文章列表的距离为40px */
    margin-right: 20px; /* 设置右边距为20px */
}

.latest-update-header {
    display: flex; /* 使用弹性盒模型布局 */
    justify-content: space-between; /* 头部元素左右分散排列 */
    align-items: center; /* 垂直居中对齐 */
    margin-bottom: 10px; /* 头部与下方内容的外边距为10px */
}

.latest-update h2 {
    font-size: 15px; /* 标题字体大小为15px */
    margin: 0; /* 去除默认外边距 */
    padding-left: 0px; /* 左边填充为0 */
}

.latest-update-time {
    font-size: 14px; /* 时间字体大小为14px */
    color: #666; /* 时间文本颜色为中灰色 */
    margin-right: 0px; /* 右边距为0 */
}

.latest-update-divider {
    border-bottom: 1px solid #333; /* 添加底部边框,颜色为深灰色 */
    margin: 10px 0; /* 上下外边距为10px */
}

.latest-update-content {
    text-align: left; /* 内容文本左对齐 */
    line-height: 1.5; /* 行高设置为1.5倍 */
    margin: 10px 0; /* 上下外边距为10px */
}

.latest-update-images {
    text-align: left; /* 图片区域文本左对齐 */
    margin: 10px 0; /* 上下外边距为10px */
}

.latest-update-images img {
    width: 100px; /* 图片宽度为80px */
    height: 75px; /* 图片高度为80px */
    object-fit: cover; /* 图片覆盖方式,保持比例并裁剪 */
    border-radius: 8px; /* 图片圆角,半径为8px */
    box-shadow: 0 4px 10px rgba(0, 0, 0, 1); /* 添加阴影效果 */
    margin: 3px; /* 图片外边距为5px */
    transition: transform 0.3s, opacity 0.3s; /* 添加平滑过渡效果 */
}

.latest-update-images img:hover {
    transform: scale(1.1); /* 鼠标悬停时放大10% */
    opacity: 0.9; /* 鼠标悬停时透明度降低到0.9 */
}

.latest-update-footer {
    display: flex; /* 使用弹性盒模型布局 */
    justify-content: space-between; /* 底部元素左右分散排列 */
    align-items: center; /* 垂直居中对齐 */
    margin-top: 10px; /* 底部与上方内容的外边距为10px */
    padding-top: 10px; /* 上内边距为10px */
    border-top: 1px solid #ddd; /* 添加顶部边框,颜色为浅灰色 */
}

.latest-update-tag {
    background-color: #e0e0e0; /* 标签背景颜色为淡灰色 */
    border-radius: 5px; /* 标签圆角,半径为5px */
    padding: 5px 10px; /* 内边距,上下5px,左右10px */
    font-size: 14px; /* 标签字体大小为14px */
}

.latest-update-link {
    text-decoration: none; /* 去除链接的下划线 */
    color: #0073aa; /* 设置链接颜色为蓝色 */
    font-size: 14px; /* 链接字体大小为14px */
}
/* 首面调用typecho结束 */

3.把下面代码插入到主题functions.php文件中。


//-------首页调用typehco代码-----开始
function fetch_typecho_data() {
    $api_url = "https://suibi.zhangbo.net/api/posts?pageSize=1";
    $response = wp_remote_get($api_url);
    if (is_wp_error($response)) {
        return;
    }
    $body = wp_remote_retrieve_body($response);
    $data = json_decode($body, true);

    if ($data['status'] !== 'success' || empty($data['data']['dataSet'])) {
        return;
    }

    $post = $data['data']['dataSet'][0];
    
    // 1. 链接内容
    $link_content = "https://suibi.zhangbo.net/archives/" . $post['cid'] . ".html";
    
    // 2. 标签内容
    $tag_content = "#" . $post['categories'][0]['name'];
    
    // 3. 时间内容
    $created_time = (int)$post['created'];
    $current_time = time();
    $time_diff = $current_time - $created_time;
    
    if ($time_diff < 3600) {
        $time_content = floor($time_diff / 60) . "分钟前";
    } elseif ($time_diff < 86400) {
        $time_content = floor($time_diff / 3600) . "小时前";
    } elseif ($time_diff < 2592000) {
        $time_content = floor($time_diff / 86400) . "天前";
    } else {
        $time_content = date("Y年m月d日", $created_time);
    }
    
    // 4. 摘要内容
    $digest = strip_tags($post['digest'], "");
    $content = mb_strlen($digest, 'UTF-8') <= 200 ? $digest : mb_substr($digest, 0, 200, 'UTF-8') . "......";
    
    // 5. 图片内容
    preg_match_all('/<img.*?src=["\'](.*?)["\'].*?>/i', $post['digest'], $matches);
    $image_content = $matches[1];

    return [
        'link_content' => $link_content,
        'tag_content' => $tag_content,
        'time_content' => $time_content,
        'content' => $content,
        'image_content' => $image_content
    ];
}

 

 

 

 

WordPress首页调用memos方法!

作者 老张
2024年10月22日 14:03

WordPress首页调用memos方法! - 第1张图片

老张一直想把wordpress和memos能整合在一起,前几天在段先生的博客上看到了教程,便死皮赖脸的问他方法,原来是AI搞定的。刚开始的时候是直接拿段先生的用,但是里面有一些达不到自己想要的效果。比如段先生是从memos的RSS文件里取数但,如果memo里有多篇图片的话,RSS只能输出一张链接地址,其他找不到。通过找木木大佬,用了他提供的《Memos API 非官方不完全说明》便可以解决。另外在CSS布局上也不是自己想要的效果,便想着自己也来让AI搞吧!

让AI帮你写代码,你必须要学会怎么样能更好的和AI对话,必须要有一点点的代码基础,才能把把问题问在点子上。我在把memos的API输出的数据模式先告诉AI,然后再提出自己的要求,要求如下:

我想在wordpress获取memos的api发布第一条动态内容,API的链接地址是https://zhangbo.net/api/v1/memo?creatorId=1&rowStatus=NORMAL&limit=1 ,内容格式如下:
按以下要求进行操作:
1.读取第一个"id"后面的数据,并形成“https://zhangbo.net/m/+“id后面的数据”” 做为链接,赋值给变量$link_content
2.读取"content"后面的数据,读取以#号开始、空格结束的内容,并在前面加#号后赋值给变量$tag_content。
3.读取"createdTs"后面的数值,转化为时间后与当前时间计算时间间隔。时间间隔为1小时内的,以时间间隔+“分钟前”赋值给$time_content;时间间隔为24小时内的,以时间间隔+“小时前”赋值给$time_content;时间间隔为30天内的,以时间间隔+“天之前”赋值给$time_content;时间间隔超过30天的,直接以“年月日”形式赋值给$time_content。
4.读取"content"后面的数据,排除“![]()”图片形式、排除#、#及空格前的内容后,赋值给$content。
5.读取"content"后面的数据,如果有“![]()”图片形式,将()内的图片链接赋值给$image_content;如果"externalLink": 后面有数据,赋值给$image_content;如果"filename"后面有数据,将以“https://zhangbo.net/o/r/+filename上第四行ID后的数值+"filename"的数据”赋值给$image_content。如果以上情况都存在,那将以数值组形式赋值。
以上生成的代码,将保存在wordpress的主题文件functions.php中以便调用。
按以下要求生成CSS代码
1.对于在首页展示的要求,在首页文章列表上方,与首页文章空两行
2.显示框宽度100%、背景灰色、四角椭圆。
3.第一个DIV展示框以"h2”格式展示“最新动态”四个字、靠左对齐、左边距空20px;务必同一行展示$time_content值,右居中对齐,右边距空20PX
4.第二DIV插入细实线、深灰色
5.第三DIV展示$content值
5.第四DIV展示$image_content值的缩略图,缩略图四角椭圆并有阴影,如果多图从左往右排列。并按确保引入 Lightbox.js,也写入到本代码中,达到点击放大效果
6.第五DIV靠左对齐展示$tag_content值,背景灰色并四角椭圆,靠右展示“点击评价”点击链接到$link_content。
再生成输出代码以便插入在首页文件index.php,以便在首页显示。/

我分别测试了官方GPT、三方GPT和豆包,结果是官方GPT直接来句“问题太复杂,请分类进行提问”,三方GPT给出的代码效果完全不对,而豆包给出的代码基本上达到要求。当然,还是由于自己的表述,导致代码在图片显示这块有些问题。今天中午利用几分钟时间,进行了修改,对获取图片链接地址重新让AI写,我是这样提问的:

我现在的要求是其他代码不需修改,只对获取图片链接重新按以下要求来修改
1.读取"content"后面的数据,如果有“![]()”图片形式,将()内的图片链接赋值给$image_content;
2.获取  "resourceList": []的中括号里数据,这是图片组,每组以{}进行区分,查询每个{}内的"externalLink",如果"externalLink": 后面有数据,赋值给$image_content;如果"externalLink"无数据,则以“https://zhangbo.net/o/r/+该图片id+"filename"的数据”赋值给$image_content。
如果以上情况都存在,那将以数值组形式赋值。

经过这样的修改,图片才得要正确显示。后来又陆陆续续的修改了CSS样式,最终达到目前的效果。

现在把相关代码贴给大家吧,需要的自取,不合自己要求的,也可以让AI帮你来修改。

1.把下面的代码插入到主题文件的index.php合适位置。

 <?php
$memoOutput = processMemoData();
if ($memoOutput) {
echo $memoOutput;
}
?>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.11.4/js/lightbox-plus-jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.11.4/css/lightbox.min.css">/* Your code... */

2.把CSS样式代码放置到主题CSS定义设置里,当然也可以直接放到style.css中。


/* 首页调用memos效果---开始 */
/* 缩小与顶部距离,增加与首页文章列表距离 */
.memo-display {
    margin-top: 0px; /* 减少与顶部的距离 */
    margin-bottom: 40px; /* 增加与文章列表的距离 */
    margin-right: 40px; /* 设置右边距为20px */
    width: calc(100% - 40px); /* 计算宽度以适应右边距 */
    background-color: #f2f2f2;
    border-radius: 10px;
    padding: 20px;
    border: 1px solid #ccc; /* 添加细线边框,颜色为浅灰色 */
}


/* 第一个 DIV:展示“最新动态”和时间 */
.memo-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
}
.memo-header h2 {
    margin-left: 0px;
}

.memo-header span {
    margin-right: 0px;
}

/* 第二 DIV:插入细实线、深灰色 */
.memo-divider {
    border-top: 1px solid #999;
    margin: 10px 0;
}

/* 第三 DIV:展示内容 */
.memo-content {
    margin-bottom: 10px;
    line-height: 1.5; /* 或者可以使用具体的像素值,如 1.5em 或 24px */
}
/* 第四 DIV:展示缩略图 */
.memo-images {
    display: flex;
    flex-wrap: wrap;
}

.memo-images img {
    border-radius: 10px;
    box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
    margin-right: 10px;
    cursor: pointer;
    transition: transform 0.3s ease; /* 添加过渡效果 */
}

.memo-images img:hover {
    transform: scale(1.1); /* 鼠标悬浮时放大 */
}

/* 第五 DIV:展示标签和链接 */
.memo-footer {
    display: flex;
    align-items: center;
    margin-top: 10px; /* 设置与上面容器的距离为 30px */
}

.memo-footer div:first-child {
    background-color: #9999;
    border-radius: 6px;
    padding: 5px 10px;
    margin-right: 10px;
}

.memo-footer a {
    text-decoration: none;
    margin-left: auto; /* 靠右对齐 */
    margin-right: 0px; /* 右边距 20px */
}
/* 首页调用memos效果---结束 */

3.把下面代码插入到主题functions.php文件中。

/* Your code... */
//-------首页调用memoe代码-----开始
function getTimeContent($createdTs) {
    $current_time = time();
    $time_diff = $current_time - $createdTs;
    static $cachedTimeContent = null;
    static $lastCreatedTs = null;
    if ($lastCreatedTs === $createdTs) {
        return $cachedTimeContent;
    }
    if ($time_diff < 60 * 60) {
        $time_content = floor($time_diff / 60). '分钟前';
    } elseif ($time_diff < 24 * 60 * 60) {
        $time_content = floor($time_diff / (60 * 60)). '小时前';
    } elseif ($time_diff < 30 * 24 * 60 * 60) {
        $time_content = floor($time_diff / (24 * 60 * 60)). '天之前';
    } else {
        $date = date('Y-m-d', $createdTs);
        $time_content = $date;
    }
    $cachedTimeContent = $time_content;
    $lastCreatedTs = $createdTs;
    return $time_content;
}

function processMemoData() {
    $api_url = 'https://zhangbo.net/api/v1/memo?creatorId=1&rowStatus=NORMAL&limit=1';
    $cached_data = get_transient('memo_data');
    if ($cached_data === false) {
        $response = wp_remote_get($api_url);
        if (!is_wp_error($response)) {
            $body = wp_remote_retrieve_body($response);
            $data = json_decode($body, true);
            set_transient('memo_data', $data, 60 * 5); // 缓存 5 分钟
        } else {
            return;
        }
    } else {
        $data = $cached_data;
    }
    if (empty($data)) {
        return;
    }
    $memo = $data[0];
    $id = $memo['id'];
    $link_content = 'https://zhangbo.net/m/'. $id;
    $content = $memo['content'];
    preg_match('/#([^ ]*)/', $content, $matches);
    $tag_content = isset($matches[1])? '#'. $matches[1] : '';
    $createdTs = $memo['createdTs'];

    // 处理时间差
    $time_content = getTimeContent($createdTs);

    // 检查内容中的图片链接
    preg_match_all('/!\[.*?\]\((.*?)\)/', $content, $image_matches);
    $image_content = [];
    $has_external_link = false; 

    // 检查内容中的图片链接并添加到 $image_content
    if (!empty($image_matches[1])) {
        $image_content = array_merge($image_content, $image_matches[1]);
    }

    // 检查 resourceList 中的 externalLink
    if (!empty($memo['resourceList'])) {
        foreach ($memo['resourceList'] as $resource) {
            if (!empty($resource['externalLink']) && filter_var($resource['externalLink'], FILTER_VALIDATE_URL) && preg_match('/\.(jpg|jpeg|png|gif|bmp|webp)$/i', $resource['externalLink'])) {
                $image_content[] = $resource['externalLink'];
                $has_external_link = true; 
            } elseif (!empty($resource['filename'])) {
                $resource_id = $resource['id'];
                $image_content[] = 'https://zhangbo.net/o/r/'. $resource_id. '/'. $resource['filename'];
            }
        }
    }

    // 判断内容长度并进行处理
    if (mb_strlen($content, 'UTF-8') > 100) {
        $substr_content = mb_substr($content, 0, 100, 'UTF-8');
        $last_char = mb_substr($substr_content, -1, 1, 'UTF-8');
        $last_char_ascii = ord($last_char);
        while ($last_char_ascii < 32 || $last_char_ascii > 126) {
            $substr_content = mb_substr($substr_content, 0, -1, 'UTF-8');
            $last_char = mb_substr($substr_content, -1, 1, 'UTF-8');
            $last_char_ascii = ord($last_char);
        }
        $content = $substr_content. '......';
        $link_text = '查看原文';
    } else {
        $link_text = '点击评价';
    }

    $content_without_tags_and_images = preg_replace('/#.*? /', '', $content);
    $content_without_tags_and_images = preg_replace('/!\[.*?\]\(.*?\)/', '', $content_without_tags_and_images);
    $content = $content_without_tags_and_images;

    // 构建输出内容
    $output = '
'; $header = '

最新动态

'. $time_content. '
'; $divider = '
'; $contentDiv = '
'. $content. '
'; $imagesDiv = ''; if (!empty($image_content)) { $imagesDiv = '
'; foreach ($image_content as $image_link) { $imagesDiv.= 'Image'; } $imagesDiv.= '
'; } $footer = '
'. $tag_content. '
'. $link_text. '
'; $output.= $header. $divider. $contentDiv. $imagesDiv. $footer; $output.= '
'; return $output; }

OK,结束!折腾十几个小时,就是出了这篇教程!!

❌