当前位置: 首页 > news >正文

【教程】Typecho Joe主题开启并修复壁纸相册不显示问题

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn]

背景说明

        Joe主题本身支持“壁纸”功能,其实就是相册。当时还在网上找了好久相册部署的开源项目,太傻了。

        但是网上教程很少,一没说如何开启壁纸功能,二没说开启后为何不显示图片,三没说如何显示自定义图片。

        通过层层深扒源码,我已经成功修复并实现了上述问题。所以,这个重任还是由我来吧。接下来将是非常详细的图文教程,小白有手就行。

开启壁纸

        进入后台,创建独立页面

        

        标题随便填,最关键的是模板要选“壁纸”

        直接发布页面即可

        发布后点上面这个提示进去页面

比如我的:https://xfxuezhang.cn/index.php/tuji.html

        此时你会看到一直在转圈圈,你也不知道如何去添加图片

修复显示

        SSH进入服务器后台,进到Joe主题下面的public目录。这个路径都是一样的,直接复制即可

cd /var/www/html/usr/themes/Joe/public/

        打开route.php,直接替换里面的两个函数

vim route.php

function _getWallpaperType($self)  改成

/* 获取壁纸分类 已测试 √ */
function _getWallpaperType($self)
{header('Content-Type: application/json');$self->response->setStatus(200);$json = file_get_contents("http://cdn.apc.360.cn/index.php?c=WallPaper&a=getAllCategoriesV2&from=360chrome");$res = json_decode($json, TRUE);if ($res['errno'] == 0) {$self->response->throwJson(["code" => 1,"data" => $res['data']]);} else {$self->response->throwJson(["code" => 0,"data" => null]);}
}

function _getWallpaperList($self)  改成

