typecho 添加主题备份及恢复功能

news2024/12/25 18:24:18

typecho 换主题很简单,但是确有一个比较麻烦的事情,就是主题配置在切换主题的同时也就被删除了。于是,今天我下决心要弄一个备份恢复的功能出来。网上查了很久,都没有找到适合的(不过还是有参考价值的)。最后,只能自己构思,一步一步的落实了。

备份功能:对当前主题进行备份
备份方式:用的是文件备份
实现步骤:

  1. 确定文件备份的路径
  2. 对备份的主题和已保存的主题做个对比,数据相同则不出现备份和恢复信息,否则提醒备份
  3. 备份和恢复后,刷新界面(用了个不太理想的效果)

接下来是代码实现部分:

一、确定文件备份的路径

我因为之前用订阅 rss ,在当前主题目录下建立了 tmp 目录,因此就选他了。不过,一定记得要赋予可写权限,linux 系统赋权命令如下:

chmod 777 -R tmp/

二、在主题 funcitons.php 文件的 themeConfig($form){} 方法中添加编写代码

通常将备份恢复的模块放在网页的最前面,将下面的代码,复制到themeConfig($form){}最前面就可以。

// 主题配置备份和恢复--开始//
echo '<div style="border:1px dashed green;padding:1rem;">';
echo '<div style="color:red;font-weight:700;margin-bottom:.5rem">备份前请确保主题目录下建立了tmp目录,并且被赋予可写权限</div>';
$theTheme = Helper::options()->theme;
$db = Typecho_Db::get();
// 设置备份及恢复目录
$backPath = __DIR__ . '/tmp/' . $theTheme . '.txt';

// 获取保存的主题配置信息
$themeConfStr = $db->fetchRow($db->select()->from('table.options')->where('name = ?', 'theme:' . $theTheme))['value'];

// 判断是否要备份配置
if (file_exists($backPath)) {
    $backstr = file_get_contents($backPath); //将整个文件内容读入到一个字符串中
} else {
    $backstr = '';
}

if (strcmp($backstr, $themeConfStr) === 0) {
    echo '当前主题保存的配置信息与备份的配置信息一致,无需备份和恢复';
} else {
    echo '<div style="font-weight:700;margin-bottom:.5rem;">当前主题保存的配置信息与备份的配置信息<span style="color:red;">不一致,请确认是否需要备份或恢复</span> </div><form action="" method="post"><input id="backupbtn" type="submit" name="backup" value="备份主题配置"><input id="restorebtn" type="submit" name="restore" value="恢复主题配置"></form><br>';
}

if ($_POST["backup"]) {
    $backThemeCon = file_put_contents($backPath, $themeConfStr);
    if ($backThemeCon) {
        echo '<script>alert("备份成功")</script>';
        echo "<script>window.location.replace(window.location.href)</script>";
    } else {
        echo '备份失败,请检查 tmp 目录是否有可写权限';
    }
}

if ($_POST["restore"]) {
    if (file_exists($backPath)) {
        $str = file_get_contents($backPath); //将整个文件内容读入到一个字符串中
        $updateThemeConQuery = $db->update('table.options')->rows(array('value' => $str))->where('name = ?', 'theme:' . $theTheme);
        $updateThemCon = $db->query($updateThemeConQuery);
        if ($updateThemCon) {
            echo '<script>alert("恢复成功")</script>';
            echo "<script>window.location.replace(window.location.href)</script>";
        } else {
            echo '恢复失败,请检查主题配置备份数据是否合格';
        }
    }
}
echo '</div>';
// 主题配置恢复备份--结束//

三、下面是两个状态的显示。

备份的主题信息与保存的主题信息一致:

备份的主题信息与保存的主题信息不一致:

在这里插入图片描述

上面的代码没用其他的链接样式,因此拿来即用。

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

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

相关文章

docker部署RustDesk自建服务器

客户端&#xff1a; Releases rustdesk/rustdesk GitHub 服务端&#xff1a; 项目官方地址&#xff1a;GitHub - rustdesk/rustdesk-server: RustDesk Server Program 1、拉取RustDesk库 docker pull rustdesk/rustdesk-server:latest 阿里云库&#xff1a; docker pu…

从零开始了解推荐系统(算法构建、召回、粗排、精排、重排、冷启动、衡量标准)

算法构建 推荐算法流程 实际上是一种信息处理逻辑&#xff0c;当获取了用户与内容的信息之后&#xff0c;按照一定的逻辑处理信息后&#xff0c;产生推荐结果。热度排行榜就是最简单的一种推荐方法&#xff0c;依赖的逻辑是当一个内容被大多数用户喜欢&#xff0c;那么大概率…

【第 1 章 初识 C 语言】1.8 使用 C 语言的 7 个步骤

目录 1.8 使用 C 语言的 7 个步骤 1.8.1 第 1 步&#xff1a;定义程序的目标 1.8.2 第 2 步&#xff1a;设计程序 1.8.3 第 3 步&#xff1a;编写代码 1.8.4 第 4 步&#xff1a;编译 1.8.5 第 5 步&#xff1a;运行程序 1.8.6 第 6 步&#xff1a;测试和调试程序 1.8.…

基于Matlab卡尔曼滤波的GPS/INS集成导航系统研究与实现

随着智能交通和无人驾驶技术的迅猛发展&#xff0c;精确可靠的导航系统已成为提升车辆定位精度与安全性的重要技术。全球定位系统&#xff08;GPS&#xff09;和惯性导航系统&#xff08;INS&#xff09;在导航应用中各具优势&#xff1a;GPS提供全球定位信息&#xff0c;而INS…

