Docker系列 WordPress系列 自建随机图API之动态壁纸

转自我的个人博客https://blognas.hwb0307.com。欢迎关注!

目录

前言

最近偶然看到B站Up主喜雨虫的视频,其中分享了许多无水印高清动态壁纸,无论小姐姐、小猫、环境、天气等均十分唯美,所以动起了想要搬运的心思。经过与likepoems大佬讨论,结合自己在随机图API方面的经验,整了一个不错的方案,这里分享给各位小伙伴(~ ̄▽ ̄)~

我的方案有以下特点:

  • 不需要安装额外的插件,只基于PHP+HTML命令
  • 刷新博客时会随机切换动态壁纸(大小在1.2-1.6Mb不等)
  • 移动设备不使用动态壁纸,只使用体积较小、对性能损耗较小的静态壁纸

这个方案的难点之一在于WordPress并不能像解析图片URL一样直接解析MP4,所以单纯地设置不同链接的随机图API是不可行的。我根据argon主题的设置,在代码方面进行一些配合,从而实现我的目标。个人觉得,argon的背景图片代码完全可以基于我目前的方案简单地改写一下,就可以十分完美地支持动静态壁纸/设备类型特异性壁纸了,有机会我向开发者提一下,看看大佬们有没有开发计划。作为一个颜控,我认为壁纸功能的权重对一个WordPress主题而言有50%左右,所以我对这方面的要求很高,哈哈!

值得注意的是,我的方案仅在WordPress中的argon主题里测试过。不过,其它WordPress主题,或者是基于PHP的其它博客平台应该是可以成功的,只不过需要一点PHP+HTML的知识,如果你是这些情况,只能说具体情况具体分析喽。你可以根据我的思路进行魔改。下面我们直接进入正题,看看怎么给WordPress博客安装动态壁纸吧!

基础

在正式开始之前,先说一些基础知识。首先,WordPress是支持H264格式的MP4格式播放的,但H265是不支持的。小伙伴们准备动态壁纸的时候要注意编码格式。当初,我搞了一个下午并陷入自我怀疑的时候,才发现是视频格式问题(太菜没办法)。

其次,我个人觉得动态壁纸的体积不能太大,不然对访客带宽的要求比较高,不太友好。我的经验是,截取8秒、码率是1.5M、每秒帧数25的H264格式的视频大约是1.2-1.6Mb,具体还要看分辨率(1080p或4k估计问题都不大,自己试试看),这样在大小和性能方面的平衡还可以。我以前的静态壁纸的体积均值为500-700kb,所以这个动态壁纸的大小我还是很满意的。

随机图api

如果你是第一次使用我介绍的随机图API,你最好看一下我以前写的《Docker系列 WordPress系列 自建随机图API》,做好准备工作,比如安装好Add From Server插件。

本文所使用的随机图API的文件结构如下(放在同一个文件夹里):

-rw-rw-rw- 1 www-data www-data  591 Sep 18 11:32  img_mobile.txt
-rw-rw-rw- 1 www-data www-data  594 Oct  5 15:22  index-animated.php
-rw-rw-rw- 1 www-data www-data  1.8K Oct  5 15:39 index-mobileOnly.php
-rw-rw-rw- 1 www-data www-data  1.7K Oct  6 01:10 mp4.txt

img_mobile.txt

存放1个或多个给移动设备专用的静态壁纸的链接,比如这种:

https://fastly.jsdelivr.net/gh/huangwb8/bloghelper@latest/images/wallhaven-v9jp8m.webp

效果是这样的:

mp4.txt

存放1个或多个给PC专用的动态壁纸的链接,比如这种:

https://fastly.jsdelivr.net/gh/huangwb8/bloghelper@latest/images/48bz-02-01.mp4

效果是这样的:

index-mobileOnly.php

我对《Docker系列 WordPress系列 自建随机图API》中的index.php进行了改动并生成index-mobileOnly.php。如果访客设备是移动设备,则返回移动设备专用的静态壁纸;如果访客设备是平板或者PC,则不返回任何值:

<?php // 函数:访客设备 function is_mobile() { if (empty($_SERVER['HTTP_USER_AGENT']) || strpos($_SERVER['HTTP_USER_AGENT'], 'iPad') !== false) { // 因为iPad有类似于PC的长宽比,所以我设置为电脑端 $is_mobile = false; } elseif ( strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile') !== false || strpos($_SERVER['HTTP_USER_AGENT'], 'Android') !== false || strpos($_SERVER['HTTP_USER_AGENT'], 'Silk/') !== false || strpos($_SERVER['HTTP_USER_AGENT'], 'Kindle') !== false || strpos($_SERVER['HTTP_USER_AGENT'], 'BlackBerry') !== false || strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mini') !== false || strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mobi') !== false ) { $is_mobile = true; } else { $is_mobile = false; } return $is_mobile; } // 电脑与手机用不同的壁纸 if(is_mobile()){ // 手机壁纸 $filename = "img_mobile.txt"; //存放api随机图链接的文件名img.txt if(!file_exists($filename)){ die('文件不存在'); } //从文本获取链接 $pics = []; $fs = fopen($filename, "r"); while(!feof($fs)){ $line=trim(fgets($fs)); if($line!=''){ array_push($pics, $line); } } //从数组随机获取链接 $pic = $pics[array_rand($pics)]; //返回指定格式 $type=$_GET['type']; switch($type){ //JSON返回 case 'json': header('Content-type:text/json'); die(json_encode(['pic'=>$pic])); default: die(header("Location: $pic")); } }else{ // 电脑壁纸 // $filename = "img.txt"; } ?>

index-annimated.php

结构类似于index-mobileOnly.php。这个PHP文件随机地返回mp4.txt里的视频链接:

<?php $filename = "mp4.txt"; //存放api随机图链接的文件名img.txt if(!file_exists($filename)){ die('文件不存在'); } //从文本获取链接 $pics = []; $fs = fopen($filename, "r"); while(!feof($fs)){ $line=trim(fgets($fs)); if($line!=''){ array_push($pics, $line); } } //从数组随机获取链接 $pic = $pics[array_rand($pics)]; //返回指定格式 $type=$_GET['type']; switch($type){ //JSON返回 case 'json': header('Content-type:text/json'); die(json_encode(['pic'=>$pic])); default: die(header("Location: $pic")); } ?>

页脚设置

类似于多数WordPress特效,我们还要在外观——主题编辑器——footer.php里设置一些代码(在shell里改也行,看你的喜好),其中这个https://blognas.hwb0307.com/imgapi/index-animated.php要换成你自己的api。

具体代码如下:

<!--动态壁纸开始-->
<!--1. 设备判断-->
<?php
// 函数:访客设备
function is_mobile() {
    if (empty($_SERVER['HTTP_USER_AGENT']) || 
        strpos($_SERVER['HTTP_USER_AGENT'], 'iPad') !== false) {
        // 因为iPad有类似于PC的长宽比,所以我设置为电脑端
            $is_mobile = false;
        } elseif ( strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile') !== false 
            || strpos($_SERVER['HTTP_USER_AGENT'], 'Android') !== false
            || strpos($_SERVER['HTTP_USER_AGENT'], 'Silk/') !== false
            || strpos($_SERVER['HTTP_USER_AGENT'], 'Kindle') !== false
            || strpos($_SERVER['HTTP_USER_AGENT'], 'BlackBerry') !== false
            || strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mini') !== false
            || strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mobi') !== false ) {
        $is_mobile = true;
    } else {
        $is_mobile = false;
    }
    return $is_mobile;
}

if(!is_mobile()){
	// 电脑、平板类。启用动态壁纸
 // echo '<style type="text/css" id="wp-custom-css">#banner:after{opacity: 0;}</style>';
	echo '<style type="text/css" id="wp-custom-css">#content:before{opacity: 0;}</style>';
	echo '<video src="https://blognas.hwb0307.com/imgapi/index-animated.php" class="bg-video bg-video-day" autoplay="" loop="loop" muted=""></video>';
	echo '<video src="https://blognas.hwb0307.com/imgapi/index-animated.php" class="bg-video bg-video-night" autoplay="" loop="loop" muted=""></video>';
}
?>
<!--2. 时间控制-->
<style>
    video.bg-video {
        position: fixed;
        z-index: -1;
        left: 0;
        right: 0;
        top: 0;
        bottom: 0;
        width: 100vw;
        height: 100vh;
        object-fit: cover;
        pointer-events: none;
        transition: opacity .3s ease;
    }
 
    video.bg-video.bg-video-day {
        opacity: 1;
    }
 
    video.bg-video.bg-video-night {
        opacity: 0;
    }
 
    html.darkmode video.bg-video.bg-video-day {
        opacity: 0;
    }
 
    html.darkmode video.bg-video.bg-video-night {
        opacity: 1;
    }
</style>
<!--动态壁纸结束-->

<style type="text/css" id="wp-custom-css">#content:before{opacity: 0;}</style>是为了让动态壁纸未加载时处于透明状态,这样视觉效果比较自然些。

这个代码同时控制日间/夜间模式两套动态壁纸。好处是日间/夜间切换时可以无缝切换;坏处是每次都要同时加载2个动态壁纸,有点浪费访客资源。此外,我还使用了类似index.php里的代码进行设备类型判断,整个过程这个判断重复了1次。总体而言,我个人觉得现在的设计逻辑并不好,只不过能用就是了(~ ̄▽ ̄)~

