commentsMaxNestingLevels=999; Helper::options()->commentsOrder="DESC"; } /** * 文章与独立页自定义字段 */ function themeFields(Typecho_Widget_Helper_Layout $layout){ $zhaiyao=new Typecho_Widget_Helper_Form_Element_Radio('zhaiyao',array('0'=>_t('不启用'),'1'=>_t('启用')),'0',_t('智能摘要'),_t("请选择是否启用AI摘要,默认不启用")); $layout->addItem($zhaiyao); $banner=new Typecho_Widget_Helper_Form_Element_Textarea("thumbnail",null,null,_t("自定封面"),_t("输入一个图片 url,作为缩略图显示在文章列表,没有则自动从文章附件获取")); $banner->input->setAttribute('style','width:100%;'); $banner->input->setAttribute('placeholder','请输入图片地址...'); $layout->addItem($banner); $description=new Typecho_Widget_Helper_Form_Element_Textarea("description",null,null,_t("自定摘要"),_t("输入文章摘要,则显示自定义摘要。如果留空,将自动从内容中截取")); $description->input->setAttribute('style','width:100%;height:100px;'); $description->input->setAttribute('placeholder','请输入文章摘要...'); $layout->addItem($description); // 🔧 关键修复:添加编辑摘要字段 if (class_exists('EditHistory_Plugin')) { EditHistory_Plugin::addFieldToLayout($layout); } // 在themeFields函数中添加: if (class_exists('ArticleWeather_Plugin')) { ArticleWeather_Plugin::addFieldToLayout($layout); } } $custom_functions=__DIR__."/custom/functions.php"; if(file_exists($custom_functions)){ include_once$custom_functions; } //读者墙 注册会员数排序 2023.8.4 随机排序 function getusers($limit=24,$masterEmail='zhaowenyangld@126.com'){ $db=Typecho_Db::get(); $sql=$db->select('COUNT(screenName) AS cnt','screenName','url','mail')->from('table.users')->where('mail != ?',$masterEmail)->group('mail')->order('RAND()',Typecho_Db::SORT_DESC)->limit($limit); $result=$db->fetchAll($sql); if($result){ foreach($result as $value){ if(!$value['url']){ $value['url']='mailto:'.$value['mail']; } $mostactive.='
  • '.$value['screenName'].'VIP
  • '; } echo$mostactive; } } //读者墙 按评论数排序 2023.8.4 随机排序 function getMostVisitors($limit=96,$masterEmail='zhaowenyangld@126.com'){ $db=Typecho_Db::get(); $sql=$db->select('COUNT(author) AS cnt','author','url','mail')->from('table.comments')->where('mail != ?',$masterEmail)->group('mail')->order('RAND()',Typecho_Db::SORT_DESC)->limit($limit); $result=$db->fetchAll($sql); if($result){ foreach($result as $value){ if(!$value['url']){ $value['url']='mailto:'.$value['mail']; } $mostactive.='
  • '.$value['author'].'+'.$value['cnt'].'
  • '; } echo$mostactive; } } //读者墙 按评论数排序 2023.8.4,2024.3.19 按评论数排序 function getMostVisitorscnt($limit=32,$masterEmail='zhaowenyangld@126.com'){ $db=Typecho_Db::get(); $sql=$db->select('COUNT(author) AS cnt','author','url','mail')->from('table.comments')->where('mail != ?',$masterEmail)->group('mail')->order('cnt',Typecho_Db::SORT_DESC)->limit($limit); $result=$db->fetchAll($sql); if($result){ foreach($result as $value){ if(!$value['url']){ $value['url']='mailto:'.$value['mail']; } $mostactive.='
  • '.$value['author'].'+'.$value['cnt'].'
  • '; } echo$mostactive; } } //读者墙 最近访客 2024.2.21 再次启用,有问题并不是最新的,已修复问题2024.3.19 function getRecentVisitors($limit=24,$masterEmail='zhaowenyangld@126.com'){ $db=Typecho_Db::get(); $sql=$db->select('COUNT(author) AS cnt','author','url','mail')->from('table.comments')->group('mail')->where('mail != ?',$masterEmail)->limit($limit)->order('MAX(created)',Typecho_Db::SORT_DESC); $result=$db->fetchAll($sql); if($result){ foreach($result as $value){ if(!$value['url']){ $value['url']='mailto:'.$value['mail']; } $count=$db->fetchRow($db->select('COUNT(*)')->from('table.comments')->where('status = ?','approved')->where('mail = ?',$value['mail'])); $commentnum=$count['COUNT(*)']; $mostactive.='
  • '.$value['author'].'+'.$value['cnt'].'
  • '; } echo$mostactive; } } function getRecentVisitorschuci($limit=20,$masterEmail='zhaowenyangld@126.com'){ $db=Typecho_Db::get(); $sql=$db->select('COUNT(author) AS cnt','author','url','mail')->from('table.comments')->where('mail != ?',$masterEmail)->group('mail')->having('COUNT(*) = 1')->limit($limit)->order('MAX(created)',Typecho_Db::SORT_DESC); $result=$db->fetchAll($sql); if($result){ $mostactive=''; foreach($result as $value){ if(!$value['url']){ $value['url']='mailto:'.$value['mail']; } $mostactive.='
  • '.htmlspecialchars($value['author']).'+'.$value['cnt'].'
  • '; } echo$mostactive; } } /** * 评论者认证等级 + 身份 * 2023.8.4 * @author Chrison * @access public * @param str $email 评论者邮址 * @return result */ function commentApprove($widget,$email=NULL){ $result=array("state"=>-1,"isAuthor"=>0,"userLevel"=>'',"userDesc"=>'',"bgColor"=>'',"commentNum"=>0); if(empty($email))return$result; $result['state']=1; $master=array('710062962@qq.com','zhaowenyangld@126.com'); if($widget->authorId==$widget->ownerId){ $result['isAuthor']=1; $result['userLevel']='( L10 )'; $result['userDesc']='很帅的博主'; $result['bgColor']='#dd3333'; $result['commentNum']=999; }else if(in_array($email,$master)){ $result['userLevel']='( L10 )'; $result['userDesc']='相亲相爱的一家人'; $result['bgColor']='#dd3333'; $result['commentNum']=888; }else{ $db=Typecho_Db::get(); $commentNumSql=$db->fetchAll($db->select(array('COUNT(cid)'=>'commentNum'))->from('table.comments')->where('mail = ?',$email)); $commentNum=$commentNumSql[0]['commentNum']; $linkSql=$db->fetchAll($db->select()->from('table.links')->where('user = ?',$email)); if($commentNum==1){ $result['userLevel']='( L1 )'; $result['bgColor']='#999999'; $userDesc='你已经向目的地迈出了第一步!'; }else{ if($commentNum<30&&$commentNum>1){ $result['userLevel']='( L2 )'; $result['bgColor']='#FF6600'; }elseif($commentNum<90&&$commentNum>=30){ $result['userLevel']='( L3 )'; $result['bgColor']='#A0DAD0'; }elseif($commentNum<270&&$commentNum>=90){ $result['userLevel']='( L4 )'; $result['bgColor']='#A0DAD0'; }elseif($commentNum<810&&$commentNum>=270){ $result['userLevel']='( L5 )'; $result['bgColor']='#A0DAD0'; }elseif($commentNum<1000&&$commentNum>=810){ $result['userLevel']='( L6 )'; $result['bgColor']='#A0DAD0'; }elseif($commentNum>=1000){ $result['userLevel']='( L7 )'; $result['bgColor']='#A0DAD0'; } $userDesc='你已经向目的地前进了'.$commentNum.'步!'; } if($linkSql){ $result['userLevel']='L1'; $result['bgColor']='#21b9bb'; $userDesc='🔗'.$linkSql[0]['description'].' ✌️'.$userDesc; } $result['userDesc']=$userDesc; $result['commentNum']=$commentNum; } return$result; } /** * 判断时间区间 * * 2023.8.8 */ function getTimeLabel($from){ $timeDiff=time()-$from; if($timeDiff<24*60*60){ return'新鲜出炉'; }elseif($timeDiff<7*24*60*60){ return'有点过时'; }else{ return'成年旧货'; } } /* * owo 表情 2023.8.29 https://fantao.me/7.html#comment-367 */ function parsePaopaoBiaoqingCallback($match){ return''; } function parseAruBiaoqingCallback($match){ return''; } function parseBiaoQing($content){ $content=preg_replace_callback('/\:\:\(\s*(呵呵|哈哈|吐舌|太开心|笑眼|花心|小乖|乖|捂嘴笑|滑稽|你懂的|不高兴|怒|汗|黑线|泪|真棒|喷|惊哭|阴险|鄙视|酷|啊|狂汗|what|疑问|酸爽|呀咩爹|委屈|惊讶|睡觉|笑尿|挖鼻|吐|犀利|小红脸|懒得理|勉强|爱心|心碎|玫瑰|礼物|彩虹|太阳|星星月亮|钱币|茶杯|蛋糕|大拇指|胜利|haha|OK|沙发|手纸|香蕉|便便|药丸|红领巾|蜡烛|音乐|灯泡|开心|钱|咦|呼|冷|生气|弱|吐血)\s*\)/is','parsePaopaoBiaoqingCallback',$content); $content=preg_replace_callback('/\:\@\(\s*(高兴|小怒|脸红|内伤|装大款|赞一个|害羞|汗|吐血倒地|深思|不高兴|无语|亲亲|口水|尴尬|中指|想一想|哭泣|便便|献花|皱眉|傻笑|狂汗|吐|喷水|看不见|鼓掌|阴暗|长草|献黄瓜|邪恶|期待|得意|吐舌|喷血|无所谓|观察|暗地观察|肿包|中枪|大囧|呲牙|抠鼻|不说话|咽气|欢呼|锁眉|蜡烛|坐等|击掌|惊喜|喜极而泣|抽烟|不出所料|愤怒|无奈|黑线|投降|看热闹|扇耳光|小眼睛|中刀)\s*\)/is','parseAruBiaoqingCallback',$content); return$content; } /*输出作者发表的评论 2024.1.6*/ class Widget_Post_AuthorComment extends Widget_Abstract_Comments{ public function execute(){ global$AuthorCommentId; $select=$this->select()->limit($this->parameter->pageSize)->where('table.comments.status = ?','approved')->where('table.comments.authorId = ?',$AuthorCommentId)->where('table.comments.type = ?','comment')->order('table.comments.coid',Typecho_Db::SORT_DESC); $this->db->fetchAll($select,array($this,'push')); } } //获得读者墙(按访问时间排序)getFriendWall函数名后加了个b,以便分别调用,2024.3.19 王语双博客 function getFriendWallb(){ $db=Typecho_Db::get(); $sql=$db->select('COUNT(author) AS cnt','max(coid) ttt','author','url','mail')->from('table.comments')->where('status = ?','approved')->where('type = ?','comment')->where('authorId = ?','0')->where('mail != ?','80060631@qq.com')->group('author')->order('ttt',Typecho_Db::SORT_DESC)->limit('12'); $result=$db->fetchAll($sql); if(count($result)>0){ $maxNum=$result[0]['cnt']; foreach($result as$value){ $mostactive.='
  • '.$value['author'].'+'.$value['cnt'].'
    '.$value['url'].'
  • '; } echo$mostactive; } } /*输出作者其他信息 2024.1.6*/ function userok($id){ $db=Typecho_Db::get(); $userinfo=$db->fetchRow($db->select()->from('table.users')->where('table.users.uid=?',$id)); return$userinfo; } /** * 计算相对时间(评论相对于文章发布时间) * @param int $commentTimestamp 评论时间戳 * @param int $postTimestamp 文章发布时间戳 * @param bool $isAdmin 是否为管理员 * @return string 格式化后的相对时间 */ function getRelativeTime($commentTimestamp, $postTimestamp = null, $isAdmin = false) { // 如果是管理员,只返回空字符串 if ($isAdmin) { return ""; } // 如果没有传入文章时间,尝试从全局获取当前文章时间 if ($postTimestamp === null) { global $postCreated; if (isset($postCreated)) { $postTimestamp = $postCreated; } else { // 如果无法获取文章时间,返回空 return ""; } } // 确保评论时间在文章时间之后 if ($commentTimestamp <= $postTimestamp) { return "刚刚发文"; } $diff = $commentTimestamp - $postTimestamp; // 计算时间差 $minute = 60; $hour = 60 * $minute; $day = 24 * $hour; $month = 30 * $day; $year = 365 * $day; if ($diff < $minute) { return "发文" . $diff . "秒后"; } elseif ($diff < $hour) { $minutes = floor($diff / $minute); return "发文" . $minutes . "分钟后"; } elseif ($diff < $day) { $hours = floor($diff / $hour); return "发文" . $hours . "小时后"; } elseif ($diff < $month) { $days = floor($diff / $day); return "发文" . $days . "天后"; } elseif ($diff < $year) { $months = floor($diff / $month); return "发文" . $months . "月后"; } else { $years = floor($diff / $year); return "发文" . $years . "年后"; } } /** * 获取人性化的时间显示(包含相对时间) * @param int $commentTimestamp 评论时间戳 * @param bool $isAdmin 是否为管理员 * @return string 格式化时间 */ function getHumanizedTimeWithRelative($commentTimestamp, $isAdmin = false) { // 获取文章发布时间 global $postCreated; // 原始的时间格式 $original = date('Y-m-d H:i:s', $commentTimestamp); // 计算相对时间 $relative = getRelativeTime($commentTimestamp, $postCreated, $isAdmin); // 如果是管理员,不显示括号内容 if ($isAdmin || empty($relative)) { return $original; } // 组合返回,括号前后加空格 return $original . ' ( ' . $relative . ' )'; } /** * 专门用于评论的时间显示函数 * @param int $commentTimestamp 评论时间戳 * @param bool $isAdmin 是否为管理员 * @return string 格式化时间 */ function getCommentTime($commentTimestamp, $isAdmin = false) { global $postCreated; if ($isAdmin) { // 管理员只显示详细时间 return date('Y-m-d H:i:s', $commentTimestamp); } else { // 普通用户显示详细时间 + 相对时间 $original = date('Y-m-d H:i:s', $commentTimestamp); $relative = getRelativeTime($commentTimestamp, $postCreated, false); return $original . ' ( ' . $relative . ' )'; } } /** * 获取简单的相对时间(旧版兼容函数) * @param int $commentTimestamp 评论时间戳 * @return string 相对时间 */ function getSimpleRelativeTime($commentTimestamp) { global $postCreated; return getRelativeTime($commentTimestamp, $postCreated, false); } /** * 获取评论的实际序号(解决ID不连续问题) * @param int $coid 评论ID * @return int 实际序号 */ function getActualCommentNumber($coid) { $db = Typecho_Db::get(); // 查询已审核评论的序号 $result = $db->fetchRow($db->select('COUNT(*) as cnt') ->from('table.comments') ->where('coid <= ?', $coid) ->where('status = ?', 'approved') ->where('type = ?', 'comment')); return $result['cnt'] ?: 0; } /** * 获取文章评论的实际序号 * @param int $coid 评论ID * @param int $cid 文章ID * @return int 文章内序号 */ function getPostCommentNumber($coid, $cid) { $db = Typecho_Db::get(); // 查询当前文章已审核评论的序号 $result = $db->fetchRow($db->select('COUNT(*) as cnt') ->from('table.comments') ->where('cid = ?', $cid) ->where('coid <= ?', $coid) ->where('status = ?', 'approved') ->where('type = ?', 'comment')); return $result['cnt'] ?: 0; } /** * 往年今日文章调用函数 * @param int $created 文章创建时间戳 */ function historyToday($created){ $date=date('m/d',$created); $time=time(); $db=Typecho_Db::get(); $prefix=$db->getPrefix(); $limit=12; $adapter=$db->getAdapterName(); if("Pdo_SQLite"===$adapter||"SQLite"===$adapter){ $sql="SELECT * FROM `{$prefix}contents` WHERE strftime('%m-%d', datetime(created, 'unixepoch')) = '{$date}' AND created <= {$time} AND created != {$created} AND type = 'post' AND status = 'publish' AND (password IS NULL OR password = '') LIMIT {$limit}"; }else{ $sql="SELECT * FROM `{$prefix}contents` WHERE DATE_FORMAT(FROM_UNIXTIME(created), '%m/%d') = '{$date}' AND created <= {$time} AND created != {$created} AND type = 'post' AND status = 'publish' AND (password IS NULL OR password = '') LIMIT {$limit}"; } $result=$db->query($sql); $historyTodayList=[]; if($result instanceof Traversable){ foreach($result as$item){ $item=Typecho_Widget::widget('Widget_Abstract_Contents')->push($item); $title=htmlspecialchars($item['title']); $permalink=$item['permalink']; $historyDate=date('Y-m-d',$item['created']); $historyTodayList[]=['title'=>$title,'permalink'=>$permalink,'date'=>$historyDate]; } } if(!empty($historyTodayList)){ echo""; foreach($historyTodayList as$item){ $displayTitle=mb_strlen($item['title'],'UTF-8')>15?mb_substr($item['title'],0,15,'UTF-8').'...':$item['title']; echo"{$displayTitle}"; } echo""; } } ?>