时至今日,终于没忍住,想折腾一下,于是将Spimes升级,从4.8.1升级至如今的7.5版本。

从小灯泡设计购买正版主题至今,翻找了一下自己的博客,发现居然没有自己折腾的过程,好多以前的设置统统遗忘了。

搞得很尴尬,还得重新找作者要设置文档和相关细节设置的方式方法。

在此记录一下折腾过程。


2024.10.19记录

1、后台使用bt暂且不提,升级typecho为最新的1.2.1,php版本升级为8.0,其它不动。

2、登录后台-控制台-备份,这里备份文章,防止最重要的文章数据丢失,另外直接导入备份,可以防止因为更换主题导致数据库问题,印象中头两年折腾经常遇到这样的问题,吃一堑长一智。

3、把后台主题设置相关,所有设置的信息,保存在txt文档,并截图,这样可以非常方便的因为大版本更新主题,导致设置问题遗忘。

4、插件设置截图,并保存txt文档,typecho的插件禁用再启用,相关配置的信息就消失了,这里记录一下,方便找回重新填写。

5、备份当前主题,并备份下载,其中还有自己定义的图片文件夹ico等图片文件,保留备用。

以上基本完成容灾备份,以防不测在服务器做镜像记录,万一失败还可以回滚。


2024.10.20记录

经过删除数据库,重新安装typecho最新1.2.1,主题Spimes7.5安装,此时基本相当于重新安装了最新的后台系统和主题系统,然后重新将原有文章备份导入,至此基础工作完成。

然后再动的就是主题的相关设置,由于主题更新幅度较大,作者也没有相关设置文档,更新的也仅仅是简要,于是开始自由摸索。

1、将旧版本的主题设置,通过截图,将文章置顶、右侧配置,原来有的,统一复制回去。

2、原有图标系统换掉了,导致手机底部的菜单栏图标基本不起作用,于是暂时取消,后续打算用最新调用的图标系统。(手机菜单栏,也许可以不用了)

3、主题一小部分设置失败,部分删减了,好像txt缓存系统去掉了,后续得问作者(原作者工作时间极其规律,业余时间不让打扰,只好留言形式发qq,为了正常生活作息,可以理解。)

4、一部分老插件出现问题了:留★待解决。留√暂解决

  ★① CateFilter首页过滤指定分类,忘记了之前过滤啥分类,不过....不重要了,暂时留着,抽时间看看是不是可以修复。

  √② ShortLinks 把外部链接转换为指定内部链接 ,这个插件比较重要,可以把文章中的外链用自己站的内链跳转.旧版本1.1.0无法使用,重新在github更新了1.2.0版本,好像后续版本要收费了???

  √③ QiniuFile 老本1.0.0版本不再使用,使用的是github的最新1.3.3版本,作者从原来的一个,现在变成了三个,好像原作者更新好慢啊,更新赶不上最新的typecho的变化了,好多人不在更新系统,好可惜,好多博客消失了。

  √④Typembed 这是个好插件,希望抽时间可以研究一下它的规律,让它支持更多平台,老版本1.0.1版本不再使用,目前使用的github的typecho的插件仓库下载的最新1.3.1版本。

  ★⑤WeChatShare微信分享插件,目前出现问题了,分享不再出现小图片和简介,大概率是因为微信公众号的问题,好像得认证一下,木得时间,备注一下有时间再看看。

  ★⑥CommentPush 推送服务,目前暂时无法使用,原因是复选框无法选中保存,好像是typecho的问题,这个暂时无法解决,希望后续更新能够解决,目前改为CommentNotifier泽泽社长的,泽泽社长还是比较活跃的,joe群很棒!

  ★⑦其它有不错的插件待加入。

2024.10.21记录

今天和Spimes作者小灯泡设计沟通了一下,了解了更多的设置问题。

  1、文章底部,文章来源下面,分类文字上面的区域,是需要设定图片的,不然就需要在主题/usr/themes/spimes/core/oin.php的401行开始注释