有机会再慢慢改进!

文件权限

不要忘记添加文件权限:

sudo chmod +666 img_mobile.txt index-animated.php index-mobileOnly.php mp4.txt

我一般都喜欢加,这样不用root用户登陆时也可以随机修改内容。反正不是什么重要的东西,我觉得无所谓。改了这个权限,用户组改不改33:33都没关系的。

Argon主题设置

在WordPress后台,Argon主题选项——页面背景的背景里,填入index_mobileOnly.php文件的https链接。它主要是用来控制移动设备使用img_mobile.txt里的静态壁纸链接。

动态壁纸

这里我列举几个自己比较喜欢的壁纸哈!

  • 霸道姐姐:整体画风偏暗,眼神酷酷的很帅!当然吸烟有害健康(可以看看这个文章,比较新的研究,吸烟和多种疾病密切相关;吸烟和肺癌因果关系的流行病学研究是很久以前就做出来的了),小伙伴们不要学噢

  • 可爱猫咪:又有谁可以拒绝可爱小猫的回眸呢?

  • 血腥约尔:比动画更有魅力!爱了爱了!

目前我制作的一些小视频放在我的Github仓库bloghelperimages文件夹里,美女、风景、宠物居多,大家也可以试试看。会持续更新。链接如下,格式为https://fastly.jsdelivr.net/gh/huangwb8/bloghelper@latest/images/+文件名即可:

https://fastly.jsdelivr.net/gh/huangwb8/bloghelper@latest/images/54bz-16-01.mp4
https://fastly.jsdelivr.net/gh/huangwb8/bloghelper@latest/images/54bz-10-01.mp4
https://fastly.jsdelivr.net/gh/huangwb8/bloghelper@latest/images/57bz-10-01.mp4
https://fastly.jsdelivr.net/gh/huangwb8/bloghelper@latest/images/57bz-09-05.mp4
https://fastly.jsdelivr.net/gh/huangwb8/bloghelper@latest/images/57bz-08-01.mp4
https://fastly.jsdelivr.net/gh/huangwb8/bloghelper@latest/images/29bz-07-01.mp4
https://fastly.jsdelivr.net/gh/huangwb8/bloghelper@latest/images/4kbz-23-02.mp4
https://fastly.jsdelivr.net/gh/huangwb8/bloghelper@latest/images/55bz-08-01.mp4
https://fastly.jsdelivr.net/gh/huangwb8/bloghelper@latest/images/59bz-03-01.mp4
https://fastly.jsdelivr.net/gh/huangwb8/bloghelper@latest/images/60bz-03-01.mp4
https://fastly.jsdelivr.net/gh/huangwb8/bloghelper@latest/images/60bz-04-01.mp4
https://fastly.jsdelivr.net/gh/huangwb8/bloghelper@latest/images/mhbz-05-01.mp4
https://fastly.jsdelivr.net/gh/huangwb8/bloghelper@latest/images/07bz-01-01.mp4
https://fastly.jsdelivr.net/gh/huangwb8/bloghelper@latest/images/07bz-03-01.mp4
https://fastly.jsdelivr.net/gh/huangwb8/bloghelper@latest/images/61bz-04-01.mp4
https://fastly.jsdelivr.net/gh/huangwb8/bloghelper@latest/images/61bz-13-01.mp4
https://fastly.jsdelivr.net/gh/huangwb8/bloghelper@latest/images/61bz-16-01.mp4
https://fastly.jsdelivr.net/gh/huangwb8/bloghelper@latest/images/51bz-14-01.mp4
https://fastly.jsdelivr.net/gh/huangwb8/bloghelper@latest/images/47bz-08-01.mp4
https://fastly.jsdelivr.net/gh/huangwb8/bloghelper@latest/images/48bz-01-01.mp4
https://fastly.jsdelivr.net/gh/huangwb8/bloghelper@latest/images/48bz-02-01.mp4

视频快照如下:

我自己是用DogeCloud缓存的,这样国内的小伙伴访问的时候加载速度会更快。这些动态壁纸多来自B站Up主喜雨虫,我下载完后用格式工厂剪辑的。就像前面推荐的那样,截取8秒、码率是1.5M、每秒帧数25、H264格式。如果你是一个个人小站,截取长度再长些,我觉得问题也不大。另外,B站类似的大佬估计很多,大家也可以多多向我推荐喔!

小结

目前这个动态壁纸的随机图API还是挺满意的,虽然代码实现上有点瑕疵,但可以正常运行。颜值爆表呀,真心推荐!有什么问题可以评论区留言哈!

本文使用 文章同步助手 同步

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容