C++知识整理day3类与对象(下)——赋值运算符重载、取地址重载、列表初始化、友元、匿名对象、static

文章目录 1.赋值运算符重载1.1 运算符重载1.2 赋值运算符重载 2.取地址重载2.1 const成员函数2.2 取地址运算符重载 3.类与对象的补充3.1 再探构造函数---初始化列表3.2 类型转换3.3 static成员3.4 友元3.5 内部类3.6 匿名对象3.7 对象拷贝时的编译器优化 1.赋值运算符重载 赋…

深入解析级联操作与SQL完整性约束异常的解决方法

目录 前言1. 外键约束与级联操作概述1.1 什么是外键约束1.2 级联操作的实际应用场景 2. 错误分析&#xff1a;SQLIntegrityConstraintViolationException2.1 错误场景描述2.2 触发错误的根本原因 3. 解决方法及优化建议3.1 数据库级别的解决方案3.2 应用层的解决方案 4. 友好提…

dns实验3:主从同步-完全区域传输

服务器192.168.234.111&#xff08;主服务器&#xff09;&#xff0c;打开配置文件&#xff1a; 打开配置文件&#xff1a; 关闭防火墙&#xff0c;改宽松模式&#xff1a; 重启服务&#xff1a; 服务器192.168.234.112&#xff08;从服务器&#xff09;&#xff0c;打开配置文…

LeetCode刷题 -- 分治快排

目录 颜色分类题目解析算法原理代码 排序数组题目解析算法原理代码 数组中第K个最大元素题目解析算法原理代码 LCR 159. 库存管理 III题目解析算法原理代码 颜色分类 题目链接 题目解析 数组分为三块 算法原理 1.如果nums[i] 0&#xff0c;left, i下标对应元素交换&#xff0c…

【论文笔记】Leveraging the Power of MLLMs for Gloss-Free Sign Language Translation

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Leveraging the Power of …

TsingtaoAI具身智能高校实训方案通过华为昇腾技术认证

日前&#xff0c;TsingtaoAI推出的“具身智能高校实训解决方案-从AI大模型机器人到通用具身智能”基于华为技术有限公司AI框架昇思MindSpore&#xff0c;完成并通过昇腾相互兼容性技术认证。 TsingtaoAI&华为昇腾联合解决方案 本项目“具身智能高校实训解决方案”以实现高…

如何抓取亚马逊页面动态加载的内容:Python爬虫实践指南

引言 在现代电商领域&#xff0c;数据的重要性不言而喻。亚马逊作为全球领先的电商平台&#xff0c;其页面上动态加载的内容包含了丰富的商品信息。然而&#xff0c;传统的爬虫技术往往难以应对JavaScript动态加载的内容。本文将详细介绍如何使用Python结合Selenium工具来抓取…

tcpdump抓包wireshark分析

背景 分析特定协议的数据包&#xff0c;如 HTTP、DNS、TCP、UDP 等&#xff0c;诊断网络问题&#xff0c;例如连接故障、延迟和数据包丢失。 大概过程 1.安装tcpdump yum update yum install tcpdump2.抓包&#xff0c;从当前时间起&#xff0c;一小时后停止&#xff0c…

如何进行Appium实现移动端UI自动化测试呢?

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Appium是一个开源跨平台移动应用自动化测试框架。 既然只是想学习下Appium如何入门&#xff0c;那么我们就直奔主题。文章结构如下&#xff1a; 为什么要使用…

骨架行为识别-论文复现

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

Unity 设计模式-观察者模式(Observer Pattern)详解

观察者模式 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了对象之间的一对多依赖关系。当一个对象的状态发生变化时&#xff0c;它的所有依赖者&#xff08;观察者&#xff09;都会收到通知并自动更新。这种模式用于事件处理系…

【webApp之h5端实战】首页评分组件的原生实现

关于评分组件,我们经常在现代前端框架中用到,UI美观效果丰富,使用体验是非常不错的。现在自己动手使用原生js封装下评分组件,可以用在自己的项目中。 组件实现原理 点击的❤左侧包括自己都是高亮的样式,右侧都是灰色的样式,这样就能把组件的状态区分开了。右边再加上辅…

unity与android拓展

一.AndroidStudio打包 1.通过Unity导出Android Studio能够打开的工程 步骤 1.设置导出基本信息&#xff1a;公司名、游戏名、图标、包名等关键信息 2.在File——>Build Settings中&#xff0c;勾选 Export Project 选项 3.点击Export 导出按钮 2.在Android Studio中打开Un…

几种常见的javascript设计模式

摘要 最近开发HarmonyOSApp&#xff0c;使用的Arkts语言&#xff0c;此语言类似后端C#语言风格&#xff0c;同时兼顾写后端接口的我突然想总结一下近8年前端开发中无意中使用的设计模式&#xff0c;我们用到了却不知属于哪些&#xff0c;下面和大家分享一下。 什么是前端设计…

2.4特征预处理(机器学习)

2.4特征预处理 2.4.1 什么是特征预处理 通过 一些转换函数将特征数据转换成更加适合算法模型的特征数据过程。 1 包含内容 数值型数据的无量纲化&#xff1a; 归一化 标准化 2 特征预处理API sklearn.preprocessing 为什么要进行归一化/标准化&#xff1f; 特征的单…

学习笔记052——Spring Boot 自定义 Starter

文章目录 Spring Boot 自定义 Starter1、自定义一个要装载的项目2、创建属性读取类 ServiceProperties3、创建 Service4、创建自动配置类 AutoConfigration5、创建 spring 工程文件6、将项目打成 jar 包7、jar 打包到本地仓库8、配置application.yml Spring Boot 自定义 Starte…