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";
            }
        }

比较笨的办法,也不想优化了,试了一下,速度快了一些

效果:
2023-01-20-13-47-48.webp

2022.12.1

在9.0.1更新后,handsome修改了函数,我也进行了修改(搞了我好久,害人不浅)我没有想到他修改了getSjAllImages的动作方式,离谱。

最后修改:2023 年 01 月 20 日
如果觉得我的文章对你有用,留个言就可以了