ZblogPHP调用某个分类的随机文章
随机文章是非常常见的内容模块,有利于提高网站整体的收录。区别于常见的CMS,我发现zblog并没有表情直接调用随机文章,那么,我们要实现调用某个分类的随机文章,应该怎么实现呢?
随机文章
从网上看到的随机文章方案,大部分都是利用GetArticleList函数来实现的,但是我在zblog官方并没有找到这个函数的说明,反而篇文章说GetArticleList随机调用文章,如果网站文章较多会很消耗资源而被禁用。之前实现相关文章用到的GetList 函数,使用跟GetArticleList非常像,于是我就试了试用GetList来实现随机文章
代码
{foreach GetList(10,3,null,null,null,null,array('has_subcate' => true, 'order_custom' => array('rand()'=>' '))) as $related} <li><a href="{$related.Url}" title="{$related.Title}">{$related.Title}</a></li> {/foreach}
说明
分类3(包含子分类)随机排序,调用10篇文章
除此之外,GetList函数还有一个随机参数random,我试了试下面的代码也行
{foreach GetList(null,3,null,null,null,null,array('random' => 10)) as $related} <li><a href="{$related.Url}" title="{$related.Title}">{$related.Title}</a></li> {/foreach}
说明
分类3 抽取10篇。
不过用这种方式,并非真正的随机,而且区分分类时不怎么理想,不过效率感觉挺高的。其实我也是个小白,似懂非懂,仅供参考。
获取随机文章优化版
如果网站的文章数达到一定的数量之后,使用rand()查询会给服务器造成极大的压力,网上也有优化版本
$count = 10; //随机文章数量 $articles = $zbp->GetArticleList('*',null,array(mt_rand(0,1)?'log_ViewNums':'log_PostTime'=>mt_rand(0,1)?'DESC':'ASC'),1000); //这里的1000是获取的文章是数量,可根据你要获取的随机文章数量来决定这个值的大小 shuffle($articles); $posts = count($articles) > $count ? array_chunk($articles,$count)[0] : $articles; foreach ($posts as $post){ echo $post->Title; }
随机使用文章时间或者文章访问量排序,获取1000篇文章,然后打乱。
高效版
function GetRandArticles($count , $where = '' , $real = ''){ global $zbp; //判断一下网站文章总数是不是少于需要的随机数量,少就直接获取文章并返回, if ($zbp->cache->all_article_nums <= $count) return GetList($count); //固定一下要调用的文章数量,如果第一次调用后的数量不够数的话,还得再次调用自身函数,得需要这个值 if (!$real) $real = $count; //定义全局变量,因为可能会需要调用多次本函数,所以得把获得得文章存在全局变量中 if (!isset($GLOBALS['articles'])) $GLOBALS['articles'] = array(); //定义全局变量,同上。将已获得得文章ID存此变量 if (!isset($GLOBALS['randid'])) $GLOBALS['randid'] = array(); //sql where 判定,如果要限定某一个作者,或者说分类,就可以在这里修改 $where = $where?:array(array('=', 'log_Type', '0') , array('=' , 'log_Status' , '0')); //获取所有文章最大ID和最小ID $sql = $zbp->db->sql->Select($zbp->table['Post'] , "MIN(log_ID),MAX(log_ID)" , $where); $res = $zbp->db->Query($sql); $limits = array_values($res[0]); //生成上面最大ID和最小ID之间随机数 $ids = $or = array(); for ($i = 0; $i < $count; $i++) { $ids[] = mt_rand($limits[0],$limits[1]); } //拼接sql or 语句。 foreach ($ids as $id) { //检查一下获得的文章ID有没有在之前就获取到过,防止有重复的ID if (array_search($id,$GLOBALS['randid']) !== false) continue; $or[] = array('log_ID',$id); $GLOBALS['randid'][] = $id; } //也可能本次获取的随机数都是和之前获取的全部重复了,所以得判断一下 if ($or) { $w = $where; $ors = array('array',$or); $w[] = $ors; //获取文章 $res = $zbp->GetArticleList('*' , $w); //将获得得文章存在全局变量中 $GLOBALS['articles'] = array_merge($GLOBALS['articles'],$res); } //计算一下,本次获取的文章数量有没有够数。 if (($count = $real - count($GLOBALS['articles'])) > 0) { //不够数继续调用自身函数再次获取 return GetRandArticles($count , $where , $real); }else{ //够数,返回文章对象数组 return $GLOBALS['articles']; } }
调用代码:
//参数1:文章数量,10为调用的文章数量 foreach (GetRandArticles(10) as $article) { echo $article->Title; } //参数2:$where 数组 (可选),获取分类ID为21下的随机10篇文章 GetRandArticles(10,array(array('=', 'log_Type', '0') , array('=' , 'log_Status' , '0'),array('=' , 'log_CateID' , 21)))
特点说明:
指定分类下的文章数量,不得少于调用文章数,不然会报错!
可能喜欢
-
ZblogPHP调用某个分类的随机文章
随机文章是非常常见的内容模块,有利于提高网站整体的收录。区别于常见的CMS,我发现Zblog并没有表情直接调用随机文章,那么,我们要实现调用某个分类的随机文章,...
zblog教程 2023-05-10 -
zblog提示zblog Fatal error: Allowed memory size of的解决方法
zblog博客程序出现zblogFatalerror:Allowedmemorysizeof134217728bytesexhausted...
zblog教程 2023-05-10 -
myqsl命令删除zblog文章少于2条的tag标签
背景:之前使用腾讯的自动标签,不知道是接入的问题还是腾讯云的问题,产生了很多质量极差的TAG标签,一方面会占用系统资源,另外一方面对于内容的调用造成额外的压力,...
zblog教程 2023-05-10 -
zblog报错Table‘zbp_post’is marked as crashed and should be repaired
近来好多网友问我Z-BlogPHP出现“mysqli_query():(HY000/1194):Table‘zbp_post’ismarkeda...
zblog教程 2023-05-09 -
zblog php获取当前分类子分类的方法
在一些分类比较多的网站常常需要在页面中单独调用处当前分类的子分类比如说在产品中心分类中调用出子分类,就可以详细列出产品的细分目录。下面来介绍一下zblogphp...
zblog教程 2023-05-08 -
zblog调用指定tag文章列表的方法
我们在做zblog主题中常常需要调用指定tag的文章列表,这样可以让网站内容的类别多样,展示更加丰富。用下面的调用代码就可以实现:{$array=Getlist...
zblog教程 2023-05-08