/* 获取壁纸列表 已测试 √ */
function _getWallpaperList($self)
{header('Content-Type: application/json');$self->response->setStatus(200);$cid = $self->request->cid;$start = $self->request->start;$count = $self->request->count;$json = file_get_contents("http://wallpaper.apc.360.cn/index.php?c=WallPaper&a=getAppsByCategory&cid={$cid}&start={$start}&count={$count}&from=360chrome");$res = json_decode($json, TRUE);if ($res['errno'] == 0) {// 数据总数$total = $res['total'];$self->response->throwJson(["code" => 1,"data" => $res['data'],"total" => $total]);} else {$self->response->throwJson(["code" => 0,"data" => null]);}}

        保存后刷新页面,就可以惊喜的发现能成功显示360壁纸了

自定义图片

        那如何让它显示我们自己的图片呢?Joe显示壁纸的代码是固定的,所以我们只需要按照360壁纸的接口来设计我们的服务api就行。

壁纸分类接口

        先看壁纸分类,360接口示例:

http://cdn.apc.360.cn/index.php?c=WallPaper&a=getAllCategoriesV2&from=360chrome

        实际有用的

{"errno": "0","total": "1","data": [{"id": "1","name": "xxx"}]
}

        如果你有服务程序开着,那么就返回这种类型的数据就行。我不想单独再开个监听服务程序,所以后面会讲我的简单方法。

壁纸图片接口

        对于根据分类获取图片的360接口:

http://wallpaper.apc.360.cn/index.php?c=WallPaper&a=getAppsByCategory&cid={$cid}&start={$start}&count={$count}&from=360chrome

        实际有用的:

{"errno": "0","total": "1884","data": [{"id": "1","url": "http://xfxuezhang.cn/mypics/1/0366_PT1814-2_7E8DB7C0.jpg"},]
}

        同样的, 如果你有服务程序开着,那么就返回这种类型的数据就行。我不想单独再开个监听服务程序,所以后面会讲我的简单方法。

替换自己的图片

        超级简单的方法。直接在网站目录下创建一个文件夹,里面每个子目录就是一个分类,子目录名是cid,分类信息用image_types.json保存,图片信息用image_details_{cid}.json保存,而generate.py可以根据子目录自动生成image_details_{cid}.json。

        举个栗子,我创建了mypics目录

mkdir /var/www/html/mypics

        目录结构:

        子目录1中的内容:

image_types.json

{"errno": "0","total": "1","data": [{"id": "1","name": "涂料印花"}]
}

generate.py

import os
import json# 指定图片存放的目录
pics_directory = "./"# 遍历pics_directory目录下的子目录
for cid in os.listdir(pics_directory):if not os.path.isdir(cid):continueprint(f">> 正在处理:{cid}")# 构建JSON文件路径json_file_path = os.path.join(pics_directory, cid, f"image_details_{cid}.json")output_file = os.path.join(pics_directory, f"image_details_{cid}.json")# 获取子目录下的所有图片文件image_files = os.listdir(os.path.join(pics_directory, cid))# 构建JSON数据json_data = {"errno": "0","total": str(len(image_files)),"data": [{"id": str(i + 1), "url": f"https://xfxuezhang.cn/mypics/{cid}/{image}"}for i, image in enumerate(image_files)]}# 将JSON数据写入文件 with open(output_file, 'w') as json_file:json.dump(json_data, json_file, indent=2)print(f"Generated {output_file}")

执行generate.py生成image_details_1.json:

python generate.py

image_details_1.json

{"errno": "0","total": "2","data": [{"id": "1","url": "http://xfxuezhang.cn/mypics/1/0366_PT1814-2_7E8DB7C0.jpg"},{"id": "3","url": "http://xfxuezhang.cn/mypics/1/0366_PT1814-2_7E8DB7C0.jpg"},]
}

        最主要的!还要去修改route.php中的两个函数!

function _getWallpaperType($self)  改为

/* 获取壁纸分类 已测试 √ */
function _getWallpaperType($self)
{// 允许所有域的跨域请求header("Access-Control-Allow-Origin: *");header("Access-Control-Allow-Methods: GET, POST, OPTIONS");header("Access-Control-Allow-Headers: Content-Type");header("Access-Control-Max-Age: 86400");header('Content-Type: application/json');$self->response->setStatus(200);// $json = file_get_contents("http://cdn.apc.360.cn/index.php?c=WallPaper&a=getAllCategoriesV2&from=360chrome");$json = file_get_contents("http://xfxuezhang.cn/mypics/image_types.json");$res = json_decode($json, TRUE);if ($res['errno'] == 0) {$self->response->throwJson(["code" => 1,"data" => $res['data']]);} else {$self->response->throwJson(["code" => 0,"data" => null]);}
}

function _getWallpaperList($self)  改为

/* 获取壁纸列表 已测试 √ */
function _getWallpaperList($self)
{// 允许所有域的跨域请求header("Access-Control-Allow-Origin: *");header("Access-Control-Allow-Methods: GET, POST, OPTIONS");header("Access-Control-Allow-Headers: Content-Type");header("Access-Control-Max-Age: 86400");header('Content-Type: application/json');$self->response->setStatus(200);$cid = $self->request->cid;$start = $self->request->start;$count = $self->request->count;// $json = file_get_contents("http://wallpaper.apc.360.cn/index.php?c=WallPaper&a=getAppsByCategory&cid={$cid}&start={$start}&count={$count}&from=360chrome");$json = file_get_contents("http://xfxuezhang.cn/mypics/image_details_{$cid}.json");$res = json_decode($json, TRUE);if ($res['errno'] == 0) {// 数据总数$total = $res['total'];// 对数据进行分割$startIndex = $start;$endIndex = $startIndex + $count;$slicedData = array_slice($res['data'], $startIndex, $count);$self->response->throwJson(["code" => 1,"data" => $slicedData,"total" => $total]);} else {$self->response->throwJson(["code" => 0,"data" => null]);}}

        改完保存后,去刷新壁纸页面,就可以看到已经顺便变成我们自己的图了

后续修改

        之后要调整内容,就只需要在mypics目录下放个子目录,然后手动将这个子目录信息写到image_types.json,然后直接执行generate.py就可以了。

进阶加速方法

        图片会占用大量内存,如果资金充足可以买一个CDN。另一种方法是加上缓存。对于Typecho可以用这个插件:

GitHub - gogobody/TpCache: 一个 typecho 缓存插件

        注意需要开启php-redis,比如我的是php8.1版本:

sudo apt install php8.1-redis

        然后安装redis:

sudo apt install redis-server -y

        然后就是常规插件的开启方法,大家都会的。可以参考我的设置:

相关文章:

  • mongodb基本命令操作
  • OpenHarmony之消息机制实现
  • 将PPT4页并排成1页
  • 全志F1C100s Linux 系统编译出错:不能连接 github
  • 计算机基础面试题 |11.精选计算机基础面试题
  • C语言实验4:指针
  • VUE--保留小数(过滤器)
  • 在Go语言中处理HTTP请求中的Cookie
  • Huggy Lingo: 利用机器学习改进 Hugging Face Hub 上的语言元数据
  • 第11章 GUI Page462~476 步骤二十三 步骤二十四 Undo/Redo ②“添加操作”支持“Undo/Redo”
  • Android开发中“真正”的仓库模式
  • vue项目报错RangeError: Maximum call stack size exceeded
  • RMAN-03002 RMAN-06059 ORA-19625
  • Ubuntun使用ISO镜像中的软件包作为本地镜像源
  • 2024年MySQL学习指南(四),探索MySQL数据库,掌握未来数据管理趋势
  • 【Leetcode】101. 对称二叉树
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 10个最佳ES6特性 ES7与ES8的特性
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • extjs4学习之配置
  • java小心机(3)| 浅析finalize()
  • js写一个简单的选项卡
  • Just for fun——迅速写完快速排序
  • maya建模与骨骼动画快速实现人工鱼
  • Median of Two Sorted Arrays
  • Node + FFmpeg 实现Canvas动画导出视频
  • python_bomb----数据类型总结
  • Spring核心 Bean的高级装配
  • 从0实现一个tiny react(三)生命周期
  • 多线程事务回滚
  • 给Prometheus造假数据的方法
  • 三分钟教你同步 Visual Studio Code 设置
  • 设计模式(12)迭代器模式(讲解+应用)
  • 使用API自动生成工具优化前端工作流
  • 提醒我喝水chrome插件开发指南
  • 函数计算新功能-----支持C#函数
  • #pragma预处理命令
  • (14)Hive调优——合并小文件
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (Note)C++中的继承方式
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .pyc文件是什么?
  • @Transactional类内部访问失效原因详解
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • [20190401]关于semtimedop函数调用.txt
  • [C#]C# OpenVINO部署yolov8图像分类模型