红茶的个人站点

  • 首页
  • 专栏
  • 开发工具
  • 其它
  • 隐私政策
Awalon
Talk is cheap,show me the code.
  1. 首页
  2. 其它
  3. 正文

腾讯云博客搭建 VI

2021年4月18日 2486点热度 1人点赞 2条评论

今天突发奇想,博客的顶部图能不能每天自动更换。花了点时间研究了下,发现主题数据是序列化后保存在数据库中的,修改数据是可行的。

需要说明的是,本方法仅适用于kratos主题。

关于kratos主题安装可以阅读腾讯云博客搭建 II。

PHP脚本

<?php
// 修改wordpress顶部图片
// 仅限于kratos主题
// 设置脚本运行时区
ini_set('date.timezone', 'Asia/Shanghai');
$servername = "localhost";
$username = "root";
$password = "Y@2mysql";
$dbname = 'wordpress2';
 
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
 
// 检测连接
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
} 
$conn->query("set names 'utf8'");
$sql = "SELECT * FROM wp_options
        WHERE option_name = 'kratos_options'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
    $row = $result->fetch_assoc();
    if (!empty($row['option_value'])){
        $optionVal = $row['option_value'];
        $optionVal = @unserialize(trim($optionVal));
        echo "当前顶部图片[".$optionVal['top_img']."]\n";
        if($optionVal !== false){
            $topimg = getTopImg();
            $optionVal['top_img'] = $topimg;
            $optValStr = serialize($optionVal);
            $sql = "UPDATE wp_options
            SET option_value = '{$optValStr}'
            WHERE option_name = 'kratos_options';";
            $conn->query($sql);
            echo "新的顶部图片[".$topimg."]\n";
        }
    }
}
$conn->close();
echo "成功修改顶部图片\n";
​
function getTopImg(){
    $imgs = array(
        'https://image2.icexmoon.cn/image/v2-082445e2f3069927e1bf578e2c51e039_r.jpg',
        'https://image2.icexmoon.cn/image/v2-13de5d8dae374ac2aaf83ed7dd86651f_r.jpg',
        'https://image2.icexmoon.cn/image/v2-1d4597acaabadf093ba4b3e02c7deedb_r.jpg',
        'https://image2.icexmoon.cn/image/v2-65c35fa8fe64d210b89f700a7187cabe_r.jpg',
        'https://image2.icexmoon.cn/image/v2-93604fbbb19073f6465cdab805e1a171_r.jpg',
        'https://image2.icexmoon.cn/image/v2-9b167fe48121483594c9a42cc0f562b8_r.jpg',
        'https://image2.icexmoon.cn/image/v2-a185131e9a2355d7e7ea9a5d98b43ec9_r.jpg',
        'https://image2.icexmoon.cn/image/v2-a9717250ca209f95089206ba77422f99_r.jpg',
        'https://image2.icexmoon.cn/image/v2-d45a180f77fca9ecad0b2c5eb9a5090e_r.jpg',
        'https://image2.icexmoon.cn/image/v2-e82d097ef8991d886a59ae106ae33b40_r.png',
        'https://image2.icexmoon.cn/image/v2-f1a23a4d78b6f8c4ff014f6724298ae0_r.jpg'
    );
    $imgsNum = count($imgs);
    $num = 31/$imgsNum;
    $date = date('d');
    $index = intval(intval($date)/$num);
    if ($index >= $imgsNum){
        $index = $imgsNum - 1;
    }
    return $imgs[$index];
}

脚本的部署位置随意,安全起见最好不要部署到网站目录下,虽然就算能被网络访问到也无所谓。

需要说明的是,顶部图的备选列表是用数组存储的,可以自行根据喜好进行替换,图片替换频率取决于数组长度,数组中的图片越多替换频率越快,最小频率为每天。

自动化

部署好脚本以后我们就可以在crontab中设置自动执行任务。

修改crontab之前可以先用命令行测试以下脚本效果:

在执行此脚本前请一定要备份数据库!

php /var/www/change_topimg.php 

执行完脚本后可以查看博客前台,查看顶部图片是否被替换掉。

修改crontab:

crontab -e

加入脚本执行任务:

30 3 * * * php /var/www/change_topimg.php

建议执行时间设置在wordpress备份任务之后。

就这些了,再次强调,此功能为歪门邪道,使用前务必要备份数据库!

因为使用本脚本损坏主题配置的,作者不承担任何责任。


2021/4/19更新

发现部署的php脚本并没有执行,通过命令tail -n 1000 /var/log/cron | grep php可以观察到crontab任务是执行了,那问题肯定是出在脚本上。

修改crontab,将脚本设置为每10分钟执行一次,并且将错误信息输出到文件。

*/10 * * * * php /var/www/change_topimg.php >> /var/www/change_topimg.log 2>&1

我这里输出了一个php warming,其产生原因这篇文章有说明。

我按着这篇文章卸载并重新安装了php-mysql驱动,悲剧的是驱动和php版本不兼容,直接导致博客挂了。

万幸的是通过另一篇文章,更新了yum软件源后重新安装php,解决了。

通过日志文件排查后并没有发现有什么问题,而且warming也没了,只能看明天会不会正常执行计划任务了。


2021/4/20更新

问题解决了,原来是PHP脚本没有设置时区,导致获取到的天数不准确,一个低级错误。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2026年2月3日

魔芋红茶

加一点PHP,加一点Go,加一点Python......

点赞
< 上一篇
下一篇 >

文章评论

  • yearWm1

    发现你底部的邮箱404了,底部的邮箱用mailto:*@*.*

    2021年4月29日
    回复
    • 魔芋红茶

      @yearWm1 非常感谢

      2021年5月2日
      回复
  • razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
    取消回复

    COPYRIGHT © 2021 icexmoon.cn. ALL RIGHTS RESERVED.
    本网站由提供CDN加速/云存储服务

    Theme Kratos Made By Seaton Jiang

    宁ICP备2021001508号

    宁公网安备64040202000141号