Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【教程】Typecho Joe主题开启并修复壁纸相册不显示问题

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

作者头像
小锋学长生活大爆炸
发布于 2023-12-31 00:02:54
发布于 2023-12-31 00:02:54
38200
代码可运行
举报
运行总次数:0
代码可运行

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

背景说明

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

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

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

开启壁纸

进入后台,创建独立页面

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

直接发布页面即可

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

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

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

修复显示

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd /var/www/html/usr/themes/Joe/public/

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vim route.php

function _getWallpaperType($self) 改成

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/* 获取壁纸分类 已测试 √ */
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) 改成

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/* 获取壁纸列表 已测试 √ */
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

实际有用的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "errno": "0",
    "total": "1",
    "data": [
        {
            "id": "1",
            "name": "xxx"
        }
    ]
}

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

壁纸图片接口

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

http://wallpaper.apc.360.cn/index.php?c=WallPaper&a=getAppsByCategory&cid={

实际有用的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "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目录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkdir /var/www/html/mypics

目录结构:

子目录1中的内容:

image_types.json

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "errno": "0",
    "total": "1",
    "data": [
        {
            "id": "1",
            "name": "涂料印花"
        }
    ]
}

generate.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os
import json

# 指定图片存放的目录
pics_directory = "./"

# 遍历pics_directory目录下的子目录
for cid in os.listdir(pics_directory):
    if not os.path.isdir(cid):
        continue
    print(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:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python generate.py

image_details_1.json

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "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) 改为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/* 获取壁纸分类 已测试 √ */
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) 改为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/* 获取壁纸列表 已测试 √ */
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版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo apt install php8.1-redis

然后安装redis:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo apt install redis-server -y

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-12-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
免费IP地址查询API接口
快递查询 http://www.kuaidi100.com/query?type=quanfengkuaidi&postid=390011492112 (PS:快递公司编码:申通"shentong"
咻一咻
2020/05/29
11.9K0
主题收录检测的问题
现在的问题就是收录检测的问题,有时候它提示已经收录,我连收录的秘钥都没有填写就直接判断为已经收录了,所以我在网上寻找到这个问题的解决方法
oscool资源分享
2024/08/24
1260
分享一枚获取高清壁纸的api
某次在使用360极速浏览器时,发现它自带的换肤功能里头的壁纸都很漂亮,而且种类非常丰富。经过一个小小的抓包,得到了它的api接口。我们可以利用这个接口来做壁纸软件或给网站加入换背景的功能。总之怎么玩就看大家的想象力了~
用户8099761
2023/05/10
9760
Python 轻松爬取上千张小姐姐图片
我们获取图片的目标地址是 360 壁纸库,网上有大神已经做过一波分析了,我们直接拿来使用
周萝卜
2021/11/08
5760
PHP/Node.js获取Bing每日壁纸
Github:https://github.com/mcc108/bing-wallpaper --- PHP跳转图片地址(推荐) 效果:http://congm.in/bing.php bing.p
Cong Min
2018/07/17
2.2K1
Swoole入门到实战(二):进程,内存和协程、Swoole完美支持ThinkPHP5
以树状图显示进程间的关系:pstree -p 进程id 启动成功后会创建worker_num+2个进程。Master进程+Manager进程+serv->worker_num个Worker进程
唐成勇
2019/05/26
1.4K0
开发中经常用到的代码
http://surl.sinaapp.com/ 引入百度CDN公共库 地址:http://t.cn/zYDC8wj
老高的技术博客
2022/12/27
5060
我的简易壁纸网站开发之旅
做开发笔记一直是我的习惯,这次我准备详细讲述从零开始开发一个壁纸网站的过程,分享在开发过程中遇到的各种问题和解决思路,希望能帮助初学者理解涉及到的PHP、HTML、CSS、数据库以及后端逻辑等关键知识点。
繁依Fanyi
2025/04/26
2510
Yii2 速查表
Yii的数据库读取对象,在PDO之上,DAO后有了Query Builder和AR
双面人
2019/06/25
2K0
sctf2016_writeup
周末打了sctf2016,结果遇到了tomato大神的各种渗透题目….大神的脑回路都好长啊,题目都是一层连一层…
LoRexxar
2023/02/20
3440
sctf2016_writeup
PHP实现敏感词过滤系统「建议收藏」
FilterHelper.php,提供获取trie-tree对象,避免重复生成trie-tree对象和保证tree文件与敏感词库的同步更新
全栈程序员站长
2022/07/01
1.8K0
微信公众号支付,JSAPI支付方法,ThinkPHP5+微信支付
总结:开发微信公众号,接入微信支付功能,附上微信支付API接口的实现逻辑图以及相关代码。JSAPI支付:是指在微信内置浏览器内调用微信支付模块支付,比如可用于微信公众号内的微信商城之类的。 首先得在微
用户5745385
2020/05/09
2.7K0
微信公众号支付,JSAPI支付方法,ThinkPHP5+微信支付
dirsearch安装和使用[通俗易懂]
dirsearch是一个基于python3的命令行工具,常用于暴力扫描页面结构,包括网页中的目录和文件。相比其他扫描工具disearch的特点是:
全栈程序员站长
2022/11/08
7.3K0
用轻量应用服务器从零搭建一个动漫风图片API
yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh 12f2c1d72
快乐的小白
2025/01/25
1822
用轻量应用服务器从零搭建一个动漫风图片API
Android 天气APP(二十九)壁纸设置、图片查看、图片保存
  最近收到一些用户的反馈,内容是背景更换这个功能用的不是很舒服,至于为什么不舒服,说不上来。之前我是奔着功能实现去做的,所以很多的细节并没有想的太多,思虑再三之后打算重新做一个更换背景的功能。
