标签 typecho 下的文章

typecho附件页面可以评论,那么如何找到别人的附件页面地址呢?

前言typecho的附件其实和文章性质一样,附件也有单独的页面,也可以进行评论,附件页面的地址格式如https://qqdie.com/attachment/1293/,1293就是附件的id,其实文章id和附件id是同一个东西,所以有的时候发布文章时id,文章id并不连贯。typecho的附件页面除了管理员外,其他人不能直接找到附件页面,那么怎么做可以找到别人的附件页面,然后进行评论,皮一下呢?答案是用php让php访问从id为1的页面访问,如https://qqdie.com/attachment/1/,如果返回状态404,那么id+1继续访问,直到访问到非404的地址,然后输出该地址,跳出for循环。<?php header('content-type:text/html;charset=utf-8'); for($i=1;$i<300;$i++){ $url = 'https://域名/attachment/'.$i; $headers = get_headers($url); if (strpos($headers[0], '404')) {echo $i;}else{ echo '<br>他的附件页面地址为<br>'.$url;break; } } ?>上述代码中$i就是代表id的,可以看出来我写的是循环到300,就是怕超时,如果300还没出来,就改下i的默认值和,循环变量在跑一遍...[谁让我是渣渣呢!]【部分人开了debug模式,即使不存在的页面也不是404状态,这样的网站就没办法了!】模板作者如何关闭附件页面的评论功能呢答案是用if判断下,如果是附件页面就不输出评论框,并显示提示文字“附件页面禁止评论”<?php if ($this->is('attachment')) : ?><h4 class="comment-close">附件页面禁止评论</h4> <?php else: ?>你的评论框代码部分<?php endif; ?>嗯我已经去了https://get233.com/, https://i.chainwon.com/, https://www.helingqi.com/, https://blog.qwq.moe/, https://www.jimoe.cn/ 这些人的附件页面皮了下。ヽ(✿゚▽゚)ノ后续该文章发布后当晚我就想能不能纯前端的实现这个呢,于是弄了一晚上,然后刚刚做了个视频演示,欢迎大家前去投币:https://www.bilibili.com/video/av2572471...

阅读文章
typecho模板设置数据备份与恢复

typecho模板设置数据会在你换模板的时候被清空,这样的设置其实我还是蛮喜欢的,不会有数据残留。然而WP用户转到typecho后跟我抱怨,说模板换成别的然后再切换回来,之前设置好的数据都没了,希望我在yodu模板上动动手脚解决这个问题。然而我是有些迟疑的,东西不是你说做我就要做的,我必须试一下...否则答应太快又搞不出来,岂不是很难受!不过既然发了这篇文章,就说明已经搞定了代码在themeConfig($form)函数里添加$db = Typecho_Db::get(); $sjdq=$db->fetchRow($db->select()->from ('table.options')->where ('name = ?', 'theme:Yodu')); $ysj = $sjdq['value']; if(isset($_POST['type'])) { if($_POST["type"]=="备份模板数据"){ if($db->fetchRow($db->select()->from ('table.options')->where ('name = ?', 'theme:Yodubf'))){ $update = $db->update('table.options')->rows(array('value'=>$ysj))->where('name = ?', 'theme:Yodubf'); $updateRows= $db->query($update); echo '<div class="tongzhi">备份已更新,请等待自动刷新!如果等不到请点击'; ?> <a href="<?php Helper::options()->adminUrl('options-theme.php'); ?>">这里</a></div> <script language="JavaScript">window.setTimeout("location=\'<?php Helper::options()->adminUrl('options-theme.php'); ?>\'", 2500);</script> <?php }else{ if($ysj){ $insert = $db->insert('table.options') ->rows(array('name' => 'theme:Yodubf','user' => '0','value' => $ysj)); $insertId = $db->query($insert); echo '<div class="tongzhi">备份完成,请等待自动刷新!如果等不到请点击'; ?> <a href="<?php Helper::options()->adminUrl('options-theme.php'); ?>">这里</a></div> <script language="JavaScript">window.setTimeout("location=\'<?php Helper::options()->adminUrl('options-theme.php'); ?>\'", 2500);</script> <?php } } } if($_POST["type"]=="还原模板数据"){ if($db->fetchRow($db->select()->from ('table.options')->where ('name = ?', 'theme:Yodubf'))){ $sjdub=$db->fetchRow($db->select()->from ('table.options')->where ('name = ?', 'theme:Yodubf')); $bsj = $sjdub['value']; $update = $db->update('table.options')->rows(array('value'=>$bsj))->where('name = ?', 'theme:Yodu'); $updateRows= $db->query($update); echo '<div class="tongzhi">检测到模板备份数据,恢复完成,请等待自动刷新!如果等不到请点击'; ?> <a href="<?php Helper::options()->adminUrl('options-theme.php'); ?>">这里</a></div> <script language="JavaScript">window.setTimeout("location=\'<?php Helper::options()->adminUrl('options-theme.php'); ?>\'", 2000);</script> <?php }else{ echo '<div class="tongzhi">没有模板备份数据,恢复不了哦!</div>'; } } if($_POST["type"]=="删除备份数据"){ if($db->fetchRow($db->select()->from ('table.options')->where ('name = ?', 'theme:Yodubf'))){ $delete = $db->delete('table.options')->where ('name = ?', 'theme:Yodubf'); $deletedRows = $db->query($delete); echo '<div class="tongzhi">删除成功,请等待自动刷新,如果等不到请点击'; ?> <a href="<?php Helper::options()->adminUrl('options-theme.php'); ?>">这里</a></div> <script language="JavaScript">window.setTimeout("location=\'<?php Helper::options()->adminUrl('options-theme.php'); ?>\'", 2500);</script> <?php }else{ echo '<div class="tongzhi">不用删了!备份不存在!!!</div>'; } } } echo '<form class="protected" action="?yodubf" method="post"> <input type="submit" name="type" class="btn btn-s" value="备份模板数据" />&nbsp;&nbsp;<input type="submit" name="type" class="btn btn-s" value="还原模板数据" />&nbsp;&nbsp;<input type="submit" name="type" class="btn btn-s" value="删除备份数据" /></form>';然后将里面出现的所有“yodu”改成你的模板目录的名字,如果拿不准就去数据库里看看模板的值名字。备份当用户点击备份时,先判断是否已经存在备份,如果不存在就插入一条新的数据,数据name为yodubf,value为模板原本的数据。此时就存在了一条备份数据。如果再次点击备份按钮会发生什么呢?会触发更新数据的语句,就是读取模板的设置数据,然后将备份的模板数据更新。还原当用户点击还原按钮时,会判断是否存在备份,如果不存在就发出提示说不存在数据无法恢复;如果存在,就会进行一个反向的更新操作,将备份的数据更新到模板默认设置数据。这个操作完成后会触发个小问题,比较影响体验的。就是在点击还原按钮时网页是先刷新后执行php还原语句的,也就是说还原完成后,你看到的模板设置页面数据并没有还原,但是实际数据库里面已经还原好了的,这一点很影响体验。于是乎,我鸡贼的弄了个js自动刷新语句,并发出提示文字,这样一下子就友好多了,注意文章中代码方面我并未给出css样式,所以美观度上需要自行优化。删除删除就简单了,判断是否存在备份,不存在就告诉用户不用删了,你压根就没有备份数据,如果有备份就执行删除语句,发出提示。一些没用的说明1,其实这东西应该可以写成懒人版的,模板名字什么的用php获取下,就不用我这样写死了,但是当时我处于试一试的心态写的,所以就能简单就简单了,现在又懒得弄了,要不是为了水文,这个我都懒得贴出来。2,别看文章中代码这么乱,条例就不清晰,其实我当时找了张纸写的逻辑然后才按照顺序一步一步的写的,也测试了很多回。3,最开始想写自动还原模板数据来着,就是检测到模板启用就自动还原曾经的备份数据,然而当时想不通如果去判断模板启用。4,当你想将本文章代码投入使用时,最好再测试博客进行测试,以免伤害你的数据库,同时建议测试时打开数据库管理页面,观看数据库对应表的...