function myadsee($uid){

   $con = myad($uid);

   // 分割输入字符串

   $parts = explode("|", $con);

   // 获取图片URL和链接URL

   $imageUrl = $parts[0];

   //$linkUrl = $parts[1];  这里开始注释掉

   // 创建HTML字符串

   if($con){

  // $html = "<a href='$linkUrl'><img class='myadimg' src='$imageUrl' alt='Image'></a>";这里注释掉

  // return $html;这里注释掉

   }

   else{

   return null;    

   }

}

后续在作者哪里找到了解决方法,原来在个人简介那里设置,登录后悬停头像,点击自己的id名字,进入个人简介主页-拓展设置 中,自定义广告(展示在文章底部)下面设置格式:图片地址|图片链接 设置图片即可,。不过目前只能强行设置,要么注释,没有开关,期待作者后续可以加一个开关作为启用选择项,而不是强制项。

  ★2、如果不想放图片,目前我用了取巧一种解决方法,就是用PS新建一个915*1的png透明图片使用,暂时解决,不过,不知为何,在苹果手机浏览器上,却显示一个蓝?号无图失链状态。待后续解决。

  ★3、AI功能使用,具体怎么填写,作者的回答:“这里就是字面意思,自己填KEY和url这些,下面就是教客服怎么回答而已”。“生文指令 = 是要他生成什么,比如根据你的提标题,生成什么类型的文章, 小说,散文,英文这些”,emmm.....好像说的很明白了,但是还是不太懂....具体再摸索摸索,没有实操,就没有经验呐。

  √4、再清理浏览器缓存后,发现一个问题,就是在主页顶部显示""style="--thenme:#1D79A3;"> 经过在PC浏览器清理缓存刷新后F12发现,顶部还有PHP错误提示,不过被顶部导航栏挡住了,暂时没有发现,在手机换行后反而发现了。解决方式今天经过摸索,在主题的header.php的43行

<?php echo($_COOKIE['night'] == '1'?'night':''); ?>

改为

<?php echo($_COOKIE['night']?? false) === '1'?'night':'';?>

即可,解决方法发送给了作者,不知道合不合适,待后续观察。

  √5、个人主页--拓展设置中,头像的宽度是样式100%,点击空白处都会不小心点开头像设定,将头像设定修改为50px解决。在4311行


.user-img{ width:100%; }

改为

.user-img{ width:50px; }

  ★★★★6、①后台没有找到txtcache功能了,删掉了?有没有缓存插件推荐?
   ②首页右侧的热门文章如何调出来?
   ③专题推荐的图片和文字在哪里设置?
   ④搜索框下的图文推荐和专题图文在哪里设置?

以上是需要急需解决的,暂时记录到这。

2024.10.22记录

  续接上次问题解决过程记录
  问题★★★★6。
  问题1、txtcache缓存功能在最新版本中去除了,为何去除原因未知,作者没说。
  问题2、右侧热门文章,搜索框下搜索推荐,以及专题图文,目前不支持最新的PHP8.0所以一直有现实问题。改为作者目前使用的PHP7.4即可解决问题。
  问题3、AI功能问题已久,百度的文心一言的api和key都填入了,在文章页面也无法总结文章,暂时不清楚哪里的问题,待后续询问作者再解决。

2024.10.23记录

重新汇总待解决问题,以及折腾了几个结果。

★长期-主题不支持PHP8.0的问题,目前暂用PHP7.4,关乎侧边栏热门文章,专题图文,搜索框下拉栏。待解决,技术困难,短时间解决不了。

★长期-其它有不错的插件待加入,需要时间筛选。

★CateFilter首页过滤指定分类,待找替换或最版本插件

★WeChatShare微信分享插件,分享不再出现小图片和简介,大概率是因为微信公众号的问题,好像得认证一下,木得时间,备注一下有时间再看看。

★CommentPush 推送服务,目前改为CommentNotifier泽泽社长的。

★取巧方法,建一个915*1的png透明图片使用在个人广告栏,手机无图失链状态。待后续解决。

★AI功能使用,目前可以生成摘要,使用的chatgpt国内镜像及key,来源于https://github.com/chatanywhere/GPT_API_free相关配置以及KEY填写在主题插件中

对主题的更改2024.10.23
修改了主题样式,将快讯底部原有“填写xxx”等文字删除,并在后台风格样式填写css样式。以及弹幕播放器的样式有边框样式去除。

sidebar.php第27行

