Phpcms V9 调用全站文章排行的实现方法

发布时间:2019-10-24编辑:脚本学堂
本文介绍下,在phpcms v9中实现调用全站文章排行的方法,有需要的朋友,可以参考下。

默认情况下,Phpcms只支持调用当前文章排行,例如:
 

复制代码 代码示例:
{pc:content  action="hits" catid="$catid" num="10" order="views DESC" cache="3600"}

其中,$catid为待调用栏目的id,若要实现全站调用,需要修改phpcmsmodulescontentclassescontent_tag.class.php文件,找到以下函数:
 

复制代码 代码示例:

/**
 * 排行榜标签
 * @param $data
 */
public function hits($data) {
    $catid = intval($data['catid']);
    if(!$this->set_modelid($catid)) return false;
 
    $this->hits_db = pc_base::load_model('hits_model');
    $sql = $desc = $ids = '';
    $array = $ids_array = array();
    $order = $data['order'];
    $hitsid = 'c-'.$this->modelid.'-%';
    $sql = "hitsid LIKE '$hitsid'";
    if(isset($data['day'])) {
        $updatetime = SYS_TIME-intval($data['day'])*86400;
        $sql .= " AND updatetime>'$updatetime'";
    }
    if($this->category[$catid]['child']) {
        $catids_str = $this->category[$catid]['arrchildid'];
        $pos = strpos($catids_str,',')+1;
        $catids_str = substr($catids_str, $pos);
        $sql .= " AND catid IN ($catids_str)";
    } else {
        $sql .= " AND catid='$catid'";
    }
    $hits = array();
    $result = $this->hits_db->select($sql, '*', $data['limit'], $order);
    foreach ($result as $r) {
        $pos = strpos($r['hitsid'],'-',2) + 1;
        $ids_array[] = $id = substr($r['hitsid'],$pos);
        $hits[$id] = $r;
    }
    $ids = implode(',', $ids_array);
    if($ids) {
        $sql = "status=99 AND id IN ($ids)";
    } else {
        $sql = '';
    }
    $this->db->table_name = $this->tablename;
    $result = $this->db->select($sql, '*', $data['limit'],'','','id');
    foreach ($ids_array as $id) {
        if($result[$id]['title']!='') {
            $array[$id] = $result[$id];
            $array[$id] = array_merge($array[$id], $hits[$id]);
        }
    }
    return $array;
}

修改代码(见注释):
/**
 * 排行榜标签
 * @param $data
 */
public function hits($data) {
    $catid = intval($data['catid']);
 
    $this->hits_db = pc_base::load_model('hits_model');
    $sql = $desc = $ids = '';
    $array = $ids_array = array();
    $order = $data['order'];
    $hitsid = 'c-'.$this->modelid.'-%';
    $sql = "hitsid LIKE '$hitsid'";
    if(isset($data['day'])) {
        $updatetime = SYS_TIME-intval($data['day'])*86400;
        $sql .= " AND updatetime>'$updatetime'";
    }
    if(!empty($catid) && $catid>0) { //添加判断:id是否为空
        if(!$this->set_modelid($catid)) return false;
        if($this->category[$catid]['child']) {
            $catids_str = $this->category[$catid]['arrchildid'];
            $pos = strpos($catids_str,',')+1;
            $catids_str = substr($catids_str, $pos);
            $sql .= " AND catid IN ($catids_str)";
        } else {
            $sql .= " AND catid='$catid'";
        }
    }
    
    $hits = array();
    $result = $this->hits_db->select($sql, '*', $data['limit'], $order);
    foreach ($result as $r) {
        $pos = strpos($r['hitsid'],'-',2) + 1;
        $ids_array[] = $id = substr($r['hitsid'],$pos);
        $hits[$id] = $r;
    }
    $ids = implode(',', $ids_array);
    if($ids) {
        $sql = "status=99 AND id IN ($ids)";
    } else {
        $sql = '';
    }
    $this->db->table_name = $this->tablename;
    $result = $this->db->select($sql, '*', $data['limit'],'','','id');
    foreach ($ids_array as $id) {
        if($result[$id]['title']!='') {
            $array[$id] = $result[$id];
            $array[$id] = array_merge($array[$id], $hits[$id]);
        }
    }
    return $array;
}

修改代码后,无论设置栏目id为0或空,都能调取全站文章排行。

以下是全站排行的调用示例,大家可以参考下。
调用1:
 

复制代码 代码示例:
{pc:content  action="hits" catid="0" num="10" order="views DESC" cache="3600"}

调用2:
 

复制代码 代码示例:
{pc:content  action="hits" num="10" order="views DESC" cache="3600"}