阅读文章
typecho同一个页面下调用不同分类的文章但是却只显示一个分类文章

问题描述:同页面调用分类下文章,只显示一第一个分类下的文章在一个页面中,反复调用下面这段代码,获取不同mid分类下的文章,只显示第一次调用此方法获得的数据,其他分类也是显示第一次调用的数据。<?php $this->widget('Widget_Archive@index', 'pageSize=6&type=category', 'mid=1')->to($new); ?> <?php while ($new->next()): ?> <a href="<?php $new->permalink(); ?>"><?php $new->title(); ?></a> <?php endwhile; ?>一些啰嗦的话这个问题其实我也遇到过,因为typecho文档真的很有限,也没找到方法,后来自己瞎折腾就搞明白了。然后这个问题不止一个两个人问过我,而且还有些不认识我的人在论坛提问,所以不如水篇文章,网络分享,全世界可见,这次是互联网意义哈。解决方法代码中@index就是关键。调用不同分类,这个@部分不同就行了,比如你调用两个不同的分类文章,mid分别为1和2,那么代码就这样写分类一 <?php $this->widget('Widget_Archive@index', 'pageSize=6&type=category', 'mid=1')->to($new); ?> <?php while ($new->next()): ?> <a href="<?php $new->permalink(); ?>"><?php $new->title(); ?></a> <?php endwhile; ?> 分类二 <?php $this->widget('Widget_Archive@qqdie', 'pageSize=6&type=category', 'mid=2')->to($new); ?> <?php while ($new->next()): ?> <a href="<?php $new->permalink(); ?>"><?php $new->title(); ?></a> <?php endwhile; ?&g...

阅读文章
typecho基于material design风格的简洁主题(bytecats3.0)

模板来源:http://forum.typecho.org/viewtopic.php?f=5&t=8132模板作者:http://www.bytecats.com/【死链了】因为原作者写的bytecats2.0模板没有集成原生评论(当时说用多说的),而本博主小白时用的第一个第三方开发的主题就是这个。所以今天突然想把这个模板的短板弥补上,于是简单的弄了下。模板介绍:一点点谷歌的material design风格,内置5组不同皮肤。完善了移动端的响应式布局。文章缩略内容请使用默认编辑器的文章摘要分割器更新内容如下:1,原生评论加入2,文章阅读次数功能由依赖插件改为模板实现3,评论回复楼层最高999【不限制】4,头像源改为国内的,qq邮箱显示qq头像5,评论列表“博主”标志使用方法:1,下载压缩包2,将压缩包解压到模板目录3,程序后台启用模板4,打开模板设置简单设置一下[btn url="https://www.lanzous.com/i5kg7cf"]下载主题[/btn] 其他说明:模板底部版权链接依旧是原作者的链接,模板后台列表我改成了本文链...

阅读文章
typecho弹出find Input author error怎么回事

大多数报错的起因就是因为,有些模板归档页面的评论功能被阉割掉了于是导致一些评论验证功能的插件爆这个错误。解决方法有以下两种1,编辑这些没有评论功能的页面,高级设置,关闭评论,然后发布文章。2,找到你的评论验证的插件,关闭该项过滤功能,比如commentfilter插件设置第一项屏蔽机器人评论,选择无动作,保存设置即可。3,直接将代码里的 echo" find input author error" 删除即可。使用notepad++或者sublime 可以全目录检索,直接搜到这串代码弹出这个还有一种不常见的原因,那就是模板评论地方书写有问题。这个解决方法就是弹模板作者小下体【或者同上文方...

阅读文章
Typecho-Fusionapp插件

插件项目地址:https://github.com/jrotty/Typecho-Fusionappfusion app下载地址:https://www.coolapk.com/apk/cn.coldsong.fusionappTypecho-Fusionapp为Fusion app定制专属的typecho皮肤使用方法1,将TypechoFusion文件夹传到typecho插件目录下,然后打开网站后台启用插件2,安卓手机端打开fusion app自定义ua处填写包含fusion字符的ua信息3,然后就可以用fusion app定制自己的博客客户端啦!虽然并没有什么意义2334,皮肤接口:在网址后面加入"?theme=皮肤名字",就会加载style文件夹下的css样式文件,比如加入"?theme=night"就会引入默认的夜间模式皮肤(加载style下的night.css)【插件版本需要1.1.1以上】功能说明1,文章无限滚动加载,接地气2,缩略图功能,显示文章首图,没图的话会随机显示内置的二次元图片(500张)3,模板简洁,无css框架4,支持原生评论5,加载了jq,方便fusion app使用js调试6,评论头像使用gravatar.loli.net源,且对于qq邮箱用户显示qq头像7,避免pc端插件影响,去除了前端插件接口,不过针对Meting插件开放成品demohttps://qqdie.com/areyouok/qqdie1.4.5.apk最新demo:https://www.lanzous.com/i2x37...

阅读文章
《Typecho 那些事(上)》观后感