<?php  if (!$this->options->aboutme):?><div class="settips">请配置好页面缩略名选项</div><?php  endif; ?>
改为
<?php  if (!$this->options->aboutme):?><div class="settips">正在加载,请稍等...</div><?php  endif; ?>

这样看起来更美观。

后台风格样式处填写

/* 快讯底部居中 */

.settips{text-align: center;}

/* 播放器joe_vplayer去除边框 */

.joe_vplayer{border-width: 0px;}

看了半天,也没解决几个问题,光看各种东西了 。

2024.10.25记录

★长期-主题不支持PHP8.0的问题,目前暂用PHP7.4,关乎侧边栏热门文章,专题图文,搜索框下拉栏。待解决,技术困难,短时间解决不了。

1、没成想这个问题晚上就解决了,晚上在本地使用小皮面板,调用PHP日志就明白的显示

[25-Oct-2024 23:24:49 Asia/Shanghai] PHP Warning:  Undefined variable $html in D:\phpstudy_pro\WWW\usr\themes\spimes\core\theme.php on line 455

提醒我有一个未定义变量$html 这让我有点蒙圈,之前正常写的没问题啊,然后灵光一闪,通过查询php8.0的文档。再对照AI回答,果然。

  • PHP 7.4:未初始化的变量会被自动视为 null,不会抛出警告。
  • PHP 8.0 及更高版本**:未初始化的变量会抛出 Notice 或 Warning,要求开发者显式初始化变量。
    通过显式初始化变量,可以提高代码的健壮性和可维护性,避免潜在的错误。

这结果不就很明显了嘛。
于是果断在主题的\core\theme.php文件中388行和426行补充添加了初始化变量

function 略...{
//搜索 - 热门文章
$sohtml = '';
}
function 略...{
//热门访问量文章
$html = '';
}

完美解决。

剩余待解决的几个问题:

★长期-其它有不错的插件待加入,需要时间筛选。

★CateFilter首页过滤指定分类,待找替换或最版本插件

★WeChatShare微信分享插件,分享不再出现小图片和简介,大概率是因为微信公众号的问题,好像得认证一下,木得时间,备注一下有时间再看看。

★CommentPush 推送服务,目前改为CommentNotifier泽泽社长的。

★取巧方法,建一个915*1的png透明图片使用在个人广告栏,手机无图失链状态。待后续解决。

2024.10.26记录

根据昨日PHP报错修复代码的经验,再重新从日志中调取错误记录,进行修复,在此记录。

[26-Oct-2024 21:19:51 Asia/Shanghai] PHP Warning: Undefined array key "uid" in D:\phpstudy_pro\WWW\usr\themes\spimes\core\get_int.php on line 148

148行代码为

$uid=$_POST["uid"];

解决步骤

  1. 检查数组是否存在 "uid" 键: 在访问数组键之前,先检查该键是否存在于数组中。可以使用 isset 或 array_key_exists 函数来检查。
  2. 提供默认值: 如果键不存在,可以提供一个默认值,以防止程序出错。

所以修改后的是这样


function _getabautor($archive) {
    $archive->response->setStatus(200); 

    // 检查 $_POST["uid"] 是否存在
    if (!isset($_POST["uid"]) || !is_numeric($_POST["uid"])) {
        $archive->response->throwJson(array(
            'sta' => 0,
            'msg' => '无效的用户ID'
        ));
        return;
    }

    $uid = intval($_POST["uid"]); // 转换为整数,确保安全性

    // 获取用户头像
    $imgUrl = getuserimg($uid);

    // 获取用户名
    $getuidname = getuidname($uid);

    // 构建作者信息 HTML
    略……

    // 返回 JSON 响应
$archive->response->throwJson(array('info' => $aurinfo), 200, ['Content-Type' => 'application/json']);
}

其他还有修改的点

输入验证:
检查 $_POST["uid"] 是否存在: 使用 isset 检查 $_POST["uid"] 是否存在。
检查 $_POST["uid"] 是否为数字: 使用 is_numeric 检查 $_POST["uid"] 是否为数字。
返回错误响应: 如果 $_POST["uid"] 不存在或不是数字,返回 JSON 响应并终止函数执行。

