首页>建站相关>typecho 后台设置番外篇—数据的备份管理

typecho 后台设置番外篇—数据的备份管理

因为考虑到服务器费用的问题,展开来说就是很多服务器商为了吸引用户,会给予新用户一个极低的价格,而在续费时却基本没有什么优惠,导致续费价格甚至需要在首年价格之后再添上一个0,也因此导致了一些不产生利润的站点如同候鸟一样在各大服务器商之间来回迁徙。迁移站点之前我们需要做很多工作,比如站点设置项目的数据备份。

备份后台设置项

typecho后台设置项的数据会被存储在数据库的typecho_options这张表里,字段名一般为theme:主题名,根据主题名称的不同,该字段名也会产生变化,以避免不同的主题产生字段重叠。

Typecho_backend_settings_for_data_backup_management_p1

设置数据的组织结构如下图,看起来是不是有点象一组json数据?主题设置项目较多的时候,手动重设会耗费一定的时间。当需要给站点搬家的时候,我们还是希望能够拿到一份备份的文件,以便在需要的时候直接导入。

Typecho_backend_settings_for_data_backup_management_p2

代码实现

在主题设置页添加了一个表单,以实现数据备份与下载的功能,使用input元素提交的时候没有什么问题,但修改为button元素后,表单数据就无法正确被提交了,最后只能利用js给按钮分别做了绑定,当按钮被点击后,先去修改隐藏的input的value,再执行表单提交操作。