joyqi之前做了个直播《Typecho 那些事(上)》,此篇文章就是记录下直播内容,为啥写成观后感呢,因为感觉这样写好像更小学生一点,记得小学时看个电影都会被要求写观后感,被强制看本书都要写读后感,然后假装看了书假装有感而发。typecho官方读法type echo这两个单词合起来的读法,读音:太拍~扣常量用于改变typecho的功能或者自定义一些功能1,TYPECHO_DEBUG做第三方开发必须打开的,报错信息会更加详细,方便找到开发错误点。用法在config.inc.php最后面插入define('__TYPECHO_DEBUG__', true);2,TYPECHO_ADMIN_DIR后台路径定义,用于修改程序后台地址,提高安全性。用法typecho默认后台地址是admin,如果我们想改成typecho-admin,那么首先登陆服务器把admin文件夹名字改成typecho-admin。然后在config.inc.php找到define('__TYPECHO_ADMIN_DIR__', '/admin/');将其中的admin改成typecho-admin即可。3,TYPECHO_UPLOAD_DIRTYPECHO_UPLOAD_URL可以单独定义一个不在typecho下的附件上传地址存储到这里有什么用呢?在config.inc.php最后面插入define('__TYPECHO_UPLOAD_DIR__', '/www/static'); define('__TYPECHO_UPLOAD_URL__', 'https://xxxxx.upyun.com');你可以给他单独一个反向代理,就是cdn,七牛,又拍云等cdn可以访问到的地址,然后通过反向代理把你这个路径抓取的,抓取过去后,你那前面的展示地址就可以换成你的cdn地址了,比如上述代码中https://xxxxx.upyun.com。4,TYPECHO_SECUER当你用https的时候typecho会自动识别的,但是因为大家的环境千差万别,会有识别错误的情况,比如你https都布置好了,但是程序依旧只会加载http的,所以该常量的作用就是强制程序使用https,解决识别错误的情况。用法在config.inc.php最后面插入define('__TYPECHO_SECUER__', true);5,TYPECHO_GRAVATR_PREFIXtypecho用的GRAVATR的公共头像地址,GRAVATR的服务器在美国,虽然它在全世界做镜像,但是在国内依旧很慢。然后发现有国内有很多人为其做反向代理,把头像缓存到本地,来提高速度,以前大家可能会使用插件来替换typecho的GRAVATR的默认地址,实际上不需要,我们用这个常量就可以了,比如我们替换成https://gravatar.cat.net/avatar/,用法如下用法在config.inc.php最后面插入define('__TYPECHO_GRAVATR_PREFIX__', 'https://gravatar.cat.net/avatar');这样一来typecho就会替换成https://gravatar.cat.net/avatar/渠道的头像地址。【有些模板可能不支持】皮肤1,引用皮肤其他部分比如header,footer时用$this->need('xxx'),而不是用php的require,includ,因为this need时typecho本身的方法,他会去做一些判断,文件,路径,是否存在等等。2,head末尾别忘加$this->header()body末尾别忘加$this->footer()主要用于插件引用前端资源,比如js。3,单独自定义皮肤给某个分类自定义皮肤在模板文件夹下,建立文件夹category,然后在里面放置一个php文件,名字为分类缩略名.php,然后里面的内容就是你想要自定义的皮肤。给某个独立页面自定义皮肤在模板文件夹下,建立文件夹page,然后在里面放置一个php文件,名字为缩略名.php,然后里面的内容就是你想要自定义的皮肤。给某篇文章自定义皮肤在模板文件夹下,建立文件夹post,然后在里面放置一个php文件,名字为文章id.php,然后里面的内容就是你想要自定义的皮肤。4,为皮肤定制自定义变量typecho内置的东西,可以在制作模板的时候为每个文章定义好一个自定义字段,方便模板去调用。用法在functions.php中加入下面代码function themeFields($layout) { $thumb = new Typecho_Widget_Helper_Form_Element_Text('thumb', NULL, NULL, _t('自定义缩略图'), _t('输入缩略图地址(仅文章有效)')); $layout->addItem($thumb); }插件Widget全局钩子看原作者文章介绍吧https://joyqi.com/typecho/iplocation-plugin.htmlDB什么的缓存巴拉巴拉~听不懂啦备份功能typecho已经有自带的备份功能了,这个功能时基于2进制,有跨平台性,也就是说,即使你服务器搬家数据库环境不一致,用这个备份导入也ok。未来计划1.1版本的发布(已完成)1.1之后的下一版会加入一个更大的功能___市场,工作量比较大,之后大家可以在市场里发布自己的插件,皮肤等。也可能做收费的渠道,能够给第三方开发者赚点外快。市场上线时间?没有准确时间,1.1版本发布会就会投入开发感想直播感觉准备不足哈,因为我是看的录播,开1.5倍播放速度才好些,不过也十分感谢作者大大啦,期待下...

阅读文章
Live2D看板娘来了!typecho插件