安全处理:
转换为整数: 使用 intval 将 $_POST["uid"] 转换为整数,确保安全性。
HTML 转义: 使用 htmlspecialchars 对输出的 HTML 内容进行转义,防止 XSS 攻击。

2024.10.27记录

回忆一下待修改的项目

剩余待解决的几个问题:

★长期-其它有不错的插件待加入,需要时间筛选。

★CateFilter首页过滤指定分类,待找替换或最版本插件

★WeChatShare微信分享插件,分享不再出现小图片和简介,大概率是因为微信公众号的问题,好像得认证一下,木得时间,备注一下有时间再看看。

★CommentPush 推送服务,目前改为CommentNotifier泽泽社长的。

★取巧方法,建一个915*1的png透明图片使用在个人广告栏,手机无图失链状态。待后续解决。

此次修改主要调整个人广告问题。
给主题添加了一个总体开关,决定是否启用个人广告,实际是控制了css是否显示。

functions.php中第300行,添加控制

$grad = new Typecho_Widget_Helper_Form_Element_Select('grad',array('0'=>'显示','-1'=>'不显示'),'0','开启个人广告','注意,这是总控制,非指定用户个人控制。个人广告设置需要进入个人面板内,修改拓展设置中的自定义广告。实例http://cdn.vzhiying.com/vzhiying/uploads/2024/10/687659078.png|https://vzhiying.com/');

    $form->addInput($grad);

第450行添加

$grad->setAttribute('class', 'j-setting-content j-setting-ads');


在post.php中添加102行

<!--个人广告-->

                <?php  echo  myadsee($this->author->uid); ?>

                <!--个人广告控制-->

                <?php  $gradOption = htmlspecialchars((filter_var($this->options->grad, FILTER_VALIDATE_INT) === false ? '-1' : $this->options->grad), ENT_QUOTES, 'UTF-8'); ?>

                <script>document.addEventListener("DOMContentLoaded", function() { var  gradOption = '<?php  echo  $gradOption; ?>'; document.querySelector('.myadimg').style.display = (gradOption === '-1') ? 'none' : ''; });</script>

在逐步检查过程中,在非admin用户主页,出现F12控制台报错发现
Uncaught TypeError: Cannot read properties of null (reading 'getElementsByTagName')
然后在复现问题时,发现不登录状态,admin也会出现这个报错。

修复

var $box = document.getElementById('pic_box');
var $li = $box.getElementsByTagName('li');
var index = 0;
for(var i=0;i<$li.length;i++){
$li[i].index=i;
$li[i].onclick=function(){
$li[index].style.borderRadius="15%";
this.style.borderRadius="50%";
index = this.index;
}


修改为


window.onload = function() {
 var  $box = document.getElementById('pic_box');
 if ($box) {
 var  $li = $box.getElementsByTagName('li');
 var  index = 0;
 for (var  i = 0; i < $li.length; i++) {
 $li[i].index = i;
 $li[i].onclick = function() {
 $li[index].style.borderRadius = "15%";
 this.style.borderRadius = "50%";
 index = this.index;
            };
        }
} else {
 //非本人登录用户不能修改头像
    }
}

}

确保 JavaScript 代码在 DOM 完全加载后执行,并且在获取不到 pic_box 元素时输出错误信息。这样可以有效避免 Uncaught TypeError: Cannot read properties of null (reading 'getElementsByTagName') 错误。

WeChatShare插件在PHP8.0主题spimes下的编辑器页面底部PHP报错
修改插件Plugin.php文件136行

$cid = isset($match[1]) ? $match[1] : ''; //修复编辑器页面底部php报错

$data = '略…… value="'.$cid.'"></form>';
//修复编辑器页面底部php报错value="'.$match['1'].'"改为value="'.$cid.'"

★微信插件待解决,文章内容无法获取,也许是编辑器问题

2024.10.31记录

微信分享插件修改,原PHP7.4报错,在编辑页面提示Warning: Undefined array key

具体来说,问题出现在以下代码段:

$cid_res = preg_match('/cid=(\d+)/', $_SERVER['REQUEST_URI'], $match);

如果正则表达式没有匹配到任何结果,$match 数组将为空,因此 $match[1] 会触发 Undefined array key 1 警告。

