标签 typecho 下的文章

Typecho根据文章cid获取文章信息

如上图,就是基于这个功能,实现的轮播图,填写了文章cid,获取了文章标题,描述,缩略图和链接。其实这个功能,应该有很多人发过,不过大多都是需要写查询函数的,我呢因为懒,所以经过试验发现了这种不用自己写函数的写法。代码如下代码,其中cid=1就是获取cid为1的文章信息,可以改成你需要获取的文章cid。<?php $this->widget('Widget_Archive@indexxiu', 'pageSize=1&type=post', 'cid=1')->to($ji); ?> 标题:<?php $ji->title(); ?> 链接:<?php $ji->permalink(); ?> 描述:<?php $ji->description(); ?> ...获取多个上边的截图,就是获取了三个文章,来实现的,代码如下,其中166,163,160就是对应的三个文章的cid<?php $lunbo="166,163,160"; $hang = explode(",", $lunbo); $n=count($hang); $html=""; for($i=0;$i<$n;$i++){ $this->widget('Widget_Archive@lunbo'.$i, 'pageSize=1&type=post', 'cid='.$hang[$i])->to($ji); if($ji->fields->thumb){$img=$ji->fields->thumb;} if($i==0){$no=" sx_no";}else{$no="";} $html=$html.'<div class="sx_vt'.$no.'" name="'.$i.'" title="'.$ji->title.'" intro="'.$ji->description.'" hsrc="'.$ji->permalink.'"><img src="./images/load.jpg" bsrc="'.$img.'" alt="'.$ji->title.'"></div>'; } echo $html; ?>原理就是利用for循环,来实现的多次点播。提示代码中的Widget_Archive@后面的参数可以随便写,同一个页面多次使用时参数不能相同,否则会重复输出同一条数...

阅读文章
Typecho 无插件实现即时搜索