没错,这是一篇水文(逃其实早想加了的,不过懒,最近在小白-白那看到了WordPress版插件,便开始动手了(移植)。emmm 原作折腾过程我就不多说了,参考原文:https://www.fczbl.vip/946.html说说我的折腾过程,其实很简单,下载WordPress版插件,将资源全部上传,然后把index.php改成对应typecho的Plugin.php测试->报错->修改->报错->修改-...->修改->功能正常了!于是下一步,将原作者的超链接什么的改成我的,捂脸额,发现还有个一言api没有改成我的,还好我也有现成的api,改,完美。1:1移植完成,手机端会隐藏哦,WordPress也是哈!下载地址如下typecho版插件:https://pan.baidu.com/s/1QfV4-LsOb0zZd8pbdTw8PAtypecho版本不维护了,不过大家可以去这个地址下载类似的插件https://paugram.com/coding/add-poster-girl-with-plugin.htmlWordPress插件(22&33):https://www.fczbl.vip/946.html使用方法下载压缩包解压上传至站点 /usr/plugins 目录下,并将文件夹重命名为l2d233登录后台启用点击设置根据需要勾选2018年7月7日维护1,修复不显示问题2,一言接口调整,旧版地址...

阅读文章
typecho显示用户文章总数量

之前写过类似文章《typecho 显示当前作者文章总数量》,但是实现方法明显不太好。所以今天写个函数来获取吧!在functions.php中加入如下函数function allpostnum($id){ $db = Typecho_Db::get(); $postnum=$db->fetchRow($db->select(array('COUNT(authorId)'=>'allpostnum'))->from ('table.contents')->where ('table.contents.authorId=?',$id)->where('table.contents.type=?', 'post')); $postnum = $postnum['allpostnum']; return $postnum; }显示当前作者文章总数量调用代码如下(适用于post.php,author.php,或者index.phpwhile循环中等等)<?php echo allpostnum($this->author->uid); ?>显示特定uid作者文章总数量调用代码如下(适用于任意模板文件)<?php echo allpostnum(1); ?> //数字1改成对应作者的uid即可之前不写函数是以因为我不会哈,昨天研究下数据库,发现这玩意没那么复杂,挺有趣的233!代码解析$db = Typecho_Db::get(); //获取数据库 $postnum=$db->fetchRow($db->select(array('COUNT(authorId)'=>'allpostnum'))->from ('table.contents')->where ('table.contents.authorId=?',$id)->where('table.contents.type=?', 'post')); //按条件查询数据,将符合结果的条数生成一个数组 //print_r($postnum);取消注释可调试显示结果 $postnum = $postnum['allpostnum']; //获取作者文章总数量 return $postnum; //返回作者文章总数量,用return能够更加方便的处理事情感谢感谢远.山教我用COUNT语法直接可以返回符合结果的数量,提高代码效...

阅读文章
Typecho非插件实现文章置顶功能

其实在写themia模板时,就用了个非插件的文章置顶功能,然而那个代码不能置顶文章内容,只能置顶标题,而且代码比较繁琐。而后最近看到隔壁友链写了个《Typecho非插件文章置顶》,于是我对此进行了转载并做了点修改弥补一些需求!他是根据 Sticky插件 文章置顶插件写的代码,所以看上去挺像的。步骤一在 index.php 的 $this->title(); 前面加上 $this->sticky();可出现这段 html. 例: <h2 class="title"><a href="<?php $this->permalink() ?>"><?php $this->sticky(); $this->title() ?></a></h2>步骤二下面代码放在主题下index.php中:/** 文章置顶 */ $sticky = '1'; //置顶的文章cid,按照排序输入, 请以半角逗号或空格分隔 if($sticky && $this->is('index') || $this->is('front')){ $sticky_cids = explode(',', strtr($sticky, ' ', ','));//分割文本 $sticky_html = "<span style='color:red'>[置顶] </span>"; //置顶标题的 html $db = Typecho_Db::get(); $pageSize = $this->options->pageSize; $select1 = $this->select()->where('type = ?', 'post'); $select2 = $this->select()->where('type = ? && status = ? && created < ?', 'post','publish',time()); //清空原有文章的列队 $this->row = []; $this->stack = []; $this->length = 0; $order = ''; foreach($sticky_cids as $i => $cid) { if($i == 0) $select1->where('cid = ?', $cid); else $select1->orWhere('cid = ?', $cid); $order .= " when $cid then $i"; $select2->where('table.contents.cid != ?', $cid); //避免重复 } if ($order) $select1->order(null,"(case cid$order end)"); //置顶文章的顺序 按 $sticky 中 文章ID顺序 if ($this->_currentPage == 1) foreach($db->fetchAll($select1) as $sticky_post){ //首页第一页才显示 $sticky_post['sticky'] = $sticky_html; $this->push($sticky_post); //压入列队 } $uid = $this->user->uid; //登录时,显示用户各自的私密文章 if($uid) $select2->orWhere('authorId = ? && status = ?',$uid,'private'); $sticky_posts = $db->fetchAll($select2->order('table.contents.created', Typecho_Db::SORT_DESC)->page($this->_currentPage, $this->parameter->pageSize)); foreach($sticky_posts as $sticky_post) $this->push($sticky_post); //压入列队 $this->setTotal($this->getTotal()-count($sticky_cids)); //置顶文章不计算在所有文章内 }这个东西输入文字cid整合到模板设置里,想必也是极好的!!!那么如何做呢?上文中$sticky = '1';改为$sticky = $this->options->sticky;,然后在functions.php中添加如下代码即可 $sticky = new Typecho_Widget_Helper_Form_Element_Text('sticky', NULL,NULL, _t('文章置顶'), _t('置顶的文章cid,按照排序输入, 请以半角逗号或空格分隔')); $form->addInput($sticky);泽泽的修改记录2018.2.281,昨天和作者沟通,作者说被置顶的文章文章列表里就不会再显示了,这个本来是个挺好的处理方式,但是今天我想到了它有个小问题,就是被置顶文章分类页面或者搜索页面也不会显示出来了,这个就不太好了,于是特此修复下!2018.2.271,置顶的文章只会对首页生效,不会对分类页面生效。2,文章cid输入方式改为和Sticky插件一样,即在注释部分输入需要置顶文章的cid按照排序输入, 请以半角逗号或空格分隔。原作者的更新记录2018.2.61,登录时,显示用户各自的私密文章2018.2.71,隐藏定时发送的文章文章代码转自:https://www.littlehands.site/archives/typecho_sticky.ht...

阅读文章
至顶至底(雷姆拉姆)Typecho插件

网页左右下角分别是拉姆和雷姆,点击就会触发至顶至底功能,插件需要加载 jquery。插件介绍加载插件后,页面左右下角出现拉姆和雷姆,点击就会触发至顶和至底功能。Typecho插件:https://www.mfeng.cc/archives/2018/02/17/Typecho_Top_LamuLeimu.htmlz-blog 插件:https://qqdie.com/archives/top-to-bottom-rem-ram-zblog-plugin.htmlWordPress插件:https://qqdie.com/archives/top-to-bottom-rem-ram-wp-plugin.htmlemlog 插件:https://qqdie.com/archives/top-to-bottom-rem-ram-emlog-plugin.htmlDISCUZ插件:https://dyedd.cn/40.html( http://addon.discuz.com/?@dye_tbm.plugin )其实typecho版本我也想自己写来着,结果被人抢先水文了233。不过即使被别人抢先了,我觉得也水下!效果图吐槽新的水文素材完结了233!!!最近安装了emlog,z-blog,wp用来研究,我发现emlog写起来简单,但是插件设置我不会写233。(没有深入太多的了解,嘻嘻...

阅读文章
WordCount一个typecho文章字数计数插件

WordCount一个typecho文章字数统计插件插件简述:文章字数计算器,实时计算: 字数等于文字数量加数字数量; 字符数量就是字符数量; 文字字数包含中日韩文字; 符号数量会过滤掉空格和回车; 字母数量等于大小写字母; 数字即0-9。小问题:对于编辑器插入的图片地址或者链接地址也会算入进去最新版插件已解决,同时一些不常用符号也会被当成文字进行计算下载地址:https://github.com/jrotty/WordCount效果演示如图:当然如果你不想用插件也想要这种功能,可以通过修改模板文件来实现在模板functions.php中加入以下代码即可【代码来自WordCount插件1.1版,后续插件升级的话文章这里并不会做修改】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() { ?> <style> .field.is-grouped{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start; -ms-flex-wrap: wrap;flex-wrap: wrap;}.field.is-grouped>.control{-ms-flex-negative:0;flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:.5rem;margin-right:.75rem}.field.is-grouped>.control.is-expanded{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.field.is-grouped.is-grouped-right{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.field.is-grouped.is-grouped-multiline{-ms-flex-wrap:wrap;flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}.tags{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.tags .tag{margin-bottom:.5rem}.tags .tag:not(:last-child){margin-right:.5rem}.tags:last-child{margin-bottom:-.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.has-addons .tag{margin-right:0}.tags.has-addons .tag:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.tags.has-addons .tag:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.tag{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#f5f5f5;border-radius:3px;color:#4a4a4a;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;font-size:.75rem;height:2em;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;line-height:1.5;padding-left:.75em;padding-right:.75em;white-space:nowrap}.tag .delete{margin-left:.25em;margin-right:-.375em}.tag.is-white{background-color:#fff;color:#0a0a0a}.tag.is-black{background-color:#0a0a0a;color:#fff}.tag.is-light{background-color:#fff;color:#363636}.tag.is-dark{background-color:#363636;color:#f5f5f5}.tag.is-primary{background-color:#00d1b2;color:#fff}.tag.is-info{background-color:#3273dc;color:#fff}.tag.is-success{background-color:#23d160;color:#fff}.tag.is-warning{background-color:#ffdd57;color:rgba(0,0,0,.7)}.tag.is-danger{background-color:#ff3860;color:#fff}.tag.is-large{font-size:1.25rem}.tag.is-delete{margin-left:1px;padding:0;position:relative;width:2em}.tag.is-delete:after,.tag.is-delete:before{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);-webkit-transform-origin:center center;transform-origin:center center}.tag.is-delete:before{height:1px;width:50%}.tag.is-delete:after{height:50%;width:1px}.tag.is-delete:focus,.tag.is-delete:hover{background-color:#e8e8e8}.tag.is-delete:active{background-color:#dbdbdb}.tag.is-rounded{border-radius:290486px} </style> <script language="javascript"> var EventUtil = function() {}; EventUtil.addEventHandler = function(obj, EventType, Handler) { if (obj.addEventListener) { obj.addEventListener(EventType, Handler, false); } else if (obj.attachEvent) { obj.attachEvent('on' + EventType, Handler); } else { obj['on' + EventType] = Handler; } } if (document.getElementById("text")) { EventUtil.addEventHandler(document.getElementById('text'), 'propertychange', CountChineseCharacters); EventUtil.addEventHandler(document.getElementById('text'), 'input', CountChineseCharacters); } function showit(Word) { alert(Word); } function CountChineseCharacters() { Words = document.getElementById('text').value; var W = new Object(); var Result = new Array(); var iNumwords = 0; var sNumwords = 0; var sTotal = 0; var iTotal = 0; var eTotal = 0; var otherTotal = 0; var bTotal = 0; var inum = 0; var znum = 0; var gl = 0; var paichu = 0; for (i = 0; i < Words.length; i++) { var c = Words.charAt(i); if (c.match(/[\u4e00-\u9fa5]/) || c.match(/[\u0800-\u4e00]/) || c.match(/[\uac00-\ud7ff]/)) { if (isNaN(W[c])) { iNumwords++; W[c] = 1; } iTotal++; } } for (i = 0; i < Words.length; i++) { var c = Words.charAt(i); if (c.match(/[^\x00-\xff]/)) { if (isNaN(W[c])) { sNumwords++; } sTotal++; } else { eTotal++; } if (c.match(/[0-9]/)) { inum++; } if (c.match(/[a-zA-Z]/)) { znum++; } if (c.match(/[\s]/)) { gl++; } if (c.match(/[ ◕‿↑↓←→↖↗↘↙↔↕。《》、【】“”•‘’❝❞′……—―‐〈〉„╗╚┐└‖〃「」‹›『』〖〗〔〕∶〝〞″≌∽≦≧≒≠≤≥㏒≡≈✓✔◐◑◐◑✕✖★☆₸₹€₴₰₤₳र₨₲₪₵₣₱฿₡₮₭₩₢₧₥₫₦₠₯○㏄㎏㎎㏎㎞㎜㎝㏕㎡‰〒々℃℉ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ]/)) { paichu++; } } document.getElementById('hanzi').innerText = iTotal - paichu; document.getElementById('zishu').innerText = inum + iTotal - paichu; document.getElementById('biaodian').innerText = sTotal - iTotal + eTotal - inum - znum - gl + paichu; document.getElementById('zimu').innerText = znum; document.getElementById('shuzi').innerText = inum; document.getElementById("zifu").innerHTML = iTotal * 2 + (sTotal - iTotal) * 2 + eTotal; } </script> <script> $(document).ready(function(){ $("#wmd-editarea").append('<div class="field is-grouped"><span class="tag">共计:</span><div class="control"><div class="tags has-addons"><span class="tag is-dark" id="zishu">0</span> <span class="tag is-primary">个字数</span></div></div><div class="control"><div class="tags has-addons"><span class="tag is-dark" id="zifu">0</span> <span class="tag is-primary">个字符</span></div></div><span class="tag">包含:</span><div class="control"><div class="tags has-addons"><span class="tag is-light" id="hanzi">0</span> <span class="tag is-danger">个文字</span></div></div><div class="control"><div class="tags has-addons"><span class="tag is-light" id="biaodian">0</span> <span class="tag is-info">个符号</span></div></div><div class="control"><div class="tags has-addons"><span class="tag is-light" id="zimu">0</span> <span class="tag is-success">个字母</span></div></div><div class="control"><div class="tags has-addons"><span class="tag is-light" id="shuzi">0</span> <span class="tag is-warning">个数字</span></div></div></div>'); CountChineseCharacters(); }); </script> <?php } }css和js均扒自http://www.eteste.com/,其中js略有改动为什么突然要写这个插件?因为之前发文章参与活动惨遭字数要求,然后呢,发现typecho编辑器那里并没有实时统计字数的东西,于是为了快速搞出插件就用了扒的方式。本来不做任何修改就可以的并且能很好的识别中文符号,但是我想让他支持日文韩文,结果支持日文后中文的一些符号也会呗当作文字进行计算了,然后一顿瞎改过滤了一些识别错误的常用符号,感觉就可以用了,虽然还是有些符号会被当作文字计算,但是我觉得只要不是常用的标点符号,当作文字计算也没啥毛病,比如以下符号:ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ①②③④⑤⑥⑦⑧⑨⑩⒈⒉⒊⒋ ⒌⒍⒎⒏⒐⒑⑴⑵⑶⑷⑸⑹⑺⑻⑼...

阅读文章
模板层面向typecho编辑器页面插入代码

上篇文章《模板层面向 typecho 编辑器页面插入 css js》中讲到一种向编辑器中插入css的奇葩方式,某些时候那么写确实能解决不少问题。但是但是,文章编辑界面源代码中是加载了jquery的,但是在页面偏底部,而上篇文章中讲到的方法是插在jquery代码之上的,也就是说那种方法如果插入js代码的话,就不能依赖jquery,除非在引用一个。基于以上原因,我又想到中方式,插件的那种方式,经过试验我发现插件上的方法在模板中也完全可以。在模板functions.php中加入以下代码即可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() { ?> 你的css代码或者js代码,js可以依赖jquery来书写 <?php } }例如实现上篇文章《模板层面向 typecho 编辑器页面插入 css js》的代码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() { ?> style>.wmd-button-row {height:auto;}.copyright p:after {content: "YoDu魔法优化中";margin-left: 6px;font-size: 12px;}</style> <?php } }当然这样可玩性就高了,下图展示个我的一个小成果,模板层面向编辑器中加入字数统计功...

