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

news2025/7/18 18:58:56

转载请注明出处:小锋学长生活大爆炸[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):
        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:

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1345564.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java Log 学习笔记

参考文章: 1.Java 日志从入门到实战 2.Java日志框架的发展历史,你不想了解一下吗 背景 想自定义 logback 配置文件进行日志分级别记录到不同文件,遇到了几个问题(使用的是 spring-boot 构建的项目,spring-boot 版本为…

开源可观测性平台Signoz(四)【链路监控及数据库中间件监控篇】

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 前文链接: ​​开源可观测性平台Signoz系列(一)【开篇】​​ ​​开源可观测性平台Signoz&…

记录一下imx6ull linux 5.10.9多点电容触摸屏驱动报错问题解决方法

最近再研究如何将linux 5.10.9移植到imx6ull,用的原子的开发板,在移植电容触摸屏驱动时报错gpio gpiochip0: (209c000.gpio): gpiochip_lock_as_irq: tried to flag a GPIO set as output for IRQ,如下图: 该错误的意思就是尝试将…

MongoDB Certified Associate Developer 认证考试心得

介绍 前段时间通过了 MongoDB Associate Developer 考试,也记下了一些心得,结果忘记发出来了,现在重新整理下。通过考试后证书是这样的: MongoDB 目前有两个认证证书 1. MongoDB Associate Developer 认证掌握使用MongoDB 来构建现代应用…

前端八股文(工程化篇)

目录 1.常用的git命令有哪些? 2.git rebase和git merge的区别 3.有哪些常见的Loader和Plugin? 4.webpack的构建流程 5.bundle,chunk,module是什么? 6.如何提高webpack的打包速度 7.vite比webpack快在哪里 8.说一下你对Monorepo的理解 …

EOS开发Ubuntu安装EOSIO.CDT(Install the EOSIO.CDT)

EOS开发Ubuntu安装EOSIO.CDT(Install the EOSIO.CDT) EOSIO.CDT介绍:EOSIO合约开发工具包,简称CDT,是与合约编译相关的工具集合。而且后续教程主要使用 CDT 来编译合约和生成 ABI,不要忽略。 刚才我们安装好…

欢迎来到Web3.0的世界:Solidity智能合约安全漏洞分析

智能合约概述 智能合约是运行在区块链网络中的一段程序,经由多方机构自动执行预先设定的逻辑,程序执行后,网络上的最终状态将不可改变。智能合约本质上是传统合约的数字版本,由去中心化的计算机网络执行,而不是由政府…

汽车制造厂批量使用成华制造弹簧平衡器

数年来,成华制造都在不断的向各行各界输出着自己的起重设备,与众多企业达成合作,不断供应优质产品。近些年,成华制造以其卓越的产品质量和高效的生产能力,成功实现了弹簧平衡器的大规模批量供应,为重庆数家…

【开源】基于Vue+SpringBoot的就医保险管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 科室档案模块2.2 医生档案模块2.3 预约挂号模块2.4 我的挂号模块 三、系统展示四、核心代码4.1 用户查询全部医生4.2 新增医生4.3 查询科室4.4 新增号源4.5 预约号源 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVue…

【Vue2+3入门到实战】(16)VUEVue路由的重定向、404、编程式导航、path路径跳转传参 详细代码示例

目录 一、Vue路由-重定向1.问题2.解决方案3.语法4.代码演示 二、Vue路由-4041.作用2.位置3.语法4.代码示例 三、Vue路由-模式设置1.问题2.语法 四、编程式导航-两种路由跳转方式1.问题2.方案3.语法4.path路径跳转语法5.代码演示 path跳转方式6.name命名路由跳转7.代码演示通过n…

工程(十七)——自己数据集跑R2live

博主创建了一个科研互助群Q:772356582,欢迎大家加入讨论。 r2live是比较早的算法,编译过程有很多问题,通过以下两个博客可以解决 编译R2LIVE问题&解决方法-CSDN博客 r2live process has died 问题解决了_required process …

优化算法3D可视化

编程实现优化算法,并3D可视化 1. 函数3D可视化 分别画出 和 的3D图 import numpy as np from matplotlib import pyplot as plt import torch# 画出x**2 class Op(object):def __init__(self):passdef __call__(self, inputs):return self.forward(inputs)def for…

【软考】系统集成项目管理工程师【总】

引言 本来整理这篇文章的目的是方便自己23年考试用的 效果不错 目标完成。 接下来的目标是把这篇文章 做成参加该软考 小伙伴的唯一参考资料(有它就够了)来持续更新。。。 这篇文章我将当作一个长周期(以年为单位)项目运维起来&am…

【Web】vulhub-httpd apache解析漏洞复现(1)

目录 ①CVE-2017-15715 ②apache_parsing_vulnerability ①CVE-2017-15715 贴出源码&#xff1a; <?php if(isset($_FILES[file])) {$name basename($_POST[name]);$ext pathinfo($name,PATHINFO_EXTENSION);if(in_array($ext, [php, php3, php4, php5, phtml, pht]))…

linux常见基础指令

入门常见基础指令 ls、stat、 pwd 、cd、tree、 whoami、 touch、 mkdir、 rm 、 man、 cp、mv、cat、tac、echo、>、 >>、 < 、more、 less、 head、 tail、date、 cal、 find、 which、alias、whereis、grep、zip与unzip、 tar、bc、uname、xargs... 热键Tab、…

时序分解 | Matlab实现贝叶斯变化点检测与时间序列分解

时序分解 | Matlab实现贝叶斯变化点检测与时间序列分解 目录 时序分解 | Matlab实现贝叶斯变化点检测与时间序列分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现贝叶斯变化点检测与时间序列分解 1.Matlab实现贝叶斯变化点检测与时间序列分解&#xff0c;完…

STM32——通用计时器

通用计时器框图 1.时钟源 1&#xff09;内部时钟(CK_INT) 2&#xff09;外部时钟模式 1&#xff1a;外部输入引脚(TIx)&#xff0c;x1&#xff0c;2&#xff08;即只能来自于通道 1 或者通道 2&#xff09; 3&#xff09;外部时钟模式 2&#xff1a;外部触发输入(ETR) 4&#…

【面试】 Maven 的八大核心概念

Maven 的八大核心概念 在这里&#xff0c;举出这个标题&#xff0c;自然大家知道Maven是干啥的&#xff0c;就不过多进行赘述&#xff01;我们主要对于Maven的八大核心概念做一个解释补充&#xff0c;这也是我自己的一个学习历程&#xff0c;我们一起共勉&#xff01; 文章概述…

STM32实战之IAP代码升级

目录 1 IAP介绍 2 内存分区 3 整体设计流程图 4 Boot Loader的代码编写 5 APP1代码编写 6 APP2代码编写 stm32内部flash操作相关函数 1 IAP介绍 IAP&#xff08;In Application Programming&#xff09;即在应用编程&#xff0c; IAP 是用户自己的程序在运行过程中…

大创项目推荐 深度学习交通车辆流量分析 - 目标检测与跟踪 - python opencv

文章目录 0 前言1 课题背景2 实现效果3 DeepSORT车辆跟踪3.1 Deep SORT多目标跟踪算法3.2 算法流程 4 YOLOV5算法4.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; *…