<?php
$name = "august";
$db = Typecho_Db::get();
$backupDir = AUG_THEME_DIR . '/backup/';
if (isset($_POST['type'])) {
    $value = $db->fetchRow($db->select()->from('table.options')->where('name = ?', 'theme:' . $name))['value'];

    if ($_POST["type"] == "backup") {
        $backupData = [
            'backup_time' => date('Y-m-d H:i:s'),
            'theme' => $name,
            'settings' => unserialize($value)
        ];
        $jsonData = json_encode($backupData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
        $filename = $backupDir . 'theme_' . $name . '_backup.json';
        if (file_put_contents($filename, $jsonData)) {
            ?>
            <script>alert("设置已成功备份!");</script>
            <?php
        } else {
            ?>
            <script>alert("备份失败,请检查backup目录权限!");</script>
            <?php
        }
    }
    
    if ($_POST["type"] == "recovery") {
        $backupFile = $backupDir . 'theme_' . $name . '_backup.json';
        if (file_exists($backupFile)) {
            $backupContent = file_get_contents($backupFile);
            $backupData = json_decode($backupContent, true);
            if ($backupData && isset($backupData['settings'])) {
                $serializedSettings = serialize($backupData['settings']);
                $db->query($db->update('table.options')->rows(array('value' => $serializedSettings))->where('name = ?', 'theme:' . $name));
                ?>
                <script>
                    alert("已从备份文件恢复设置!");
                    window.location.href="<?php Helper::options()->adminUrl('options-theme.php');?>";
                </script>
                <?php
            } else {
                ?>
                <script>
                    alert("备份文件解析失败,可能已损坏!");
                </script>
                <?php
            }
        } else {
            ?>
            <script>
                alert("未找到备份文件,无法恢复!");
            </script>
            <?php
        }
    }
    
if ($_POST["type"] == "download") {
    $backupFile = $backupDir . 'theme_' . $name . '_backup.json';
    ob_clean();
    ob_start();
    if (file_exists($backupFile)) {
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="theme_' . $name . '_backup.json"');
        header('Content-Length: ' . filesize($backupFile));
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        ob_end_flush();
        readfile($backupFile);
        exit;
    } else {
        ?>
        <script>
            alert("没有找到可下载的备份文件!"); 
        </script>
        exit;
        <?php
    }
}
}

?>
<form id="backup" class="backup" action="" method="post">
    <input type="hidden" name="type" value="">
    <button type="button" value="backup" class="icon-btn">
        <i class="fa fa-save"></i>
    </button>
    <button type="button" value="recovery" class="icon-btn">
        <i class="fa fa-undo"></i>
    </button>
    <button type="button" value="download" class="icon-btn">
        <i class="fa fa-download"></i>
    </button>
</form>

按钮动作绑定的js代码:

    document.querySelectorAll('#backup button[type="button"]').forEach(btn => {
        btn.addEventListener('click', function(e) {
            e.preventDefault();
            const form = this.closest('form');
            const hiddenInput = form.querySelector('input[name="type"]');
            hiddenInput.value = this.value;
            form.submit();
        });
    });

标签: typecho

移动端可扫我直达哦~

推荐阅读

typecho 2025-05-22

typecho主题的页眉header部分常用代码

网站页眉(Header)是网页顶部固定区域,包含网站核心导航和品牌标识,通常由Logo、主导航菜单、搜索框、实用工具(如登录/注册、购物车)和联系方式等组成。其特点是保持全站一致性、固定显示、响应式设计并强化品牌形象,设计需简洁明了、...

建站相关 typecho

typecho 2025-05-16

typecho站点多语言设置简介

网站一般会有一个语言标记,亲如果右键查看本页的html源代码,会在前两行看到类似下面这样的内容,这段代码里涉及到了一个lang 属性,这个属性是 HTML 中用于声明网页或元素内容语言的重要属性,它对网页的可访问性、SEO 和用户体验...

建站相关 typecho

typecho 2025-05-14

typecho后台设置页番外篇—设置页的美化

博主用过的typecho主题不多,见识也有限,在个人用过的主题里功能最全的那必须是joe主题。joe主题不光是有一个很漂亮的前台展现,对主题的后台也进行了美化,以下代码摘录自joe主题的functions.php文件。function...

建站相关 typecho

typecho 2025-04-29

typecho让后台设置的代码更为易读

利用deepseek写一个简单的后台控件类,来简化一下后台的书写,利用这个类,我们可以把参数以数组的形式组装在一起,由类来轮询读取并生成控件。虽然这个对于站点的运行速度不会有什么正向的收益,但因为后台设置我们可以仅在管理员登陆的情况下...

建站相关 typecho

typecho 2025-04-20

关于typecho主题的目录结构

wordpress的极简主题需要有两个文件,分别是index.php以及style.css,而在typecho中,因为主题的一些配置信息默认被放在了index.php而不是style.css文件中,所以直接往主题包里仍一个index....

建站相关 typecho

typecho 2025-04-20

从零开始做一个 Typecho 主题系列

Typecho是一款轻量级、高效的开源博客程序,由国内开发者团队开发维护。它采用PHP语言编写,支持MySQL、SQLite等多种数据库,安装包体积仅有500KB左右,运行时内存占用极低,却能提供出色的性能表现。这款博客程序最大的特点...

建站相关 typecho

typecho 2025-04-18

Typecho_Db 类以及各方法基础用例

Typecho_Db 是 Typecho 博客系统的数据库操作核心类,提供了数据库连接、查询构建和执行等功能。Typecho_Db 提供了简洁高效的数据库操作接口,是Typecho插件和主题开发中最常用的类之一。主要功能数据库连接管理...

建站相关 typecho

typecho 2025-04-16

typecho 1.2.1 给标签添加description说明文字

之前写过一篇为typecho标签添加说明字段的方法,对应的是typecho1.1版本,目前typecho的稳定版本是1.2.1, 因为服务器php版本较低,一直没有去尝试新版。这几天用小皮面板搭建了一个本地的php环境,终于是正经尝试...

建站相关 typecho

typecho 2025-04-11

Typecho博客系统中的config.inc.php文件

在 Typecho 博客系统中,config.inc.php 是一个核心配置文件,用于存储数据库连接信息和系统关键设置。它通常位于 Typecho 的安装根目录下,在安装过程中自动生成。Typecho 的安装包解压后并不包含这个文件,...

建站相关 typecho

typecho 2025-04-09

Typecho尝试获取主题的一些基础信息

在Typecho的主题一览里是利用了一个循环来遍历主题,遍历主题的时候可以通过activated参数来确定是否是当前主题,这样就可以利用官方提供的函数来获取主题信息了,缺点很明显,需要多使用一个循环,浪费资源。<?php \Wi...

建站相关 typecho

typecho 2025-04-02

typecho模板解析优先级

类似于wordpress ,Typecho的模板系统也遵循特定的优先级规则,当系统寻找模板文件时会按照以下顺序进行查找:模板文件查找优先级主题自定义模板 (最高优先级)usr/themes/[主题名]/[模板文件]例如:usr/the...

建站相关 typecho

typecho 2025-03-27

typecho如何实时更新被修改后的style.css文件

给新的站点“biib.top”加了个友情链接,顺便修改了一下主题的footer背景。但浏览器缓存了站点的css文件,修改后的效果并不实时生效。直接清除浏览器缓存是个简单粗暴的办法,问题在于这个效果也只是针对博主个人,用户可不会没事瞎清...

建站相关 typecho