今天突发奇想,博客的顶部图能不能每天自动更换。花了点时间研究了下,发现主题数据是序列化后保存在数据库中的,修改数据是可行的。
需要说明的是,本方法仅适用于kratos主题
关于kratos主题安装可以阅读。
PHP脚本
<?php
// 修改wordpress顶部图片
// 仅限于kratos主题
// 设置脚本运行时区
ini_set('date.timezone', 'Asia/Shanghai');
$servername = "localhost";
$username = "<数据库用户名>";
$password = "<数据库密码>";
$dbname = '<数据库名>';
// 创建连接
$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'";
$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));
if($optionVal !== false){
$topimg = getTopImg();
$optionVal['top_img'] = $topimg;
$optValStr = serialize($optionVal);
$sql = "UPDATE wp_options
SET option_value = '{$optValStr}'
WHERE option_name = 'kratos';";
$conn->query($sql);
}
}
}
$conn->close();
echo "成功修改顶部图片";
function getTopImg(){
$imgs = array('https://ae01.alicdn.com/kf/Ud76d158c397d4149a247b130c7f12a0bW.jpg',
'https://ae01.alicdn.com/kf/Uccaf16a813dd44b390a68eec2aea0df0Q.jpg',
'https://ae01.alicdn.com/kf/U7dff7927f9304f8abb9c0022ae27c843X.jpg',
'https://ae01.alicdn.com/kf/Ue7b106310772485ba6002eefa94a91531.jpg',
'https://ae01.alicdn.com/kf/U1fc7eb8b45c64acb9ed7d58af68d63574.jpg',
'https://ae01.alicdn.com/kf/Ubd3cacdc2edb4bd3b9453c54d4e3351aQ.jpg',
'https://ae01.alicdn.com/kf/Uaa7b3d3286ab44dc86cf0e8883d0d627j.jpg',
'https://ae01.alicdn.com/kf/U72d21fb43a3f4b1ca1eeadae27e65bc9T.jpg',
'https://ae01.alicdn.com/kf/U6753703e99ae4a169f33127ff365a652A.jpg',
'https://ae01.alicdn.com/kf/U814690be42b74a949c491470f931d9b3z.jpg',
'https://ae01.alicdn.com/kf/U329c9aa7b12a4756bfd6ac068a1e542d3.jpg',
'https://ae01.alicdn.com/kf/U327262e9726a47ec89c3699c9f051fd6X.jpg',
'https://ae01.alicdn.com/kf/U51c4f33595cc48d89e8a23a7b0c667ecp.jpg',
'https://ae01.alicdn.com/kf/U6b2d13c494924dbca518a84cdd89b11bD.jpg',
'https://ae01.alicdn.com/kf/Udc55e158f04a4d938fb57b65ddbddedfw.jpg',
'https://ae01.alicdn.com/kf/U5f9e5ac4e6e743d9a71427baaac5a561P.jpg',
'https://ae01.alicdn.com/kf/U01ffebd12faa4f9484567e4dae4fc732L.jpg',
'https://ae01.alicdn.com/kf/U8e58a632f2174faabe5478431435f355g.jpg',
'https://ae01.alicdn.com/kf/U2c3a971dcd21485c95aa64f85c256094O.jpg',
'https://ae01.alicdn.com/kf/Uf9ae73a8e5f04bcda6141afe3d0ce5a14.jpg',
'https://ae01.alicdn.com/kf/Ud6359912832f45a2a6c307372f2965bfv.jpg',
'https://ae01.alicdn.com/kf/Ucc39d8a985ad4085b7cf096efc6454697.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 非常感谢