今天突发奇想,博客的顶部图能不能每天自动更换。花了点时间研究了下,发现主题数据是序列化后保存在数据库中的,修改数据是可行的。
需要说明的是,本方法仅适用于kratos主题
关于kratos主题安装可以阅读。
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脚本没有设置时区,导致获取到的天数不准确,一个低级错误。

文章评论
发现你底部的邮箱404了,底部的邮箱用mailto:*@*.*
@yearWm1 非常感谢