为了兼容 PHP 8.0,可以在访问数组键之前进行检查,确保键存在。以下是修复后的代码:

### 关键修改点

1.  **检查 `$match[1]` 是否存在**:

    `if ($cid_res && isset($match[1])) {`

2.  **在隐藏输入字段中使用三元运算符确保 `$match[1]` 存在**:

    `<input  type="hidden"  name="cid"  value="<?php  echo  isset($match[1])  ?  $match[1]  :  '';  ?>">`

通过这些修改,代码在 PHP 8.0 中运行时将不再触发 `Undefined array key` 警告。

2024.11.06记录

站点地图出现问题
站点地图可读取,但存在错误
命名空间不正确1处
您的站点地图或站点地图索引文件未能正确声明命名空间。
示例 第2行 标记:urlset
改之前

// 生成地图

function getxml(){

        $doc = new \DOMDocument('1.0','utf-8');//引入类并且规定版本编码

        $urlset = $doc->createElement("urlset");//创建节点 

        $db = Typecho_Db::get();

        $result = $db->fetchAll($db->select()->from('table.contents')

        ->where('status = ?','publish')

        ->where('type = ?', 'post')

        ->where('created <= unix_timestamp(now())', 'post') //添加这一句避免未达到时间的文章提前曝光

        ->limit(100)

        ->order('created', Typecho_Db::SORT_DESC)

        );

        if($result){

        foreach($result as $val){            

            $val = Typecho_Widget::widget('Widget_Abstract_Contents')->push($val);

            $permalink = $val['permalink'];

            $created = date('Y-m-d', $val['created']);   

        /*循环输出节点*/        

        $url = $doc->createElement("url");//创建节点  

$loc = $doc->createElement("loc");//创建节点

$lastmod = $doc->createElement("lastmod");//创建节点

$urlset->appendChild($url);//

        $url->appendChild($loc);//讲loc放到url下

$url->appendChild($lastmod );

        $content = $doc -> createTextNode($permalink);//设置标签内容

        $contime = $doc -> createTextNode($created);//设置标签内容

        $loc  -> appendChild($content);//将标签内容赋给标签

$lastmod  -> appendChild($contime);//将标签内容赋给标签    

        }}

        $doc->appendChild($urlset);//创建顶级节点

        $doc->save("./../sitemap.xml");//保存代码

        echo "<script>alert('地图生成')</script>";

}

改之后

// 生成地图

function getxml(){

    $doc = new \DOMDocument('1.0', 'utf-8'); // 引入类并且规定版本编码

    $urlset = $doc->createElement("urlset", ""); // 创建节点并声明命名空间

    $urlset->setAttribute("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9"); // 声明命名空间

    $db = Typecho_Db::get();

    $result = $db->fetchAll($db->select()->from('table.contents')

        ->where('status = ?', 'publish')

        ->where('type = ?', 'post')

        ->where('created <= unix_timestamp(now())', 'post') // 添加这一句避免未达到时间的文章提前曝光

        ->limit(100)

        ->order('created', Typecho_Db::SORT_DESC)

    );

    if ($result) {

        foreach ($result as $val) {            

            $val = Typecho_Widget::widget('Widget_Abstract_Contents')->push($val);

            $permalink = $val['permalink'];

            $created = date('Y-m-d', $val['created']);   

            /* 循环输出节点 */        

            $url = $doc->createElement("url"); // 创建节点  

            $loc = $doc->createElement("loc"); // 创建节点

            $lastmod = $doc->createElement("lastmod"); // 创建节点

            $content = $doc->createTextNode($permalink); // 设置标签内容

            $contime = $doc->createTextNode($created); // 设置标签内容

            $loc->appendChild($content); // 将标签内容赋给标签

            $lastmod->appendChild($contime); // 将标签内容赋给标签

            $url->appendChild($loc); // 将 loc 放到 url 下

            $url->appendChild($lastmod); // 将 lastmod 放到 url 下

            $urlset->appendChild($url); // 将 url 放到 urlset 下

        }

    }

    $doc->appendChild($urlset); // 创建顶级节点

    $doc->save("./../sitemap.xml"); // 保存代码

    echo "<script>alert('地图生成')</script>";

}
如果觉得我的文章对你有用,请随意赞赏