在functions.php最后面添加以下,通过每次访问判断文件间隔时间来达到更新缓存的目的。上方js里的search_a路径需要填写完整路径+/caches/cache.json/** * 静态缓存类 */ class cacheFile { private $_dir; const EXT = '.json'; public function __construct() { $this->_dir = dirname(__FILE__).'/caches/'; } public function cacheData($key, $value = '', $path = '') { $filePath = $this->_dir.$path.$key.self::EXT; if ($value !== '') { // 如果设置为 null,则删除缓存文件 if (is_null($value)) { return unlink($filePath); } $dir = dirname($filePath); if (!is_dir($dir)) { mkdir($dir, 0777); } // 该函数将返回写入到文件内数据的字节数,失败时返回FALSE return file_put_contents($filePath, $value); } // 如果已经存在该文件,直接返回文件里面的内容 if (!is_file($filePath)) { return false; } else { echo $filePath; // The function returns the read data 或者在失败时返回 FALSE. return json_decode(file_get_contents($filePath), true); } } } if(!file_exists($flag)) { touch($flag); $TheFile = dirname(__FILE__).'/caches/cache.json'; $cacheFile = new cacheFile(); $vowels = array("[", "{","]","}","<",">","\r\n", "\r", "\n","-","'",'"','`'," ",":",";",'\\'," "); Typecho_Widget::widget('Widget_Contents_Post_Recent','pageSize=10000')->to($archives); while($archives->next()): $output .= '{"this":"post","link":"'.$archives->permalink.'","title":"'.$archives->title.'","comments":"'.$archives->commentsNum0.'","text":"'.str_replace($vowels, "",$archives->text).'"},'; endwhile; Typecho_Widget::widget('Widget_Contents_Page_List')->to($pages); while($pages->next()): $output .= '{"this":"page","link":"'.$pages->permalink.'","title":"'.$pages->title.'","comments":"'.$pages->commentsNum0.'","text":"'.str_replace($vowels, "",$pages->text).'"},'; endwhile; Typecho_Widget::widget('Widget_Metas_Tag_Cloud','ignoreZeroCount=1&limit=10000')->to($tags); while ($tags->next()): $output .= '{"this":"tag","link":"'.$tags->permalink.'","title":"'.$tags->name.'","comments":"0","text":"'.str_replace($vowels, "",$tags->description).'"},'; endwhile; Typecho_Widget::widget('Widget_Metas_Category_List')->to($category); while ($category->next()): $output .= '{"this":"category","link":"'.$category->permalink.'","title":"'.$category->name.'","comments":"0","text":"'.str_replace($vowels, "",$category->description).'"},'; endwhile; $output = substr($output,0,strlen($output)-1); $data = '['.$output.']'; if (file_exists($TheFile)) { if ( time() - filemtime( $TheFile) > 1800){ $cacheFile->cacheData('cache', $data); }; //5分钟300秒,时间可以自己调整 } else { $cacheFile->cacheData('cache', $data); }; }HTML结构:<div class="ins-search" id="search"> <div class="ins-search-mask"> </div> <div class="ins-search-container"> <div class="ins-input-wrapper"> <form id="search-form" method="post" action="./" role="search"> <input id="search-input" type="text" name="s" class="ins-search-input" placeholder="想要查找什么..."> </form> <span id="close" class="ins-close ins-selectable">×</span> </div> <div class="ins-section-wrapper"> <a id="Ty" href="#"></a> <div class="ins-section-container" id="PostlistBox"> <section class="ins-section"><header class="ins-section-header">文章</header> <div class="ins-selectable ins-search-item" data-url="/"> <header>测试</header> <p class="ins-search-preview"> 及时搜索结果 </p> </div> </section><section class="ins-section"><header class="ins-section-header">页面</header> <div class="ins-selectable ins-search-item" data-url="/"> <header>测试</header> </div> </section><section class="ins-section"><header class="ins-section-header">分类</header> <div class="ins-selectable ins-search-item" data-url="/"> <header>测试<span class="ins-slug">测试</span></header> </div> </section><section class="ins-section"><header class="ins-section-header">标签</header> <div class="ins-selectable ins-search-item" data-url="/"> <header>测试<span class="ins-slug">测试</span></header> </div> </section> </div> </div> </div> </div>CSS:.ins-search{display:none;z-index:999} .ins-search a{-webkit-transition:none;transition:none} .ins-search header{position:unset;width:auto} .ins-selectable{cursor:pointer} .ins-search-container,.ins-search-mask{position:fixed} .ins-search-mask{top:0;left:0;width:100%;height:100%;z-index:100;background:rgba(0,0,0,.85)} .ins-input-wrapper{position:relative} .ins-search-input{width:100%;border:none;outline:0;font-size:16px;-webkit-box-shadow:none;box-shadow:none;font-weight:200;border-radius:0;background:#fff;line-height:20px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:12px 40px 12px 20px;border-bottom:1px solid #e2e2e2} .ins-close{top:50%;right:10px;width:20px;height:20px;font-size:16px;margin-top:-15px;position:absolute;text-align:center;display:inline-block;font:22px/30px Arial,Helvetica Neue,Helvetica,sans-serif;color:#888;font-weight:300} .ins-close:hover{color:#000} .ins-search-container{left:50%;top:100px;z-index:101;bottom:100px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:540px;margin-left:-270px;border:1px solid #ccc;border-radius:.28571429rem;background:#fff;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.08);box-shadow:0 1px 3px 0 rgba(0,0,0,.08)} @media screen and (max-width:559px),screen and (max-height:479px){.ins-search-container{top:0;left:0;margin:0;width:100%;height:100%;background:#f7f7f7} } .ins-section-wrapper{left:0;right:0;top:45px;bottom:0;overflow-y:auto;position:absolute} .ins-section-container{position:relative;background:#f7f7f7} .ins-section{font-size:14px;line-height:16px} .ins-section .ins-search-item,.ins-section .ins-section-header{padding:8px 15px} .ins-section .ins-section-header{color:#9a9a9a;border-bottom:1px solid #e2e2e2} .ins-section .ins-slug{margin-left:5px;color:#9a9a9a} .ins-section .ins-slug:before{content:'('} .ins-section .ins-slug:after{content:')'} .ins-section .ins-search-item .ins-search-preview,.ins-section .ins-search-item header{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:#616161} .ins-section .ins-search-item header i{margin-right:8px} .ins-section .ins-search-item .ins-search-preview{height:15px;font-size:12px;color:#9a9a9a;margin:5px 0 0 20px} .ins-section .ins-search-item.active,.ins-section .ins-search-item:hover{color:#fff;background:#006bde} .ins-section .ins-search-item.active .ins-search-preview,.ins-section .ins-search-item.active .ins-slug,.ins-section .ins-search-item:hover .ins-search-preview,.ins-section .ins-search-item:hover .ins-slug,.ins-section .ins-search-item:hover header{color:#fff}JS:var QueryStorage = []; search_a("这里填写生成的json链接"); var otxt = document.getElementById("search-input"), list = document.getElementById("PostlistBox"), Record = list.innerHTML; document.all ? otxt.onpropertychange = function() { query(QueryStorage, otxt.value, Record) } : otxt.oninput = function() { query(QueryStorage, otxt.value, Record) }; function search_a(val) { var _xhr = new XMLHttpRequest(); _xhr.open("GET", val, true); _xhr.setRequestHeader("Content-Type", "application/json"); _xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); _xhr.send(val); _xhr.onreadystatechange = function() { if (_xhr.readyState == 4 && _xhr.status == 200) { json = _xhr.responseText; if (json != "") { QueryStorage = JSON.parse(json) } } } } if (!Object.values) Object.values = function(obj) { if (obj !== Object(obj)) throw new TypeError('Object.values called on a non-object'); var val = [], key; for (key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { val.push(obj[key]) } } return val } function a(a) { document.getElementById("Ty").href = a.getAttribute("href"), document.getElementById("Ty").click() } function query(a, b, c) { var n, o, p, q, d = "", e = "", f = "", g = "", h = "", i = '<div class="ins-selectable ins-search-item" onclick="a(this)" href="', j = '<section class="ins-section"><header class="ins-section-header">', k = "</header>", l = "</section>", m = Cx(a, b); for (n = 0; n < Object.keys(m).length; n++) switch (o = m[n].this) { case "post": e = e + i + m[n].link + '"><header>' + m[n].title + '</header><p class="ins-search-preview">' + m[n].comments + m[n].text + "</p></div>"; break; case "tag": f = f + i + m[n].link + '"><header>' + m[n].title + '<span class="ins-slug">' + m[n].text + "</span></header></div>"; break; case "category": g = g + i + m[n].link + '"><header>' + m[n].title + '<span class="ins-slug">' + m[n].text + "</span></header></div>"; break; case "page": h = h + i + m[n].link + '"><header>' + m[n].title + '</header><p class="ins-search-preview">' + m[n].comments + m[n].text + "</p></div>" } e && (d = d + j + "文章" + k + e + l), h && (d = d + j + "页面" + k + h + l), g && (d = d + j + "分类" + k + g + l), f && (d = d + j + "标签" + k + f + l), p = document.getElementById("PostlistBox"), q = document.getElementById("search-input"), p.innerHTML = "" == q.value ? c : d } function Cx(arr, q) { i = arr.filter(v = > Object.values(v).some(v = > new RegExp(q + '').test(v))); return I...

阅读文章
Typecho 计算文章内图片标签数量

适用于图片型主题.仅计算文章内使用的img标签数量.在主题function.php里添加如下:function imgNum($content){ $output = preg_match_all('#<img(.*?) src="([^"]*/)?(([^"/]*)\.[^"]*)"(.*?)>#', $content,$s); $cnt = count( $s[1] ); return $cnt; }应用环境为:文章列表拓展:function imgNumCCC($content){ $output = preg_match_all('#<img(.*?) src="([^"]*/)?(([^"/]*)\.[^"]*)"(.*?)>#', $content,$s); $cnt = count( $s[1] ); if(intval($cnt)>=4){ //当图片大于或等于4张时,启用此方法 for ($i=1; $i < 5; $i++) { if($i==4){ //判断是否最后一张,如果为最后一张,则进行计算/增加className $n = 'ImgBOX NUM" title="'.(intval($cnt)-4).'+"'; //最后一张时的className }else{ $n = 'ImgBOX"'; //正常的className } $c .= '<div class=" '.$n.'><img data-src="'.$s[2][$i].$s[3][$i].'"></div>';//因为我加了图片缓加载,所以图片链接放在了data-src里. } $c = '<div class="i-img">'.$c.'</div>'; //输出 } echo $c; }拓展示例...

阅读文章
Typecho自定义个人设置页面

之前写过《typecho前台修改个人设置》这么一篇文章,但是里面的html结构是写死的,不够灵活。由因为我现在的模板使用的前端框架,前端框架只要改改html结构就能作出很好看的样式,于是乎我就折腾了这个。核心代码个人资料页面<?php Typecho_Widget::widget('Widget_Security')->to($security); ?> <form action="<?php $security->index('/action/users-profile'); ?>" method="post" enctype="application/x-www-form-urlencoded"> <label>用户ID</label> <?php $this->user->uid() ?> <label>昵称</label> <input type="text" name="screenName" value="<?php $this->user->screenName(); ?>"/> <label>邮箱</label> <input type="text" name="mail" value="<?php $this->user->mail(); ?>"/> <label>网站</label> <input type="text" name="url" value="<?php $this->user->url(); ?>"/> <input name="do" type="hidden" value="profile"> <button type="submit">确定</button> </form> 密码修改页面<?php Typecho_Widget::widget('Widget_Security')->to($security); ?> <form action="<?php $security->index('/action/users-profile'); ?>" method="post" enctype="application/x-www-form-urlencoded"> <label><font style="vertical-align: inherit;">密码</label> <input type="password" name="password"/> <label>重复密码</label> <inputtype="password" name="confirm"/> <input name="do" type="hidden" value="password"> <button type="submit">确定</button> </form>html结构根据自己写的样式调整美化即...

阅读文章
DONG基于MDUI的Typecho程序主题

特性MD风格自适应拥有时间归档,分类汇总页面模板设置拥有大量自定义功能站长优化版:为没有图片的文章添加默认图片,原作者项目是调用必应壁纸的,但api已失效![btn url="https://www.lanzous.com/i5xlzmb"]下载主题(站长优化版)[/btn] [btn url="https://github.com/2016Dongyu/Typecho-theme-DONG-MDUI"]Github下载[/bt...

阅读文章
YoDu初心版,一款自适应的typecho模板

YoDu初心版:一个以YoDu模板6.0.0版本为基础,以优化加载速度,seo,兼容为目标,回顾初心的一个版本。这是在Yodu模板正式版停更之时,产生的一个新的分支,这个分支会继续更新下去。目前初心版仅为正式版的付费用户提供,如果想使用可以去这里购买正式版→https://qqdie.com/archives/yodu.html功能支持上与正式版有所差异,下面就是一些功能介绍表功能介绍使用多皮肤4中颜色配置,4中风格设定模板后台设置缩略图6种缩略图设置方案模板后台设置缩略图后缀设置当你文章内的图片作为缩略图展示时,展示的图片会附带这里填写的后缀信息,该功能用于使用云存储的同学添加自动裁剪功能,提高首页加载效率模板后台设置预加载pjax5种模式可供选择模板后台设置评论ajax无刷新评论模板后台设置评论设置支持原生评论,畅言,Disqus等模板后台设置邮箱头像源设置支持全局改变邮箱头像源,后台提供多种选项模板后台设置代码高亮默认代码高亮,支持行号,也可关闭使用兼容版Prismjs代码高亮插件模板后台设置扩展功能一言,平滑滚动,代码压缩等模板后台设置二维码默认就有文章二维码,打赏二维码功能模板后台可设置关闭,需要自行替换打赏图片资源自定义css支持在模板设置处自定义css,群内提供部分css文档模板后台设置分类汇总分类文章汇总页面建立独立页面选择对应模板时间归档按时间归档文章的页面建立独立页面选择对应模板时间归档搜索时间归档页面的时间检索默认开启后台可设置关闭友链页面内置了模板,根据简单的书写规则就能展现出好看的友链页面,支持直接填写对方qq获取头像,直接填写邮箱获取邮箱头像建立独立页面选择对应模板文章目录树关联文章中的h1,h2,h3标签生成目录模板设置中扩展组件设置图片灯箱模板引用了fancybox无需设置图片排版功能能够在默认模板的情况下对图片排布进行控制,同排图片尺寸最好一致,否则会乱图片alt信息最后面写上-25,-30,-33,-50,-75,-100即可完成图片的排版,以-25为例,-25指的是图片宽度是父级的25%,并且漂浮在文章最左侧,文章末尾最好不要放图模板cdn功能可将模板的所有js,css,图片等文件,放到又拍云等地方,然后一键引用模板后台设置附件地址替换模板设置除输入替换前地址和替换后地址保存即可3.5.0版本以上支持mulu字段自定义字段名mulu,字段值随便写,输入字段的文章会显示文章目录树,就是在全局关闭目录树的基础上,可以为单个文章开启目录树 针对360好搜优化针对好搜搜索引擎有针对性优化,当你文章被收录时有很大几率会图文并茂的显示在搜索结果上被动技能seo文章关键词优化主动填写文章关键词,提高搜索引擎收录后续升级支持该功能初心版,其实就是个针对自己使用来做的一个版本,正式版随着迭代更新次数的累积,功能越来越多的同时,自己变得越来越不喜欢他了。[btn url="https://github.com/jrotty/typecho-yodu/releases"]下载主题[/btn] 初心版更新历史预定计划2019.08.30咕咕咕后,开源了2018.10.031,修复上一版本存在的功能冲突2,删除多余if判断3,删除正式版中的回复可见和页面锁功能4,新增缩略图后缀设置功能,可用于优化速度2018.10.01:beta版本发布1,删减各种功能2,删减各种残余...

阅读文章
Spe-kit双栏自适应Typecho主题

Spe-kit,即simple Kit,为双列文本主题模板。简洁大方。一款轻量的自适应模板,没有使用任何前端框架。特色响应式设计适配各种大小尺寸屏幕支持文章目录树置顶功能支持常见语法的高亮,代码语言图片灯箱pjax无刷新加载支持ajax评论功能支持评论可见汇总功能:包括文章归档,标签云,分类展示,页面展示支持自定义文章关键词描述[btn url="https://github.com/flyaw/spe-kit"]下载主题[/btn] [btn url="https://www.llnico.com/"]作者博客[/bt...

阅读文章
DUX一款基于大前端Typecho主题

一款基于大前端DUX for Wordpress主题修改而来的主题。特色自适应文章列表支持无限加载支持代码高亮拥有广告位可设置幻灯轮播[btn url="https://github.com/hiCasper/Typecho-theme-DUX"]主题下载[/btn] [btn url="http://blog.hicasper.com/"]作者博客[/bt...

阅读文章
EasyBe简单且美观的Typecho博客主题

名字是easy和beautiful的结合,意味着这个主题是一个简单且美观的博客主题特色EasyBe以阅读为核心,尽可能的美化博客的显示效果,提高用户体验。支持响应,尺寸分别为:(1200px,∞px),(960px,1200px],(720px,960px],(0px,720px][btn url="https://github.com/wangyang0210/EasyBe"]下载主题[/btn] [btn url="https://typecho.me/1308.html"]作者原文[/bt...

阅读文章
iDevs简单又漂亮的Typecho主题

移植自WordPress同名主题iDevs介绍单栏自适应pjax(评论不支持无刷新)可设置首页轮播图,评论轮播,文章缩略图模板可设置备案号,友情链接等[btn url="https://github.com/wrisin/iDevs-For-Typecho"]下载主题[/btn] [btn url="https://auauau.cn/#!24"]作者原文[/bt...

阅读文章
自定义Typecho加密文章的Html结构

为什么要自定义?我们先看下正常的typecho加密文章的html代码结构<form class="protected" action="一个链接地址" method="post"> <p class="word">请输入密码访问</p> <p> <input type="password" class="text" name="protectPassword"> <input type="hidden" name="protectCID" value="文章id"> <input type="submit" class="submit" value="提交"> </p> </form>那么我们作为模板的作者,如果要写这部分的样式,就必须根据他的class来写样式;但是如果我用的是前端框架,框架已经内置好了一些表单样式,我们为什么不用呢?因为typecho默认的结构,无法套用,所以就有了这篇文章。自定义加密文章的Html将模板post.php中的<?php $this->content(); ?>换为以下代码即可,其中html结构可根据自己模板架构自行调整。<!--判断文章是否加密--> <?php if($this->hidden||$this->titleshow): ?> <!--如果加密,输出自定义的表单格式--> <form action="<?php echo Typecho_Widget::widget('Widget_Security')->getTokenUrl($this->permalink); ?>" method="post"> <div class="form-group mb-3"> <label>请输入密码访问</label> <div class="input-group"> <input type="password" class="text" name="protectPassword" class="form-control" placeholder="请输入密码" aria-label="请输入密码"> <input type="hidden" name="protectCID" value="<?php $this->cid(); ?>" /> <div class="input-group-append"> <button class="btn btn-primary" type="submit">提交</button> </div> </div> </div> </form> <?php else: ?> <!--如果未加密,输出文章内容--> <?php $this->content(); ?> <?php endif;?>其中$this->titleshow是用来兼容titleshow插件的。关于Titleshow插件Typecho文章密码保护功能,默认会强制标题为”此内容被密码保护“,隐藏文章标签,强制文章评论数为0,隐藏文章内容,并且不允许文章进行评论,还会返回403。Titleshow插件,完美的解决了这些问题,加密文章可以显示标题,允许评论,不返回403状态等等,让文章加密功能只加密文章内容不影响其他。那么,这么好的插件去哪里下载呢?这里:https://github.com/jrotty/Titleshow题外话只是因为想偷懒不想写css,才有了本文,本身没啥技术含量,只是最开始不兼容Titleshow插件,所以就没有发文章出来,毕竟自己写的教程不兼容自己写的插件,岂不是很难堪233。所以今天给Titleshow插件升级了下,可以完美兼容了,嘿嘿...

阅读文章
Typecho主题前台实现删除文章功能

提示操作千万条,备份第一条,删文不谨慎,博主两行泪代码将下面的代码放到 post.php 中即可<?php Typecho_Widget::widget('Widget_Security')->to($security); ?> <a href="<?php $security->index('/action/contents-post-edit?do=delete&cid='.$this->cid); ?>">删除文章</a>点击按钮立即删除文章!完善上面的代码虽然实现了功能,但却泯灭了人性!下面我们完善下人性部分,代码改为<?php Typecho_Widget::widget('Widget_Security')->to($security); ?> <a href="<?php $security->index('/action/contents-post-edit?do=delete&cid='.$this->cid); ?>" onclick="javascript:return p_del()">删除文章</a> <script> function p_del() { var msg = "您真的确定要删除吗?"; if (confirm(msg)==true){ return true; }else{ return false; } } </script>这样弄好,点击按钮会弹出确认框,问其是否删除文章,用户确认后才会删除,比较符合操作习惯!后语post.php 页面成功删除文章后,因为文章不存在了,所以页面自动跳到了 404 页面,不知道怎么才能比较好的让它跳到首页Q...

阅读文章
Typecho评论回复按钮文字自定义

typecho评论的回复与回复取消按钮函数调用如下:回复按钮:<?php $comments->reply(); ?> 取消回复按钮:<?php $comments->cancelReply(); ?>输出的结果大概是这样:回复按钮:<a href="链接" rel="nofollow" onclick="代码">回复</a> 取消回复按钮:<a id="cancel-comment-reply-link" href="链接" rel="nofollow" onclick="代码">取消回复</a>那么我们如何自定义超链接中的文字呢?查了typecho源码发现,这两个函数是可以传参数的,传递的参数就是修改默认文字的。于是乎我就这样改了下<?php $comments->reply('<i class="mdi mdi-reply"></i>回复'); ?> <?php $comments->cancelReply('<i class="mdi mdi-reply"></i>取消'); ?>效果如下...

阅读文章
Typecho安卓客户端Nabo

前言了解 Typecho 博客的大多都知道 WordPress 的安卓客户端 Typecho 也能用,因为都是基于 XMLRPC ,但是真的不好用,不过所幸有位大佬基于 XMLRPC 接口开发了 typecho 的安卓客户端。Nabo of typecho android客户端名字为Nabo无需插件,仅需博客开启 XMLRPC。编辑器仅支持 markdown需要账号和密码和 XMLRPC 地址 一般 xmlrpc 地址为: https://example.com/action/xmlrpc ,有些未开启伪静态的可能需要加上 index.php目前为版本1.0,支持撰写文章,编辑文章,查看文章,删除文章,Rss阅读,评论处理,评论回复,数据统计,评论查看Nabo 官网:http://nabo.krait.cn/开发者:权那他疑问?欢迎加入QQ群:452935991这个android项目不开源,权那他保证绝不会私自盗取账号密码它仅许可 Typecho 博客使用, 虽然它利用 XMLRPC 协议编写,wp 这些都可以,但作者做了逻辑识别,非 typecho 博客无法使用。效...

阅读文章
Typecho获取随机文章函数

function getRandomPosts($random=5){ $db = Typecho_Db::get(); $adapterName = $db->getAdapterName();//兼容非MySQL数据库 if($adapterName == 'pgsql' || $adapterName == 'Pdo_Pgsql' || $adapterName == 'Pdo_SQLite' || $adapterName == 'SQLite'){ $order_by = 'RANDOM()'; }else{ $order_by = 'RAND()'; } $sql = $db->select()->from('table.contents') ->where('status = ?','publish') ->where('table.contents.created <= ?', time()) ->where('type = ?', 'post') ->limit($random) ->order($order_by); $result = $db->fetchAll($sql); if($result){ foreach($result as $val){ $obj = Typecho_Widget::widget('Widget_Abstract_Contents'); $val = $obj->push($val); $post_title = htmlspecialchars($val['title']); $permalink = $val['permalink']; echo '<a href="'.$permalink.'" title="'.$post_title.'"><h5 class="card-title">'.$post_title.'</h5></a>'; } } }需要使用时在模板中调用<?php getRandomPosts(10);?>即可,这个随机文章函数的好处就是不光兼容mysql还兼容sqlite数据库。完整使用方法1.将上面完整的随机文章代码丢进主题文件夹的function.php里面,保存;2.在需要添加随机文章的地方加上代码:<?php getRandomPosts(10);?>,保存;3.刷新页面,搞定!文章转自:http://www.7tec.cn/246.ht...

阅读文章
Nos-Typecho网易NOS存储插件

介绍网易云对象存储插件使用说明下载文件解压将文件夹重命名为Nos,上传到 typecho 目录下的 usr/plugin/文件夹内。登陆到 typecho 的后台,启动插件,并设置 endPoint 、 Bucket 、Access Key 、Access Secret`、保存路径等。新建文章上传即可注意事项保存路径的首位不能为 / ,保存路径设置为 ccc/ 时,文件的完整路径为 domain.com/ccc/filename。插件下载https://github.com/163yun/nos-typecho-plugin插件作者https://github.com/163y...

阅读文章
Typecho权限管理插件 - 权限狗

前言Typecho是一款博客程序,也是支持多用户的,也有很多人折腾过多用户,但是首先遇到的问题就是,新注册的用户,用户组无权发布文章,提升到贡献者的话文章还需要审核才能发布,提升到编辑的话权限有过大了,所以大多数人的解决方案就是改动源代码,让注册用户默认用户组为贡献者,同时将贡献者改成文章无需审核。权限狗权限狗插件1,支持注册时直接设置账号密码2,注册成功后跳转地址可自定义3,注册用户默认用户组可自由设置4,支持贡献者发布文章自动审核5,支持模板开发者设置前台注册后的跳转地址,设置前台文章发布后的跳转地址插件自由付费该插件采用自由付费模式,你觉得它值多少钱就扫码付款给我多少钱!如果觉得一文不值,你也可以直接白嫖!插件下载地址https://github.com/jrotty/Rdog插件安装说明下载压缩包,解压后将文件名重命名为Rdog,上传至插件目录,然后登陆程序后台启用插件设置插件即可!也可以配合邮箱验证插件一起使用https://github.com/Archeb/MailValidate避免一次性会员更新记录2019.07.30更新1.2.0版本1,将定制版与非定制版rdog进行统一,规范写法2,支持模板开发者设置前台注册后的跳转地址,设置前台文章发布后的跳转地址2019.06.14更新1.1.6版本支持前台注册直接设置密码,同时贡献者发布文章自动审核的代码完全重写,改为另一种方式。2019.06.01删除一处手残代码,修复注册时报错问...

阅读文章
Typecho仿旧版A站程序源码下载

前言18年国庆期间,无意间发现个DZ仿A站的源码(旧版A站),于是闲着也是无聊,就想着给typecho也套上个,于是这个东西诞生啦,然而我后来就不想搞了...然后今天就放出来让大家happy下吧!展示图首页分类页面个人中心介绍功能:支持前台注册,前台登录,前台发布文章,前台管理文章,支持发布视频(视频直连或引用),支持发布文章。其他:整站源码源码我都会放在下面,包括数据库源码,typecho源码应该没怎么改动,带数据给出源码是因为模板有一些设定,比如视频文章的字段格式什么的,我不想细说,自行体会吧!注:此源码不适合新手,还有很多很多体验上的东西需要优化!管理员用户名和密码我不想说,你可以弄好后注册个账号,然后通过数据库将新建的账号权限提升为管理员即可!下载地址回复可见...

阅读文章
Titleshow-Typecho文章密码保护显示标题插件

前言关于 Typecho文章密码保护显示标题 无论是百度搜索,还是论坛搜索,搜索到的结果都大同小异,都是修改typecho源码,难道就没人想搞插件吗?插件Titleshow诞生Typecho文章密码保护功能,默认会强制标题为”此内容被密码保护“,隐藏文章标签,强制文章评论数为0,隐藏文章内容。而 我们的需求大多情况是只想隐藏文章内容,其余标题,标签,评论数这三者还是想显示出来的。于是乎插件Titleshow诞生!!!插件功能介绍已实现1,让加密文章的标题正常显示2,让加密文章的标签正常显示3,让加密文章的评论数正常显示4,自定义所有加密文章的提示文字5,意外的解决了加密文章无法评论的问题6,意外的解决了加密文章返回403问题插件下载https://github.com/jrotty/Titleshow插件安装方法下载压缩包,解压得到文件夹,将文件夹名字重命名为Titleshow,然后将其传入插件目录启用即可!适用版本兼容typecho1.1及开发板1.2 (18.10.23),如果发现不兼容请评论回复。更新记录2019年5月14日发布第一个版本1.0.0:只兼容typecho开发板2019年7月25日发布1.1.1版本,增强兼容性,兼容typecho1.1及开发板2019年8月25日发布1.1.2版本,加入判读参数,方便模板判断插件是否生效,具体用法见github...

阅读文章
Typecho不使用插件实现Ajax评论功能

原文出自绛木子博客:https://lixianhua.com/te_ajax_comment_without_pluign.html为了不使用插件实现Ajax评论功能需要实现:1,监听评论表单,改用ajax方式提交2,创建新的评论表单提交地址(用Typecho主题提供的系统方法themeInit实现)当访问文章加载主题时,themeInit方法首先被加载,可在此方法中判断是否为添加评论的操作,即新的评论表单地址为文章的链接(permalink).具体判断方法如下// 主题初始化 function themeInit($archive){ // 判断是否是添加评论的操作 // 为文章或页面、post操作,且包含参数`themeAction=comment`(自定义) if($archive->is('single') && $archive->request->isPost() && $archive->request->is('themeAction=comment')){ // 为添加评论的操作时 ajaxComment($archive); } }要实现ajax评论,则无法使用系统默认的feedback,这里我们将复制feedback功能并改造为我们需要的方法/** * ajaxComment * 实现Ajax评论的方法(实现feedback中的comment功能) * @param Widget_Archive $archive * @return void */ function ajaxComment($archive){ $options = Helper::options(); $user = Typecho_Widget::widget('Widget_User'); $db = Typecho_Db::get(); // Security 验证不通过时会直接跳转,所以需要自己进行判断 // 需要开启反垃圾保护,此时将不验证来源 if($archive->request->get('_') != Helper::security()->getToken($archive->request->getReferer())){ $archive->response->throwJson(array('status'=>0,'msg'=>_t('非法请求'))); } /** 评论关闭 */ if(!$archive->allow('comment')){ $archive->response->throwJson(array('status'=>0,'msg'=>_t('评论已关闭'))); } /** 检查ip评论间隔 */ if (!$user->pass('editor', true) && $archive->authorId != $user->uid && $options->commentsPostIntervalEnable){ $latestComment = $db->fetchRow($db->select('created')->from('table.comments') ->where('cid = ?', $archive->cid) ->where('ip = ?', $archive->request->getIp()) ->order('created', Typecho_Db::SORT_DESC) ->limit(1)); if ($latestComment && ($options->gmtTime - $latestComment['created'] > 0 && $options->gmtTime - $latestComment['created'] < $options->commentsPostInterval)) { $archive->response->throwJson(array('status'=>0,'msg'=>_t('对不起, 您的发言过于频繁, 请稍侯再次发布'))); } } $comment = array( 'cid' => $archive->cid, 'created' => $options->gmtTime, 'agent' => $archive->request->getAgent(), 'ip' => $archive->request->getIp(), 'ownerId' => $archive->author->uid, 'type' => 'comment', 'status' => !$archive->allow('edit') && $options->commentsRequireModeration ? 'waiting' : 'approved' ); /** 判断父节点 */ if ($parentId = $archive->request->filter('int')->get('parent')) { if ($options->commentsThreaded && ($parent = $db->fetchRow($db->select('coid', 'cid')->from('table.comments') ->where('coid = ?', $parentId))) && $archive->cid == $parent['cid']) { $comment['parent'] = $parentId; } else { $archive->response->throwJson(array('status'=>0,'msg'=>_t('父级评论不存在'))); } } $feedback = Typecho_Widget::widget('Widget_Feedback'); //检验格式 $validator = new Typecho_Validate(); $validator->addRule('author', 'required', _t('必须填写用户名')); $validator->addRule('author', 'xssCheck', _t('请不要在用户名中使用特殊字符')); $validator->addRule('author', array($feedback, 'requireUserLogin'), _t('您所使用的用户名已经被注册,请登录后再次提交')); $validator->addRule('author', 'maxLength', _t('用户名最多包含200个字符'), 200); if ($options->commentsRequireMail && !$user->hasLogin()) { $validator->addRule('mail', 'required', _t('必须填写电子邮箱地址')); } $validator->addRule('mail', 'email', _t('邮箱地址不合法')); $validator->addRule('mail', 'maxLength', _t('电子邮箱最多包含200个字符'), 200); if ($options->commentsRequireUrl && !$user->hasLogin()) { $validator->addRule('url', 'required', _t('必须填写个人主页')); } $validator->addRule('url', 'url', _t('个人主页地址格式错误')); $validator->addRule('url', 'maxLength', _t('个人主页地址最多包含200个字符'), 200); $validator->addRule('text', 'required', _t('必须填写评论内容')); $comment['text'] = $archive->request->text; /** 对一般匿名访问者,将用户数据保存一个月 */ if (!$user->hasLogin()) { /** Anti-XSS */ $comment['author'] = $archive->request->filter('trim')->author; $comment['mail'] = $archive->request->filter('trim')->mail; $comment['url'] = $archive->request->filter('trim')->url; /** 修正用户提交的url */ if (!empty($comment['url'])) { $urlParams = parse_url($comment['url']); if (!isset($urlParams['scheme'])) { $comment['url'] = 'http://' . $comment['url']; } } $expire = $options->gmtTime + $options->timezone + 30*24*3600; Typecho_Cookie::set('__typecho_remember_author', $comment['author'], $expire); Typecho_Cookie::set('__typecho_remember_mail', $comment['mail'], $expire); Typecho_Cookie::set('__typecho_remember_url', $comment['url'], $expire); } else { $comment['author'] = $user->screenName; $comment['mail'] = $user->mail; $comment['url'] = $user->url; /** 记录登录用户的id */ $comment['authorId'] = $user->uid; } /** 评论者之前须有评论通过了审核 */ if (!$options->commentsRequireModeration && $options->commentsWhitelist) { if ($feedback->size($feedback->select()->where('author = ? AND mail = ? AND status = ?', $comment['author'], $comment['mail'], 'approved'))) { $comment['status'] = 'approved'; } else { $comment['status'] = 'waiting'; } } if ($error = $validator->run($comment)) { $archive->response->throwJson(array('status'=>0,'msg'=> implode(';',$error))); } /** 添加评论 */ $commentId = $feedback->insert($comment); if(!$commentId){ $archive->response->throwJson(array('status'=>0,'msg'=>_t('评论失败'))); } Typecho_Cookie::delete('__typecho_remember_text'); $db->fetchRow($feedback->select()->where('coid = ?', $commentId) ->limit(1), array($feedback, 'push')); // 返回评论数据 $data = array( 'cid' => $feedback->cid, 'coid' => $feedback->coid, 'parent' => $feedback->parent, 'mail' => $feedback->mail, 'url' => $feedback->url, 'ip' => $feedback->ip, 'agent' => $feedback->agent, 'author' => $feedback->author, 'authorId' => $feedback->authorId, 'permalink' => $feedback->permalink, 'created' => $feedback->created, 'datetime' => $feedback->date->format('Y-m-d H:i:s'), 'status' => $feedback->status, ); // 评论内容 ob_start(); $feedback->content(); $data['content'] = ob_get_clean(); $data['avatar'] = Typecho_Common::gravatarUrl($data['mail'], 48, Helper::options()->commentsAvatarRating, NULL, $archive->request->isSecure()); $archive->response->throwJson(array('status'=>1,'comment'=>$data)); }当已经在functions.php文件中添加完上述方法时,就已经可以接收ajax评论了。此时我们需要修改评论表单添加的方式及提交的地址。在footer.php文件中添加方法// 依赖jquery,请自行加载 $(function(){ // 监听评论表单提交 $('#comment-form').submit(function(){ var form = $(this), params = form.serialize(); // 添加functions.php中定义的判断参数 params += '&themeAction=comment'; // 解析新评论并附加到评论列表 var appendComment = function(comment){ // 评论列表 var el = $('#comments > .comment-list'); if(0 != comment.parent){ // 子评论则重新定位评论列表 var el = $('#comment-'+comment.parent); // 父评论不存在子评论时 if(el.find('.comment-children').length < 1){ $('<div class="comment-children"><ol class="comment-list"></ol></div>').appendTo(el); }else if(el.find('.comment-children > .comment-list').length <1){ $('<ol class="comment-list"></ol>').appendTo(el.find('.comment-children')); } el = $('#comment-'+comment.parent).find('.comment-children').find('.comment-list'); } if(0 == el.length){ $('<ol class="comment-list"></ol>').appendTo($('#comments')); el = $('#comments > .comment-list'); } // 评论html模板,根据具体主题定制 var html = '<li id="comment-{coid}" class="comment-body comment-ajax"><div class="comment-author"><span><img class="avatar" src="{avatar}" alt="{author}" width="32" height="32"></span><cite class="fn">{author}</cite></div><div class="comment-meta"><a href="{permalink}"><time>{datetime}</time></a></div><div class="comment-content">{content}</div></li>'; $.each(comment,function(k,v){ regExp = new RegExp('{'+k+'}', 'g'); html = html.replace(regExp, v); }); $(html).appendTo(el); } // ajax提交评论 $.ajax({ url: '<?php $this->permalink();?>', type: 'POST', data: params, dataType: 'json', beforeSend: function() { form.find('.submit').addClass('loading').html('<i class="icon icon-loading icon-pulse"></i> 提交中...').attr('disabled','disabled');}, complete: function() { form.find('.submit').removeClass('loading').html('提交评论').removeAttr('disabled');}, success: function(result){ if(1 == result.status){ // 新评论附加到评论列表 appendComment(result.comment); form.find('textarea').val(''); }else{ // 提醒错误消息 alert(undefined === result.msg ? '<?php _e('评论出错!');?>' : result.msg); } }, error:function(xhr, ajaxOptions, thrownError){ alert('评论失败,请重试'); } }); return false; }); });ajax评论需要自定义评论模板,获取使用其他方式拼接评论html。评论form表单的提交按钮需要添加class="submit"或修改代码为其他自定义的class注:需开启评论的反垃圾保护以上为转载内容,在实际投入使用时遇到了两点问题一,通过ajax进行评论,邮件通知插件并不会发出通知!原因是因为重写了评论的函数,而函数中没写评论完成后触发插件接口,所以邮件通知插件不会发邮件给作者。解决方法也很简单在上述php代码$db->fetchRow($feedback->select()->where('coid = ?', $commentId)->limit(1), array($feedback, 'push'));后面加入$feedback->pluginHandle()->finishComment($feedback);即可。二,评论过滤插件也会失效!原因也是没有写入评论过滤的接口这个接口我试着往里面写,没有成功,所以换了个方式来解决,直接在里面写过滤,而不是用插件过滤评论。比如在$commentId = $feedback->insert($comment);前面加入if (preg_match("/[\x{4e00}-\x{9fa5}]/u", $comment['text']) == 0) { $archive->response->throwJson(array('status'=>0,'msg'=>_t('评论内容请不少于一个中文汉字'))); }即可屏蔽非中文评论,建议同时使用评论过滤插件,因为有些垃圾评论是通过评论机器人完成的,并不会经过ajax评论,所以还需要继续使用评论过滤插件,亦或者在模板层面上用上评论过滤接口(我是这么做的,目前来看大概是有效果...

阅读文章
Typecho无插件实现同分类文章上一篇下一篇

这个功能因为自己突然有需要,然后去论坛搜了下发现也有人问过,帖子里有人推荐了个插件可以实现,不过我突然想到个模板函数,就是自定义文章上下篇链接的,好像就可以直接实现,不需要插件。函数如下:/** * 显示下一篇 * * @access public * @param string $default 如果没有下一篇,显示的默认文字 * @return void */ function theNext($widget, $default = NULL) { $db = Typecho_Db::get(); $sql = $db->select()->from('table.contents') ->where('table.contents.created > ?', $widget->created) ->where('table.contents.status = ?', 'publish') ->where('table.contents.type = ?', $widget->type) ->where('table.contents.password IS NULL') ->order('table.contents.created', Typecho_Db::SORT_ASC) ->limit(1); $content = $db->fetchRow($sql); if ($content) { $content = $widget->filter($content); $link = '<a href="' . $content['permalink'] . '" title="' . $content['title'] . '">下一篇</a>'; echo $link; } else { echo $default; } } /** * 显示上一篇 * * @access public * @param string $default 如果没有下一篇,显示的默认文字 * @return void */ function thePrev($widget, $default = NULL) { $db = Typecho_Db::get(); $sql = $db->select()->from('table.contents') ->where('table.contents.created < ?', $widget->created) ->where('table.contents.status = ?', 'publish') ->where('table.contents.type = ?', $widget->type) ->where('table.contents.password IS NULL') ->order('table.contents.created', Typecho_Db::SORT_DESC) ->limit(1); $content = $db->fetchRow($sql); if ($content) { $content = $widget->filter($content); $link = '<a href="' . $content['permalink'] . '" title="' . $content['title'] . '">上一篇</a>'; echo $link; } else { echo $default; } }调用代码<?php thePrev($this); ?>和<?php theNext($this); ?>。可以看出里面用的是数据库语句,那么实现[Typecho无插件实现同分类文章上一篇下一篇],岂不是插入个where语句就行了,对,就是这么简单。首先在函数里开头部分加入如下代码,获取当前文章的分类mid@$mid=intval($widget->categories[0]['mid']);然后在数据库语句中合适位置插入一个where语句->where('table.relationships.mid = ?', $mid)好了,这就大功告成了,希望能帮得到各...

阅读文章
搞了个Typecho在线文档

其实在去年11月份左右的时候,我就把官方文档抄了份markdown格式的,并且修改了些小细节,添加了一些我的理解,并且打包发到几个Q群里面,感觉看到的人不多,而且不方便。于是用docsify撸了个在线版的,然后觉得在线版放github比较好,大家可以一起修改,一起提提意见,于是乎花了几分钟把他又布置到了github上。项目地址:https://github.com/jrotty/jrotty.github.io在线文档地址:https://docs.qqdie.com/其实github我用的次数不多,不是很熟悉,再加上英语渣,所以以后提交代码什么的可能会出现点疏漏,大家见谅!今天顺便把官方的插件文档也抄了过来,都改成markdown格式了,停费时间的,希望这个文档能帮助到大家。如果您所在的地区上不去github没办法访问在线文档,可以访问http://lab.qqdie.com/docs/ 进行浏览,这个是布置到我自己的主机的,国内应该可以流畅访问。问:都有官方文档了,为什么还要在重复搞个在线文档?答:主要是官方文档手机端访问浏览体验较差,官方文档无人维护,热心博友有心也没有权限维护文...

阅读文章
Typecho插件:文章标签选择器

插件名为tagshelper作用:如下图在文章编辑页面右下方标签位置的下方,会显示出你的博客所有的标签(常用标签会显示在前面),点击任意标签即可为当前文章添加选中的标签。具体操作如下图制作思路我先是通过改程序源码来测试这个功能的,看了一上午一脸懵逼,不知如何插入,后来看了tokeninput.js的使用文档才搞明白,然后拍了个小视频在群里秀了一下,然后就想着怎么做成插件。插件的钩子那个位置肯定没有,于是只好用js代码将这个列表插入到了那个位置,然后调调间距样式等,就ok了。不太会起插件名字,随便写了个tagshelper【标签插入助手】下载地址网盘下载:https://u8315427.ctfile.com/fs/8315427-357531591论坛下载:http://forum.typecho.org/download/file.php?id=1753wiki下载:https://www.typecho.wiki/usr/uploads/2019/03/1463132641.zip题外话其实typecho标签是有自动检索功能的,只需要你输入个开头就可以检索到已有标签了,但是脑子迷糊的博主,记不清自己都有哪些与文章相关的标签,所以有的时候写标签很纠结,而且看到typecho论坛有人跟我有类似的情况,于是觉得制作个插件还是能满足一部分人的需求...

阅读文章
Typecho - QingYi - 简洁的自适应主题

介绍QingYi,基于Flat UI免费版进行深度定制,融合了部分flarum的风格;行动端庄大方,性情温柔活泼,便于调教。这是Typecho为数不多的一款支持多用户的模板,当然你不开启注册功能只是当个人博客模板使用也完全没有问题!展示图首页分类页文章页面独立页面个人资料修改页自适应功能与特性功能介绍自适应响应式设计适配各种大小尺寸屏幕夜间模式pm10点到am6点之间会自动进入夜间模式,同时前台也有夜间模式开关方便用户切换文章目录树文章目录树功能,阅读文章不费力图片惰性加载只加载用户能看到的图片,提高网页加载效率嵌套注册支持前台注册账号登录功能支持前台ajax登录账号轻量级用户中心支持修改个人资料,查看自己文章,后续可能加入管理文章编辑文章等等gravatar评论头像支持选择多种镜像地址QQ评论头像使用qq邮箱进行评论时显示qq头像,且链接不暴露qq号置顶功能置顶功能需配合Sticky文章置顶插件使用,样式已经写好了,直接在插件里输入置顶文章id即可代码高亮支持常见语法的高亮,并显示行号,代码语言等同分类上下篇文章启用该功能后文章页面下方的上一篇文章与下一篇文章,将只展现当前文章分类下的文章ajax评论功能无刷新评论,可以放心在文章中插入音乐,而不用担心评论后歌曲会断掉评论表情功能评论时支持插入模板内置表情,提高用户粘性垃圾评论过滤功能可以屏蔽非中文评论,支持过滤网址,设置屏蔽昵称,设置屏蔽邮箱等分类展示页面展示分类名字,分类描述,以及当前分类的最新一篇文章回复可见功能文章内设置后,游客或者其他用户需要评论才能看到隐藏内容,文章作者则可以直接观看seo优化支持自定义文章的描述与关键字[暂未上线功能]主题出售收费是为了后续更好的维护,感谢您的支持。主题售价:系列售价 QingYi¥88 QingYi For Typecho 主题不适用于 WordPress免费试用版:https://www.lanzous.com/i3lqimf内容:您可以获得本款主题的最新版,并将获得后续更新支持。注意事项:购买主题后,您将获得主题源代码,主题不加密,不绑定域名,购买后可随意使用,但不得分发、转售。因主题是可复制的商品,在代码发出后不予退款,敬请谅解。售后支持主题免费升级,但不提供免费的个性化定制服务。什么是分发?指以不盈利的方式赠与他人,或在网络等其他渠道派发的行为!什么是转售?指以盈利为目的将模板低价或者高价卖出的行为!每份主题我都会加入一些特定标识,这样一旦出现分发转售的行为,能快速定位用户,并取消该用户的售后服务。购买方式:扫码付款后,将订单账号以邮件方式发送到邮箱bssf@qq.com,并说明购买QingYi主题即可,或直接联系下方联系QQ。人工购买方式↓↓↓QQ:485868654 或 点击直接 QQ 咨询支付宝:bssf@qq.com更新日志2019-10-11更新至1.4.6版本将超链接的绿色改为淡蓝色,绿按钮改为深蓝色,夜间模式样式优化2019-08-28更新至1.4.5版本1,删除frame标签尺寸控制,解决网易云播放器显示问题2,修复移动端菜单栏横向滚动问题3,ajax评论的评论过滤代码缩减一倍4,模板设置支持设置全站文章登录可见5,文章自定义字段支持为单个文章设置登录可见6,模板帮助文字优化7,修复chrome76的ajax评论时重复显示bug8,对typecho评论存在的xss问题进行拦截,提高安全性9,修复分类超过9个后没有颜色的问题2019-07-31更新至1.3.8版本1,支持自定义文章描述与关键字2,支持邀请码插件详见帮助3,修正分类页面部分显示bug4,友链页面适配友链插件详见帮助5,修复一处id重复导致的谷歌报错6,Rdog插件升级代码更加规范,注:此版本模板不兼容旧版Rdog插件7,加入关闭头图功能,关闭后部分外观会有些许不同8,logo设置功能加入9,模板设置帮助页面边距调整更多更新日志请前往这里...

阅读文章
QingYi - 主题更新日志

更新日志2019-08-28更新至1.4.5版本1,删除frame标签尺寸控制,解决网易云播放器显示问题2,修复移动端菜单栏横向滚动问题3,ajax评论的评论过滤代码缩减一倍4,模板设置支持设置全站文章登录可见5,文章自定义字段支持为单个文章设置登录可见6,模板帮助文字优化7,修复chrome76的ajax评论时重复显示bug8,对typecho评论存在的xss问题进行拦截,提高安全性9,修复分类超过9个后没有颜色的问题2019-07-31更新至1.3.8版本1,支持自定义文章描述与关键字2,支持邀请码插件详见帮助3,修正分类页面部分显示bug4,友链页面适配友链插件详见帮助5,修复一处id重复导致的谷歌报错6,Rdog插件升级代码更加规范,注:此版本模板不兼容旧版Rdog插件7,加入关闭头图功能,关闭后部分外观会有些许不同8,logo设置功能加入9,模板设置帮助页面边距调整2019-07-09更新至1.3.0版本1,强制将较新的评论显示在最前面2,修正评论区登录与注册链接调用后台地址问题3,前台发布文章功能加入4,加强评论显示qq头像兼容性5,主题定制插件Rdog升级,前台发布文章成功后挑战至首页2019-06-07更新至1.2.7版本1,回复可见功能与ajax完美兼容,回复后就能看到回复可见文章,无需刷新页面2,修复登录用户看不到回复可见内容的bug3,回复可见样式微调4,模板展示页面加入提示,提醒用户模板文件夹名字要用“Qingyi”区分大小写5,评论者标志加入6,修复多用户状态下,无文章的用户登录状态下前台不能修改个人资料bug7,修复多用户状态下,主页间互相访问信息显示错误的bug8,支持全局或者单独文章关闭游客评论9,回复可见样式优化,精简框架上的一点点css10,首页文章列表点击改为新窗口打开11,前台注册功能12,作者资料修改页面提示css样式微调13,typecho提醒信息以弹窗形式发出,如果注册成功后的提醒,个人资料修改成功的提醒等14,修复分类页面,某分类没有文章导致的显示残缺问题15,修复自定义footer处使用导致的布局小bug2019-05-25更新至1.2.1版本1,修复多用户状态下,用户回复可见功能bug2,回复可见内容取消居中,保留原汁原味的内容格式3,文章目录树不存在时,优化浏览体验4,加入模板提示【模板文件夹名字要求为“ Qingyi ”注意大小写】2019-05-20更新至1.2.0版本1,加入注册按钮【完成】2,设置处加入head插入点,方便用户放置百度统计【完成】3,首页列表加入评论数显示【完成】4,夜间模式css优化,补充遗漏位置【完成】5,文章列表翻页按钮改为点击加载更多【完成】6,评论列表翻页按钮改为点击加载更多【完成】7,QQ头像api重写,提高效率,解决上一版本api被腾讯办掉导致博客卡顿的问题【完成】8,懒加载js与qq头像获取js融合,js代码梳理,提升效率,加入注释【完成】9,增加回复可见功能【完成】(多用户使用typecho时,通过查询文章回复的邮箱进行判断会有小的问题,比如用户改了自己的邮箱地址,还有优化空间)10,登录更符合直觉,ajax登录支持回车提交登录【完成】11,作者主页页面微调【完成】12,引入弹窗插件,ajax的提示应用该插件【完成】13,修正后台编辑器移动端显示小问题【完成】14,后台编辑器加入回复可见按钮,方便使用【完成】2019-05-06更新至1.1.9版本1,ajax评论功能【完成】2,首页头像图片懒加载,同时更换懒加载动画【完成】3,代码高亮样式优化【完成】4,评论样式小优化【完成】5,评论过滤功能【完成】6,评论表情功能【完成】7,评论头像地址不暴露用户QQ号,保护用户隐私【完成】8,顶部独立页面顶部布局优化【完成】9,夜间模式【测试版】10,加入文章阅读次数功能【完成】11,代码压缩功能加入【完成】2019-04-13更新至1.1.0版本1,评论列表中@锚点定位以及评论翻页后的锚点定位被顶栏遮盖问题【已修复】2,目录树定位不精准问题【已修复】3,文章和独立页面图片取消预加载【完成】4,广告位增加【完成】5,代码高亮语言显示样式调整【完成】6,增加同分类上下篇功能【完成】7,模板图标重新配置,内置了88个常见图标【完成】8,更换了默认的头图,以及模板封面【完成】9,搜索功能记录搜索关键词【完成】10,登录功能小bug修复【完成】11,邮箱头像源增加1个【完成】12,评论回复与取消回复按钮交互优化【完成】13,模板后台启用样式微调【完成】14,待审核评论提示加入【完成】15,首页文章不显示待审核评论者的信息【完成】16,大量细节进行优化【完成】2019-04-03更新至1.0.6版本1.0.6版本1,首页文章列表,评论者与评论时间显示区域,如果文章没有任何人评论,显示会很诡异!【已修复】2,模板函数,输出头像函数有两个,可优化成1个,减少代码量【已完成】3,登录框手机端兼容问题【已修复】4,删除残留百度统计代码【已处理】5,评论代码div嵌套问题,以及冗余代码【已处理】6,代码高亮功能【已添加】7,一些小的细节优化【已处理多处】8,评论头像ajax加载,修正评论细节问题【已处...

阅读文章
Typecho完美实现回复可见功能

之前转载过这么一篇文章《typecho非插件实现回复可见功能》,可以实现回复可见功能,但是有个问题,在文章列表页展示文章缩略内容时,如果回复可见内容刚好在缩略内容的位置上时,就会暴露出来,同时Feed里面也会暴露这个问题,那么如何解决呢,下面请看如何几近完美的实现回复可见功能:步骤一就是《typecho非插件实现回复可见功能》里面的内容将post.php中的<?php $this->content(); ?>换成<?php $db = Typecho_Db::get(); $sql = $db->select()->from('table.comments') ->where('cid = ?',$this->cid) ->where('mail = ?', $this->remember('mail',true)) ->where('status = ?', 'approved') //只有通过审核的评论才能看回复可见内容 ->limit(1); $result = $db->fetchAll($sql); if($this->user->hasLogin() || $result) { $content = preg_replace("/\[hide\](.*?)\[\/hide\]/sm",'<div class="reply2view">$1</div>',$this->content); } else{ $content = preg_replace("/\[hide\](.*?)\[\/hide\]/sm",'<div class="reply2view">此处内容需要评论回复后方可阅读。</div>',$this->content); } echo $content ?>步骤二解决缩略内容和feed暴露问题。在functions.php中加入如下代码即可Typecho_Plugin::factory('Widget_Abstract_Contents')->excerptEx = array('myyodux','one'); Typecho_Plugin::factory('Widget_Abstract_Contents')->contentEx = array('myyodux','one'); class myyodux { public static function one($con,$obj,$text) { $text = empty($text)?$con:$text; if(!$obj->is('single')){ $text = preg_replace("/\[hide\](.*?)\[\/hide\]/sm",'',$text); } return $text; } }就是用插件接口,在缩略内容输出之前,隐藏掉或者替换掉回复可见内容,同时使用if判断,来针对非single页面进行隐藏。步骤三使用方法在写文章需要隐藏部分内容时用以下写法(去掉@)[@hide]要隐藏的内容[/hide]css参考样式.reply2view { background:#f8f8f8; padding:10px 10px 10px 40px; position:relative }心里话在写yodu模板的时候,因为网友需要,我就找了教程把回复可见功能加上了,当时也是知道这个东西的bug,但是自己不会修,最近写了个typecho的搜索插件,看了一些typecho的插件接口和源码,发现用插件接口很好的就能解决了,于是乎水文一下,希望能帮助到一些...

阅读文章
Typecho搜索插件发布说明

sosotypecho程序的搜索增强插件项目地址https://github.com/jrotty/soso使用说明下载后将soso文件夹传到typecho目录下,然后启动插件,打开插件设置,根据文字提示设置即可。功能介绍搜索模式:有常规搜索和仅搜索文章标题两种模式。搜索过滤:可以设置一些分类,让其不被搜索到。搜索高亮:搜索结果页面,文章标题和缩略内容中的关键字高亮显示。注意:缩略内容使用<?php $this->excerpt(140, '...'); ?>来截取的并不会高亮,因为这个地方没有插件接口,可以将这个函数换成插件内置的方法<?php $this->excerpts($this,140); ?>,也可以这样写个判断<?php $all = Typecho_Plugin::export(); if(array_key_exists('Soso', $all['activated'])): ?> <?php $this->excerpts($this,140); ?>//插件启动就调用插件的这个方法 <?php else: ?> <?php $this->excerpt(140, '...'); ?>//插件没启动就调用默认方法 <?php endif; ?>更新日志2019.8.19升级为1.1.0版本优化了高亮缩略内容的语法较少一个设置项,支持根据分类id进行搜索内容(需模板配合)2019.4.29升级为1.0.6版本修复部分情况下文章重复输出问题2018.12.9升级为1.0.5版本修复插件间的兼容性问题,同时针对Meting插件语法不进行关键词高亮。插件背后的故事其实这个插件早就有点想法了,但是自己渣,文档看不懂,所以最基本的搜索功能都研究了好多天,本来是想顺便解决搜索会过滤空格的问题,但是插件上我没有做到。还想着前台指定分类进行搜索,结果也没做到。Typecho开发版搜索已经不会过滤掉空格了,插件也支持指定分类进行搜索后来想到模板群的群友说wp可以设置只搜索文章标题,typecho不知道怎么弄,当时我告诉他修改源代码的某个位置。于是这个插件就把这个功能加上了。搜索结果屏蔽某些分类,这个功能其实是我自己比较需要的,有些东西没必要展现到搜索结果里。因为看过一极乐博客的这个文章《javascript实现typecho搜索结果关键词高亮显示》,所以就加了个搜索词高亮显示的功能,默认就是显示红色。感谢:感谢香菇帮助修复bug,感谢Rakiy的CateFilter作为参...

阅读文章
Typecho常用统计

常用统计一些常用统计<?php Typecho_Widget::widget('Widget_Stat')->to($stat); ?> 文章总数:<?php $stat->publishedPostsNum() ?>篇 分类总数:<?php $stat->categoriesNum() ?>个 评论总数:<?php $stat->publishedCommentsNum() ?>条 页面总数:<?php $stat->publishedPagesNum() ?>个 当前作者的文章总数:<?php $stat->myPublishedPostsNum() ?>篇程序自带的统计函数详细具体参数如下说明代码获取已发布的文章数目publishedPostsNum获取待审核的文章数目waitingPostsNum获取草稿文章数目draftPostsNum获取当前用户已发布的文章数目myPublishedPostsNum获取当前用户待审核文章数目myWaitingPostsNum获取当前用户草稿文章数目myDraftPostsNum获取当前用户已发布的文章数目currentPublishedPostsNum获取当前用户待审核文章数目currentWaitingPostsNum获取当前用户草稿文章数目currentDraftPostsNum获取已发布页面数目publishedPagesNum获取草稿页面数目draftPagesNum获取当前显示的评论数目publishedCommentsNum获取当前待审核的评论数目waitingCommentsNum获取当前垃圾评论数目spamCommentsNum获取当前用户显示的评论数目myPublishedCommentsNum获取当前用户显示的评论数目myWaitingCommentsNum获取当前用户显示的评论数目mySpamCommentsNum获取当前文章的评论数目currentCommentsNum获取当前文章显示的评论数目currentPublishedCommentsNum获取当前文章显示的评论数目currentWaitingCommentsNum获取当前文章显示的评论数目currentSpamCommentsNum获取分类数目categoriesNum该统计函数来自源码typecho/var/Widget/Stat.ph...

阅读文章
Typecho前台登录/注册

Typecho前台登录前言前台登录是个很方便的功能,无论是作为个人博客还是多人博客,前台登录都会节省用户时间。代码<form action="<?php $this->options->loginAction()?>" method="post" name="login" rold="form"> <input type="hidden" name="referer" value="<?php $this->options->siteUrl(); ?>"> <input type="text" name="name" autocomplete="username" placeholder="请输入用户名" required/> <input type="password" name="password" autocomplete="current-password" placeholder="请输入密码" required/> <button type="submit">登录</button> </form>其中 referer 这个input就指明了登录成功后的跳转位置,现在默认的首页,可以修改value的值来自行定义登录成功跳转得地址。Typecho前台注册代码<form action="<?php $this->options->registerAction();?>" method="post" name="register" role="form"> <input type="hidden" name="_" value="<?php echo $this->security->getToken($this->request->getRequestUrl());?>"> 用户名<input type="text" name="name"> 邮箱:<input type="email" id="mail" name="mail" > <button type="submit" name="loginsubmit" value="true">注册</button> </form>说明用户进入注册页面,只会要求用户填写用户名和邮箱,点击注册按钮后会跳转到程序后台,此时会提示被分配了个临时密码,同时提示用户修改默认密码,填写个人信息如昵称,个人主页等。扩展如果也想像前台登录一样,登陆后自定义跳转页面,需要修改/var/Widget/Register.php这个文件,倒数第三行左右的这个代码$this->response->redirect($this->options->adminUrl);换成如下代码if (NULL != $this->request->referer) { $this->response->redirect($this->request->referer); } else{ $this->response->redirect($this->options->adminUrl); }这样在form里插入<input type="hidden" name="referer" value="跳转地址">即...

阅读文章
typecho前台修改个人设置

typecho皮肤中的author.php就是用户的个人中心,那么如何用它实现用户在前台修改个人信息呢?出人意料的非常简单,只要把后台里面个人设置里面的这些代码搬进来就行了。<section> <h3><?php _e('个人资料'); ?></h3> <ul><li> <label class="typecho-label" for="screenName-0-1"> 用户名</label><?php $this->user->name() ?></li></ul> <?php Typecho_Widget::widget('Widget_Users_Profile')->profileForm()->render(); ?> </sction> <section id="change-password"> <h3><?php _e('密码修改'); ?></h3> <?php Typecho_Widget::widget('Widget_Users_Profile')->passwordForm()->render(); ?> </sction> <?php Typecho_Widget::widget('Widget_Users_Profile')->personalFormList(); ?>但是直接用的话,还要考虑一些事情,比如游客访问进来如果也这样显示岂不是很尴尬,A用户访问B用户时显示也会变尴尬,所以需要加入判断。<?php if($this->user->uid==$this->author->uid && $this->user->hasLogin()): ?> 这里填写上边的代码即可,效果就是只有用户本人访问自己的个人中心,才会显示修改设置 <?php endif; ?>代码中不含有样式,需要自己美化下,具体有什么效果,如下图所...

阅读文章
1/4