handsome只支持整个assets上传,而这可能会导致一些问题,比如我会导致小图标解析错误,而且也不能发挥阿里oss能图片处理的优势。
而且handsome原本的随机头图是存在服务器本地的,只能是jpg格式,而且只能从数字1开头,数字要连续,等等,使用起来比较的繁琐。
想起以前用过一个图片主题支持使用网络上的图片做随机头图。
版本一
修改 functions_mine.php
$RandomPicChoice = new Radio('RandomPicChoice',
array(
'0' => _t('1.只显示随机图片</br>'),
'1' => _t('2.显示顺序:thumb自定义字段——文章第一个附件——文章第一张图片</br>'),
'2' => _t('3.显示顺序:thumb自定义字段——文章第一个附件——文章第一张图片——随机图片</br>'),
'3' => _t('4.显示顺序:thumb自定义字段——随机图片'),
'4' => _t('5.显示顺序:thumb自定义字段'),
'5' => _t('6.显示顺序:thumb自定义字段——随机网络图片,需要在下面填写地址')
),
//Default choose
'2',_t('博客头图来源设置'),_t('该头图来源设置对首页和文章页面同时生效。头图获取依次按照顺序获取。</br>第五个性能更好,第三个更智能。解析文章中的图片会根据文章内容长度有性能损耗<br><span style="color: #f00">注意</span>:此项设置仅在开启显示头图后才生效')
);
$form->addInput($RandomPicChoice);
$RandomWebPicPath = new Text('RandomWebPicPath',NULL,NULL,_t('自定义从网络上获取头图的位置'),"如果想从oss中获取随机头图请在这里填写,用,分隔。");
$form->addInput($RandomWebPicPath);
添加RandomWebPicPath字段与在RandomPicChoice中添加5选项。
修改 content.php
添加如下函数:
public static function randomWebImage()
{
$options = mget();
$webPath=$options->RandomWebPicPath;
$webPatharr=explode(',', $webPath);
$key=array_rand($webPatharr);
return $webPatharr[$key];
}
这个函数是将options中的字段解析成地址数组的,同时将返回数组中随机的一个值。
找到如下函数
public static function whenSwitchHeaderImgSrc($widget, $index, $howToThumb, $thumbField,$extra_content= "")
找到如下代码
$random = STATIC_PATH . 'img/sj/' . @$randomNum[$index] . '.jpg';//如果有文章置顶,这里可能会导致index not undefined
$pattern = '/\<img.*?src\=\"(.*?)\"[^>]*>/i';
$patternMD = '/\!\[.*?\]\((http(s)?:\/\/.*?(jpg|png|JPEG|webp|jpeg|bmp|gif))/i';
$patternMDfoot = '/\[.*?\]:\s*(http(s)?:\/\/.*?(jpg|png|JPEG|webp|jpeg|bmp|gif))/i';
添加代码后变成:
$webrandom = Content::randomWebImage();
$random = STATIC_PATH . 'img/sj/' . @$randomNum[$index] . '.jpg';//如果有文章置顶,这里可能会导致index not undefined
$pattern = '/\<img.*?src\=\"(.*?)\"[^>]*>/i';
$patternMD = '/\!\[.*?\]\((http(s)?:\/\/.*?(jpg|png|JPEG|webp|jpeg|bmp|gif))/i';
$patternMDfoot = '/\[.*?\]:\s*(http(s)?:\/\/.*?(jpg|png|JPEG|webp|jpeg|bmp|gif))/i';
if($howToThumb == '5'){
if (!empty($thumbField)) {
return $thumbField;
} elseif(!empty($webrandom)){
return $webrandom;
} else {
return "https://oss.lolisis.com/%E7%BD%91%E7%AB%99%E6%90%AD%E5%BB%BA/CompressedImage/DERQ1_Steam_Wallpaper_1920x1080_2.jpg?x-oss-process=style/jpg360p";
}
}
最后一个return中可以换为自己喜欢的图片
版本二
上一个版本没有解决图片可能重复的问题,同时如果要为oss图片添加参数要一个个添加,太麻烦了。
思路,handsome主题内置了输出没有重复数字的数字数组的办法,这里直接调用。
functions_mine.php
//文章缩略图设置
$RandomPicChoice = new Radio('RandomPicChoice',
array(
'0' => _t('1.只显示随机图片</br>'),
'1' => _t('2.显示顺序:thumb自定义字段——文章第一个附件——文章第一张图片</br>'),
'2' => _t('3.显示顺序:thumb自定义字段——文章第一个附件——文章第一张图片——随机图片</br>'),
'3' => _t('4.显示顺序:thumb自定义字段——随机图片'),
'4' => _t('5.显示顺序:thumb自定义字段'),
'5' => _t('6.显示顺序:thumb自定义字段——随机网络图片——随机图片')
),
//Default choose
'2',_t('博客头图来源设置'),_t('该头图来源设置对首页和文章页面同时生效。头图获取依次按照顺序获取。</br>第五个性能更好,第三个更智能。解析文章中的图片会根据文章内容长度有性能损耗<br><span style="color: #f00">注意</span>:此项设置仅在开启显示头图后才生效')
);
$form->addInput($RandomPicChoice);
$RandomWebPicPath = new Text('RandomWebPicPath',NULL,NULL,_t('网络随机头图设置'),"如果想从网络或者oss中获取随机头图请在这里填写,用,分隔。");
$form->addInput($RandomWebPicPath);
$RandomWebPicPathSuffix = new Text('RandomWebPicPathSuffix',NULL,NULL,_t('oss头图参数设置'),"如果想给oss随机头图加参数请在这里填写。\n注意,填写此项则意味所有图片地址都能适用这个参数");
$form->addInput($RandomWebPicPathSuffix);
先前的不变,加增加$RandomWebPicPathSuffix参数。
5选项让用户能选择新写的方法
$RandomWebPicPath输入图片
$RandomWebPicPathSuffix,则代表后缀
Utils.php
找到函数
public static function initGlobalDefine()
在
@define('INDEX_IMAGE_ARRAY',serialize(Utils::getImageNumRandomArray($options->pageSize + $stickyNum, Utils::getSj1ImageNum())));
//右侧边栏图片
@define('SIDEBAR_IMAGE_ARRAY',serialize(Utils::getImageNumRandomArray(5,Utils::getSj2ImageNum())));
Utils::initCDN();
变成
@define('INDEX_IMAGE_ARRAY',serialize(Utils::getImageNumRandomArray($options->pageSize + $stickyNum, Utils::getSj1ImageNum())));
//右侧边栏图片
@define('SIDEBAR_IMAGE_ARRAY',serialize(Utils::getImageNumRandomArray(5,Utils::getSj2ImageNum())));
//网络图片
@define('INDEX_WEB_IMAGE_ARRAY',serialize(Utils::getImageNumRandomArray($options->pageSize + $stickyNum, Utils::getWebPathImageNum())));
Utils::initCDN();
加入序列化INDEX_WEB_IMAGE_ARRAY,调用内置的函数,但注意getImageNumRandomArray是为服务器本地图片设计的,以1开头,到图片个数结尾,而网络图片地址数组是从0开始,图片个数-1结束的,使用时要注意。
找到函数
public static function getSjAllImages($dir)
在下面添加函数
public static function getWebPathImageNum(){
$options = mget();
$webPath=$options->RandomWebPicPath;
$webPathArr=explode(',', $webPath);
$webPathArrNum=count($webPathArr);
$ret=[];
for($i=0;$i<$webPathArrNum;$i++)
{
$ret[]=$i;
}
return $ret;
}
输出有多少个图片
commoncontents.php
添加如下函数:
public static function randomWebImage()
{
$options = mget();
$webPath=$options->RandomWebPicPath;
$webPathArr=explode(',', $webPath);
$webPathArrNum=count($webPathArr);
$ret = [];
for($i=0;$i<$webPathArrNum;$i++)
{
$webPathArr[$i] = rtrim($webPathArr[$i]);
$ret[]=($webPathArr[$i]).($options->RandomWebPicPathSuffix);
}
return $ret;
}
修改函数,直接返回数组,同时将后缀加上。
找到如下函数
public static function whenSwitchHeaderImgSrc($widget, $index, $howToThumb, $thumbField,$extra_content= "")
找到如下代码
$randomNum = unserialize(INDEX_IMAGE_ARRAY);
$random = STATIC_PATH . 'img/sj/' . @$randomNum[$index] . '.jpg';//如果有文章置顶,这里可能会导致index not undefined
$pattern = '/\<img.*?src\=\"(.*?)\"[^>]*>/i';
$patternMD = '/\!\[.*?\]\((http(s)?:\/\/.*?(jpg|png|JPEG|webp|jpeg|bmp|gif))/i';
$patternMDfoot = '/\[.*?\]:\s*(http(s)?:\/\/.*?(jpg|png|JPEG|webp|jpeg|bmp|gif))/i';
添加代码后变成:
$randomNum = unserialize(INDEX_IMAGE_ARRAY);
$randomWebNum = unserialize(INDEX_WEB_IMAGE_ARRAY);
// 随机缩略图路径
$webrandom = CommonContent::randomWebImage();
$random = STATIC_PATH . 'img/sj/' . @$randomNum[$index] . '.jpg';//如果有文章置顶,这里可能会导致index not undefined
$pattern = '/\<img.*?src\=\"(.*?)\"[^>]*>/i';
$patternMD = '/\!\[.*?\]\((http(s)?:\/\/.*?(jpg|png|JPEG|webp|jpeg|bmp|gif))/i';
$patternMDfoot = '/\[.*?\]:\s*(http(s)?:\/\/.*?(jpg|png|JPEG|webp|jpeg|bmp|gif))/i';
if($howToThumb == '5'){
if (!empty($thumbField)) {
return $thumbField;
} elseif(!empty($webrandom)){
return $webrandom[$randomWebNum[$index]];
} else {
return "https://lolisis-file.oss-cn-shenzhen.aliyuncs.com/%E7%BD%91%E7%AB%99%E6%90%AD%E5%BB%BA/%E9%95%87%E7%AB%99%E5%9B%BE.jpg?x-oss-process=style/jpg360p";
}
}
比较笨的办法,也不想优化了,试了一下,速度快了一些
效果:
2022.12.1
在9.0.1更新后,handsome修改了函数,我也进行了修改(搞了我好久,害人不浅)我没有想到他修改了getSjAllImages的动作方式,离谱。