ZblogPHP调用某个分类的随机文章

Zblog 思享 636浏览

随机文章是非常常见的内容模块,有利于提高网站整体的收录。区别于常见的CMS,我发现Zblog并没有表情直接调用随机文章,那么,我们要实现调用某个分类的随机文章,应该怎么实现呢?

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篇文章,然后打乱,参考《zblog获取随机文章

高效版

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高效随机显示代码,比较完美的解决方案

推荐阅读

百度自动推送php实现代码

我们知道主动推送有助于搜索引擎抓取和收录网站内容,wordpress或者主流CMS其实已经集成了推送功能。但是如果我们要定期归还,而不是只在发布的时候推一次。这个功能可以通过结合PHP和Pagoda Panel的预定任务来实现。$api = '百度站......

sql查询zblog数据库中最大文章id

zblog如何检查数据库中的最大id,利用mysql自带的max函数得到最大值?下面的代码“log_id”是指字段名,“id”是指返回给id的查询值,“zbp_post”是指数据表名。$ SQL = " SELECT MAX AS id FROM z......

PHP报错Warning:file_get_contents():SSL operation failed with code 1

今天用在线界面验证百度真假蜘蛛,发现报道有误。错误提示显示SSL操作失败,代码为1。我在网上找到了解决方案,分享给大家参考。警告:file_get_contents():无法在/xxx/xxx.php的第31行启用加密。ip=220.181.108.......