阅读文章
模板层面向typecho编辑器页面插入css js

大家都知道在functions.php中加入类似下面的代码,会强行为每个文章(即文章编辑页面)设置一个自定义字段function themeFields($layout) { $thumb = new Typecho_Widget_Helper_Form_Element_Text('thumb', NULL, NULL, _t('自定义缩略图'), _t('描述文字')); $layout->addItem($thumb); }然而经过我大脑灵光一现,想到了个有趣的点子,上面代码中描述文字是支持html格式的,这个其实都是众所周知的事情。那么事情就变得有趣了,我们是否可以通过这个描述文字插入css或者js呢,答案是肯定的。于是代码改成function themeFields($layout) { $thumb = new Typecho_Widget_Helper_Form_Element_Text('thumb', NULL, NULL, _t('自定义缩略图'), _t('输入缩略图地址(仅文章有效)<style>.wmd-button-row {height:auto;}.copyright p:after {content: "YoDu魔法优化中";margin-left: 6px;font-size: 12px;}</style>')); $layout->addItem($thumb); }测试了下完全ojbk,其中.wmd-button-row {height:auto;}是优化编辑器手机端显示不全的问题,另外一行代码.copyright p:after {content: "YoDu魔法优化中";margin-left: 6px;font-size: 12px;}纯粹为了装逼,效果如下js代码没有测试,应该也是ok的,谁有好用的点子,欢迎分享哈!!!虽然方法傻瓜了点,但是我觉得这种奇葩方式挺有趣的2...