晨曦_LLW
2020/09/25
1.6K0
从0开始构建一个属于你自己的PHP框架
为什么我们要去构建一个自己的PHP框架?可能绝大多数的人都会说“市面上已经那么多的框架了,还造什么轮子?”。我的观点“造轮子不是目的,造轮子的过程中汲取到知识才是目的”。
用户1093396
2020/10/29
1.3K0
从0开始构建一个属于你自己的PHP框架
Akina For Typecho主题修改记录分享
大多数博主,基本都换过各种类型的博客程序,WordPress、Typecho、hexo、Z-Blog等等太多了,最后选择Typecho,就是因为小巧不臃肿。本人一共使用过两款:Cactus来自仙岛驿站和Akina来自子虚之人。
目的地-Destination
2023/10/12
3780
Akina For Typecho主题修改记录分享
WordPress主题添加全网热搜榜单教程(WordPress 美化必备)
在 WordPress 网站的美化与功能拓展中,添加全网热搜榜单能显著提升网站的吸引力和实用性。今天为大家带来的WordPress主题添加全网热搜榜单教程,任何WordPress网站都可以使用,能让你的网站轻松拥有这一热门功能,助力网站在众多站点中脱颖而出。本教程适用于 WordPress 6.7.2 及相关版本,通过简单的操作,即可自动获取各大平台前十热搜榜。
用户8482072
2025/03/18
1120
WordPress主题添加全网热搜榜单教程(WordPress 美化必备)
bypass disable function学习
信息收集是不可缺少的一环;通常的,我们在通过前期各种工作成功执行代码 or 发现了一个phpinfo页面之后,会从该页面中搜集一些可用信息以便后续漏洞的寻找。
HhhM
2022/08/10
2.3K0
bypass disable function学习
wordpress优化经历(一)
接下来主要来实现怎么让血小板进行拖拽的功能: 这个问题我第一的想法是可以使用我在大二学JS的时候手写过拖拽的原生Demo,实现了三种拖拽的形式。 具体参考我之前的博文:js的成长经历(十)——js事件高级:拖拽 现在想一想这些基础的JS源码实现还是挺重要的。后来也通过查阅资料,也有下面的一种实现块元素拖拽的方法:
不愿意做鱼的小鲸鱼
2022/09/26
4620
wordpress优化经历(一)
相关推荐
免费IP地址查询API接口
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档