时至今日,终于没忍住,想折腾一下,于是将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记录
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"];
解决步骤
- 检查数组是否存在
"uid"
键: 在访问数组键之前,先检查该键是否存在于数组中。可以使用isset
或array_key_exists
函数来检查。 - 提供默认值: 如果键不存在,可以提供一个默认值,以防止程序出错。
所以修改后的是这样
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>";
}