阅读文章
判断typecho的版本号

前台用<?php $this->options->Version(); ?>就能输出typecho的版本号,而他的格式是这样的1.1/17.11.151.1是他的版本,而后面的该版本的日期,所以说即使大家都是1.1,后面日期不一样的话你们的程序代码上就会有区别。那么假设你的模板不兼容某个版本的typecho时,为何不做个温馨提示呢?<?php $tver = substr($this->options->->Version , 0 , 3); if($tver>1.0){ echo '该模板可能不兼容大于1.0版本的typecho'; } ?>也可以根据后面的日期进行判断,总之判断完就能搞各种有趣的事情哈。if,if就是博主最擅长的事情哈!在functions.php用$this->options->Version可能没有用,没用的话试试下面这个,应该可以:Typecho_Widget::widget('Widget_Options')->Version或者$options = Helper::options(); $options->version();想到这个的原因也是想给自己模板做个判断智能提示下,实现后就...

阅读文章
Typecho添加AMP支持

文章内容转自https://holmesian.org/typecho-upgrade-AMP,略有修改Typecho至今没有出任何支持AMP的插件或主题,我没去想怎么用插件实现AMP,而是直接通过修改模板的post.php、function.php文件来暴力实现,原则上所有模板都可以用。效果就是在任何一篇博文的url后面加上amp=1即可访问amp版的页面,例如本文的AMP页面,总之实现起来也很简单。具体步骤如下:对模板里的post.php文件做如下修改(后台控制台》外观》编辑当前外观》post.php):<?php if (isset($_GET['amp'])){; ?> <!doctype html> <html amp lang="zh"> <head> <meta charset="utf-8"> <script async src="https://cdn.ampproject.org/v0.js"></script> <title><?php $this->title() ?></title> <link rel="canonical" href="<?php $this->permalink() ?>" /> <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"> <meta name="description" content="<?php $this->description(); ?>" /> <meta name="keywords" content="<?php $this->tags(',', false, 'none'); ?>" /> <script type="application/ld+json"> { "@context": "http://schema.org", "@type": "BlogPosting", "headline": "<?php $this->title(); ?>", "mainEntityOfPage": "<?php $this->permalink() ?>", "author": { "@type": "Person", "name": "<?php $this->author(); ?>" }, "datePublished": "<?php $this->date('F j, Y'); ?>", "dateModified": "<?php $this->date('F j, Y'); ?>", "image": { "@type": "ImageObject", "url": "<?php print_r(get_post_img($this));?>", "width": 700, "height": 400 }, "publisher": { "@type": "Organization", "name": "<?php $this->options->title(); ?>", "logo": { "@type": "ImageObject", "url": "https://qqdie.com/tu/400x400l.png", "width": 200, "height": 200 } }, "description": "<?php $this->excerpt(60, '...'); ?>" } </script> <style amp-custom>*{margin:0;padding:0}html,body{height:100%}body{background:#fff;color:#666;font-size:14px;font-family:"-apple-system","Open Sans","HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,sans-serif}::selection,::-moz-selection,::-webkit-selection{background-color:#2479CC;color:#eee}h1{font-size:1.5em}h3{font-size:1.3em}h4{font-size:1.1em}a{color:#2479CC;text-decoration:none}article{padding:85px 15px 0}article .entry-content{color:#444;font-size:16px;font-family:Arial,'Hiragino Sans GB',冬青黑,'Microsoft YaHei',微软雅黑,SimSun,宋体,Helvetica,Tahoma,'Arial sans-serif';-webkit-font-smoothing:antialiased;line-height:1.8;word-wrap: break-word;word-break: break-all;}article h1.title{color:#333;font-size:2em;font-weight:300;line-height:35px;margin-bottom:25px}article .entry-content p{margin-top:15px}article h1.title a{color:#333;transition:color .3s}article h1.title a:hover{color:#2479CC}article blockquote{background-color:#f8f8f8;border-left:5px solid #2479CC;margin-top:10px;overflow:hidden;padding:15px 20px}article code{background-color:#eee;border-radius:5px;font-family:Consolas,Monaco,'Andale Mono',monospace;font-size:80%;margin:0 2px;padding:4px 5px;vertical-align:middle}article pre{background-color:#f8f8f8;border-left:5px solid #ccc;color:#5d6a6a;font-size:14px;line-height:1.6;overflow:hidden;padding:0.6em;position:relative;white-space:pre-wrap;word-break:break-word;word-wrap:break-word}article table{border:0;border-collapse:collapse;border-spacing:0}article pre code{background-color:transparent;border-radius:0 0 0 0;border:0;display:block;font-size:100%;margin:0;padding:0;position:relative}article table th,article table td{border:0}article table th{border-bottom:2px solid #848484;padding:6px 20px;text-align:left}article table td{border-bottom:1px solid #d0d0d0;padding:6px 20px}article .copyright-info,article .amp-info{font-size:14px}article .expire-tips{background-color:#f5d09a;border:1px solid #e2e2e2;border-left:5px solid #fff000;color:#333;font-size:15px;padding:5px 10px;margin:20px 0px}article .post-info,article .entry-content .date{font-size:14px}article .entry-content blockquote,article .entry-content ul,article .entry-content ol,article .entry-content dl,article .entry-content table,article .entry-content h1,article .entry-content h2,article .entry-content h3,article .entry-content h4,article .entry-content h5,article .entry-content h6,article .entry-content pre{margin-top:15px}article pre b.name{color:#eee;font-family:"Consolas","Liberation Mono",Courier,monospace;font-size:60px;line-height:1;pointer-events:none;position:absolute;right:10px;top:10px}article .entry-content .date{color:#999}article .entry-content ul ul,article .entry-content ul ol,article .entry-content ul dl,article .entry-content ol ul,article .entry-content ol ol,article .entry-content ol dl,article .entry-content dl ul,article .entry-content dl ol,article .entry-content dl dl,article .entry-content blockquote > p:first-of-type{margin-top:0}article .entry-content ul,article .entry-content ol,article .entry-content dl{margin-left:25px}.header{background-color:#fff;box-shadow:0 0 40px 0 rgba(0,0,0,0.1);box-sizing:border-box;font-size:14px;height:60px;padding:0 15px;position:absolute;width:100%}.footer{font-size:.9em;padding:15px 0 25px;text-align:center;width:auto}.header h1{font-size:30px;font-weight:400;line-height:30px;margin:15px 0px}.menu-list li a,.menu-list li span{border-bottom:solid 1px #ededed;color:#000;display:block;font-size:18px;height:60px;line-height:60px;text-align:center;width:86px}.header h1 a{color:#333}.tex .hljs-formula{background:#eee8d5}</style> <style amp-boilerplate>body{-webkit-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-moz-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-ms-animation:-amp-start 8s steps(1,end) 0s 1 normal both;animation:-amp-start 8s steps(1,end) 0s 1 normal both}@-webkit-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-moz-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-ms-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-o-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}</style> <noscript><style amp-boilerplate>body{-webkit-animation:none;-moz-animation:none;-ms-animation:none;animation:none}</style></noscript> </head> <body> <header class="header"><div class="header-title"><h1><a href="/"><?php $this->options->title(); ?></a></h1></div></header> <article class="post"><h1 class="title"><?php $this->title(); ?></h1> <div class="entry-content"> <?php ampInit($this);?> <?php $this->content(); ?> </div> <p class="expire-tips">当前页面是本站的「<a href="//www.ampproject.org/zh_cn/">Google AMP</a>」版。查看和发表评论请点击:<a href="<?php $this->permalink() ?>">完整版 »</a></p> </article> </body> </html> <?php } else {?> \\这里是原模板内容 <?php }?>接着在functions.php文件末尾添加下列两个函数。 function ampInit($archive) { if ($archive->is('single')) { $archive->content = str_replace('<img','<amp-img width="900" height="675" layout="responsive" ',$archive->content); $archive->content = str_replace('img>','amp-img>',$archive->content); $archive->content = str_replace('<!- toc end ->','',$archive->content); $archive->content = str_replace('javascript:content_index_toggleToc()','#',$archive->content); } } function get_post_img($archive) { $cid = $archive->cid; $db = Typecho_Db::get(); $rs = $db->fetchRow($db->select('table.contents.text') ->from('table.contents') ->where('cid=?', $cid)); $text = $rs['text']; $pattern = '/\<img.*?src\=\"(.*?)\"[^>]*>/i'; $patternMD = '/\!\[.*?\]\((http(s)?:\/\/.*?(jpg|png))/i'; $patternMDfoot = '/\[.*?\]:\s*(http(s)?:\/\/.*?(jpg|png))/i'; if (preg_match($patternMDfoot, $text, $img)) { $img_url = $img[1]; } else if (preg_match($patternMD, $text, $img)) { $img_url = $img[1]; } else if (preg_match($pattern, $text, $img)) { preg_match("/(?:\()(.*)(?:\))/i", $img[0], $result); $img_url = $img[1]; } else { $img_url ='https://holmesian.org/usr/themes/Holmesian/images/holmesian.png?type=markdown'; } return $img_url; }最后在header.php中添加下列内容 <?php if ($this->is('post')): ?> <link rel="amphtml" href="<?php $this->permalink() ?>?amp=1"> <?php endif; ?>全部修改之后,刷新缓存,就可以访问AMP页面啦。PS:可以到这里测试你的AMP页面是否正确有效。PS2:Google大概会在48小时内抓取到AMP页面,并在搜索结果中体现出来。效果如...

