首页 / 技术分享 / https://blog.mcsci.cn/
使用bocchi主题的typecho的小技巧
作者:cinderybell6765技术分享 · bocchi主题丨字数:11174' · 2025-08-25

这两天快开学了,闲的没事弄了一个typecho的博客,主题用的是鼠子的bocchi,大部分图片是孤独摇滚的波奇酱(乐),但是当中有很多地方出现了一些小bug,总的来说一说。
1、主题找不到
在把主题解压在theme文件夹里之后,需要将解压的文件夹名称改为Bocchi,是typecho的一个小毛病,无伤大雅。
2、网站标题上方报错
报错原因在于php版本8.1不适配某个函数了,null应使用‘’替换,文章下方我把修改后的代码列出,可直接替换。
/*

  • 这里是主题函数 / 功能文件。
    */

if (!defined('__TYPECHO_ROOT_DIR__')) exit;
$ThemeVer = GetTheme::Ver(false);
define('BocchiVer', $ThemeVer);

// 定义常量
// 头像
$avatarCdn = Get::Options('AvatarCdn');
define('__TYPECHO_GRAVATAR_PREFIX__', $avatarCdn);

// 判断REST API是否启用
if (Get::Options('RestApi') === 'open') {

GetJsonData::Tomori();

}

// 跳转
if (Get::Options('GoLinkUrl') === 'open' && isset($_GET['GoLink']) && isset($_GET['Url'])) {

Get::Need('Src/Tomori/GoLink.php');
exit;

}

// 外链转内链
function convertLinks($content, $widget, $lastResult = null)
{

$content = $lastResult ?? $content;

// 修复:确保content不为null
if ($content === null) {
    return '';
}

$siteUrl = Get::Options('siteUrl');
$goLinkUrlBase64 = Get::Options('GoLinkUrlBase64') === 'open';

// 缓存选项以避免重复调用
$options = [
    'siteUrl' => $siteUrl,
    'goLinkUrlBase64' => $goLinkUrlBase64
];

return preg_replace_callback(
    '//i',
    function ($matches) use ($options) {
        $url = $matches[2];

        if (strpos($url, $options['siteUrl']) === false) {
            $encodedUrl = $options['goLinkUrlBase64'] ? base64_encode($url) : $url;
            return ""; 
        }

        return ""; 
    },
    $content
);

}

// 主题初始化
function themeInit($archive)
{

// 公共部分
Helper::options()->commentsPageDisplay = 'first';
Helper::options()->commentsOrder = 'DESC';
Helper::options()->commentsMaxNestingLevels = 999;

if (Get::Options('GoLinkUrl') === 'open') {
    // 在文章内容输出前调用 convertLinks
    // 修复:确保archive->content不为null
    if ($archive->content !== null) {
        $archive->content = convertLinks($archive->content, $archive);
    }
}

}

// 获取评论@函数
function get_comment_at($coid)
{

$db = Typecho_Db::get();
$prow = $db->fetchRow($db->select('parent')->from('table.comments')->where('coid = ?', $coid));
$parent = $prow['parent'];
if (!empty($parent)) {
    $arow = $db->fetchRow($db->select('author')->from('table.comments')->where('coid = ? AND status = ?', $parent, 'approved'));
    return !empty($arow['author']) ? '@' . $arow['author'] . ' ' : '';
}
return '';

}

// 获取随机缩略图
function get_RandomThumbnail($base_url, $maxImages = 10)
{

if ($maxImages < 1) {
    $maxImages = 1;
}
$rand = mt_rand(1, $maxImages);
return $base_url . $rand . '.jpg';

}

// 获取文章缩略图
function get_ArticleThumbnail($widget)
{

// 检查自定义缩略图
if (!empty($widget->fields->thumb)) {
    return $widget->fields->thumb;
}

// 提取文章第一张图片
$pattern = '/]*src=[\'"]([^\'"]+)[\'"][^>]*>/i';
if (preg_match($pattern, $widget->content, $matches) && !empty($matches[1])) {
    return $matches[1];
}

// 检查文章附件
$attach = $widget->attachments(1)->attachment;
if ($attach && $attach->isImage) {
    return $attach->url;
}

// 生成随机缩略图
$base_url = !empty(Helper::options()->articleImgSpeed)
    ? rtrim(Helper::options()->articleImgSpeed, '/') . '/'
    : Helper::options()->themeUrl . '/Assets/images/thumb/';

return get_RandomThumbnail($base_url);

}

// 注册插件
Typecho_Plugin::factory('admin/write-post.php')->bottom = array('myyodu', 'one');
Typecho_Plugin::factory('admin/write-page.php')->bottom = array('myyodu', 'one');

class myyodu {

public static function one()
{
?>


}

class GetBocchi {

public static function Template($File) {
    Get::Need('Src/Template/' . $File . '.php');
}

public static function Tomori($File) {
    Get::Need('Src/Tomori/' . $File . '.php');
}

public static function Assets($directOutput = false) {
    $CdnUrl = Get::Options('AssetsCdn');
    if ($CdnUrl == 'default') {
        $CdnUrl = GetTheme::AssetsUrl() . '/';
    } elseif ($CdnUrl == 'PoppinParty') {
        $CdnUrl = Get::Options('AssetsCdnUrl');
    }

    if ($directOutput) {
        echo $CdnUrl;
    } else {
        return $CdnUrl;
    }
}

}

$Files = [

'Fields', 
'ShortCode'];

foreach ($Files as $file) {

require_once $file . '.php';

};

文章版权声明 本网站名称:洛水一畔,谈天说地。
本站永久网址:https://blog.mcsci.cn/
如有侵权,请联系CinderyBell6765进行删除处理。
本站大部分为CinderyBell6765生活学习记录,如有冒犯,实属抱歉!
comment 共有 0 条评论
account_circle
email
link