阅读文章
让Typecho无限滚动加载的方法

据统计,据媒体报道,据各种经验之谈:用户不喜欢点击,更爱滚动!所以,之前挺流行的文章分页没有了,沿用了几百年的“下一页”也被无限load取代。瀑布流和Twitter更是推动了无限load的普及。这里介绍一个jQuery插件:Infinite AJAX Scroll,通过这个插件能快速实现无限滚动翻页。因为是jQuery所以到处都能用,这里我们以Typecho作为例子。第一步接入Infinite AJAX Scroll下载Infinite AJAX Scroll,放到对应主题的js文件夹中。因为是jQuery插件,我们还要先连上jQuery。打开header.php页面,插入如下代码:<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script> <script src="<?php $this->options->themeUrl('js/jquery-ias.js'); ?>"></script>第二步为Typecho加上分页如果看官网文档的话,它会告诉你分页代码用带有数字列表的<?php $this->pageNav(); ?>。如果你用的是这个代码,请务必换成<?php $this->pageLink('下一页','next'); ?>。步骤三调整代码把下面这段代码插在步骤一代码的后面即可,然后我们要做一些调整。<script type="text/javascript"> var ias = jQuery.ias({ container: '#posts', //大容器 item: '.post', //循环容器 pagination: '#pagination', //分页容器 next: '.next' //下一页的class }); ias.extension(new IASTriggerExtension({ text: '加载更多', //此选项为需要点击时的文字 offset: 2, //load多少页后显示加载更多按钮 })); ias.extension(new IASSpinnerExtension()); //加载时的图片 ias.extension(new IASNoneLeftExtension({text: "已经没有文章了"})); //到底后显示的文字 </script>我们需要把容器对应的id和class填上,item指的是循环列表的容器,就是列表中的文章最外层div的id或者classcontainer是整个大容器,就是包裹文章列表的div的id或者classpagination是分页所在的容器,就是包裹分页按钮的div的id或者classnext是下一页对应的class,就是分页按钮超链接的class如果没有id或者class,就自己加一个。为了更方便理解,我偷了个图,基本就是这样的步骤四重载函数因为文章可能含有缩略图,而缩略图可能会用到惰性加载的js,所以ajax加载文章后,缩略图可能加载异常,这时我们需要在步骤三的代码最后加上一条 ias.on('rendered', function(items) { //你的重载函数 })常见的惰性加载需要重载的函数Lazyload $("img.lazy").lazyload({effect:"fadeIn"}); //这里是你调用Lazyload的代码blazy;(function() { // Initialize var bLazy = new Blazy(); })(); 参考:http://www.19871222.com/infinite-ajax-scroll.htmlhttps://salongweb.com/infinite-ajax-scroll.ht...

阅读文章
Typecho 1.1正式版发布了?

2017.10.24 Typecho 1.1Beta版发布2017.10.29 Typecho 1.1正式版发布2017.10.30 Typecho 1.1正式版重新发布2017.11.xx Typecho 1.1正式版修订版发布官方下载地址:http://typecho.org/download更新内容:修复两个高危的漏洞(XMLRPC的和安装文件的),大家在升级时请覆盖原有的根目录下的install.php文件新增了备份功能新增了若干的插件钩子和特性修正了上一个版本以来的大量错误新增了Mysqli适配器增加夏令时支持修正了反垃圾的措施,自带的反垃圾方法已经能够挡掉绝大部分机器人了替换了 Markdown 解析引擎,保证预览与实际效果严格一致为了保证大家的 install.php 都能更新,我们在升级之前又加入了自动安全检查机制,帮助你检查相关文件是否已经更新完毕。请大家继续反馈你的想法和建议。沉寂了三年,为何突然更新?《关于最近的 Typecho 安全漏洞》,我猜是被致命bug逼的。为什么yodu之前的版本模板不兼容typecho1.1?因为模板functions.php文件夹中$time参数与新版本冲突,改成别的就好了。【部分人的模板可能也会有相同问题哈】为什么编辑器不支持html了?html标签需要使用三个叹号进行声明,如下图所示格式不过据说下次修订版可能会支持一大部分html标签暂时不想升级,怎么修复漏洞?删除install.php文件...

阅读文章
YoduBGM一款WordPress背景音乐插件

YoduBGM 1.1.0是一款简洁 (简陋) 风格的背景音乐播放器,需要主题支持 pjax 技术,否则页面切换歌曲会断掉。背景音乐播放器那么多了为什么还要开发呢?而且还这么丑?答:其他的背景音乐播放器只能支持常规的 pjax 模板,而这个还支持使用instantclick.js的网站介绍:音乐默认不自动播放,需要点击音乐图标才会播放,第二次点击则暂停,首次播放是随机播放列表中的一首歌曲,然后顺序播放。>这个图标点击后会播放列表的下一首歌曲。插件后台可以设置音乐自动播放,可以添加歌曲,并且附带网易云音乐的解析器。下载地址:WordPress:yodubgm.ziptypecho版:https://github.com/jrotty/YoduBGMtypecho发布页面:《YoduBGM 一款 typecho 背景音乐插件》常见问题问:为什么有的时候只有两个框框而没有图标?(typecho可能遇到的问题,wp博客未知)答:图标载入的字体文件,只有用后台绑定的域名访问才会显示,比如程序后台绑定的是 qqdie.com, 那么用 www.qqdie.com 进行访问就会出现没有图标的情况,建议将 www.qqdie.com 的域名重定向到 qqdie.com 上。这样怎么访问都会访问到程序绑定的域名上,图标也会完美显示了。题外话:这是我的第一个WordPress博客程序的插件,其实本人对于wp真的不怎么了解,于是采用了拆蜜汁路易的音乐插件来学习的,过程中感觉最迷糊的就是wp插件设置那里,起初我怎么写都存不到数据库中,后来发现自己写错个字母233,也是醉...

阅读文章
typecho-gifstop插件阻止gif自动播放

gifstop插件一款防止GIF动画的自动播放的typecho插件项目地址:https://github.com/jrotty/typecho-gifstop实际插件就是把gifffer做成了插件,gifffer项目地址https://github.com/krasimir/gifffer演示效果如下默认gif图片不自动播放,鼠标点击后才会播放,无需JQ,部分模板可能不...

阅读文章
CommentFilter for Typecho强势魔改升级

插件原作者地址:http://www.imhan.com/archives/typecho_commentfilter_110/Hanny的这个评论过滤插件很给力哈,他最后的更新时间式2014-01-04,但是现在用着依旧很给力。但是呢,最近发现的评论都是,随机的名人名言/随机语句之类的,没有什么特征,广告往往都在昵称和链接上,举个栗子:这样的垃圾评论可能没办法屏蔽,所以本博主觉定自己魔改下。Hanny写的插件扩展性挺好的,所以改起来也不麻烦更新功能包括1,支持过滤评论者的昵称2,支持过滤评论者的链接插件原有功能1,过滤机器人评论2,IP过滤3,关键词过滤4,敏感词过滤5,非中文评论过滤评论过滤优先级顺序:自插件设置的功能自上而下,最上边的优先级最高下载地址CommentFilter1.2.0.tar.gz或者去typecho论坛下载:http://forum.typecho.org/viewtopic.php?f=6&t=10447项目地址:https://github.com/jrotty/CommentFilter-typecho更新部分设置截图凉了建议使用更好的插件《SmartSpa...

阅读文章
typecho-Highlight.js代码高亮插件

项目地址:https://github.com/jrotty/Highlightjs-for-typecho安装将Highlight文件夹传到typecho插件目录即可完成插件的安装其他说明该插件需要加载JQ,兼容instantclick.js,typecho1.0代码结尾会多出一行,typecho开发板正常,也就是说等typecho1.1正式发布了,这个软件就没这个bug了哈哈哈功能说明能让代码高亮,并且有行号使用方法如下面格式\```php <?php echo 'hello jrotty!'; ?> \``` 删除上边代码中的\过程本来是想用Highlight.js写个代码高亮插件,然而一搜发现typecho的作者joyqi早就写过了,于是我决定就拿他的这个直接改吧。原地址:http://forum.typecho.org/viewtopic.php?&t=4464首先名字改成了Highlight然后将Highlight.js的js和css都换成最新的了,删改了js,加入了行号显示功...

阅读文章
Typecho不修改源码不关闭反垃圾保护兼容pjax

众所周知,typecho使用pjax模板会导致评论失败。解决方法一是修改程序源码来兼容,二是在评论设置处关闭反垃圾保护来避免冲突。方法一呢,明显不适合小白用户,而且程序更新后可能会出现问题,或者需要再次修改。方法二,虽然简单直接了很多,但是呢作为一个写主题的博主,总会被小白重复问道为啥评论不好使【明明主题安装说明里都强调说明了要关闭反垃圾保护,可是小白就是看不到!所以对于主题作者来说这样也不太好】其实认真观察yodu模板更新记录的人应该发现了,自从yodu3.3.0版开始,我就不在提示关闭反垃圾保护来兼容模板了,因为想到了个有趣的方法在functions.php添加function themeInit($archive) { Helper::options()->commentsAntiSpam = false; }这个方法其实与方法二一样,就是关闭反垃圾保护,只不过不用手动去关闭而是模板强制关闭反垃圾保护,并且评论设置处看起来还是开启反垃圾保护的样子,忽悠小白妥妥的!其实themeInit还有些厉害的地方,例如:function themeInit($archive) { Helper::options()->commentsMaxNestingLevels = 999;//评论回复楼侧最高999层.这个正常设置最高只有7层 Helper::options()->commentsAntiSpam = false;//评论关闭反垃圾保护 if ($archive->is('author')) { $archive->parameter->pageSize = 50; // 作者页面每50篇文章分页一次 } if ($archive->is('category','av')) { $archive->parameter->pageSize = 9; // 分类缩略名为av的分类列表每9篇文章分页一次 } $archive->content = a_class_replace($archive->content);//文章内容,让a_class_replace函数处理 } function a_class_replace($content) { $content = preg_replace('#<a(.*?) href="([^"]*/)?(([^"/]*)\.[^"]*)"(.*?)>#', '<a$1 href="$2$3"$5 target="_blank">', $content);//给文章每个超链接点击后新窗口打开,原理就是用正则替换文章内容...

阅读文章
极简主题MINIMO-FOR-TYPECHO

基于Hugo的开源主题地址 https://github.com/MunifTanjim/minimo 移植的契机看到typecho论坛有人问能否移植,我还以为他就是作者呢,然后就用扒的方式移植了这个模板,然后我发现他并不是原作者哈,但是正好是开源主题也就无所谓了,原作者信息也保留了使用方法1,上传解压后的文件夹至模板目录,然后在程序后台启用模板2,在管理-独立页面处新建一个页面,标题和地址随便写,右下角页面模板选择HOME3,设置-阅读中站点首页处,使用刚刚建立的独立页面作为首页,然后勾选同时将文章列表页路径更改为/blog/(这个貌似默认就是勾选的,如果没勾选就手动选择上)下载地址去typecho论坛下载吧:http://forum.typecho.org/viewtopic.php?f=5&t=104...

阅读文章