dede likearticle分页怎么实现?

99ANYc3cd6
预计阅读时长 31 分钟
位置: 首页 DEDE建站 正文

likearticle 标签通常用于在文章内容页(article_article.htm)中,根据当前文章的标签、关键词或所属栏目,推荐相关的文章列表,这个列表默认是不分页的,如果文章数量很多,页面会变得很长,影响用户体验。

dede likearticle分页
(图片来源网络,侵删)

实现分页主要分为两大步:

  1. 修改模板文件:在推荐文章列表的循环前后,加入分页的HTML代码。
  2. 修改PHP源码:找到处理 likearticle 标签的核心PHP文件,使其支持分页逻辑。

第一步:修改模板文件 (article_article.htm)

这是最直观的一步,你需要在你希望显示分页导航的地方,加入标准的分页代码。

  1. 找到你的文章内容页模板:通常是 /templets/default/article_article.htm

  2. 定位 likearticle:找到你之前写好的 likearticle 标签,它大概长这样:

    dede likearticle分页
    (图片来源网络,侵删)
    {dede:likearticle row='10' titlelen='42'}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
    </li>
    {/dede:likearticle}
  3. likearticle 标签前后加入分页代码:DedeCMS 有一个内置的分页标签 {dede:pagelist/},我们可以直接使用。

    <!-- 推荐文章标题 -->
    <h3>相关文章</h3>
    <!-- 推荐文章列表开始 -->
    <ul class="like-article-list">
        {dede:likearticle row='10' titlelen='42'}
        <li>
            <a href="[field:arcurl/]">[field:title/]</a>
        </li>
        {/dede:likearticle}
    </ul>
    <!-- 推荐文章列表结束 -->
    <!-- 分页导航代码开始 -->
    <div class="like-article-page">
        {dede:pagelist listsize='4' listitem='info,index,end,pre,next,pageno'}
        {/dede:pagelist}
    </div>
    <!-- 分页导航代码结束 -->

代码解释:

  • {dede:pagelist/}: 这是DedeCMS的分页标签。
  • listsize='4': 显示页码的数量,... 3 4 [5] 6 7 ...
  • listitem='...': 定义要显示的分页元素。
    • info: 显示总页数、文章总数等信息。
    • index: 显示首页链接。
    • pre: 显示上一页链接。
    • next: 显示下一页链接。
    • pageno: 显示页码。
    • end: 显示尾页链接。

你的模板已经准备好接收分页数据了,如果你直接更新页面,会发现分页区域什么都不会显示,因为后端PHP代码还没有支持。


第二步:修改PHP源码

这是实现分页功能的核心,我们需要找到 likearticle 标签对应的PHP文件,并修改它。

dede likearticle分页
(图片来源网络,侵删)
  1. 找到核心PHP文件likearticle 标签的解析逻辑通常在 /include/taglib/likearticle.lib.php 文件中。

  2. 备份原文件:在进行任何修改之前,请务必备份这个文件!以防修改出错导致网站问题。

  3. 修改 likearticle.lib.php 文件: 用代码编辑器(如 VS Code, Sublime Text, Notepad++)打开 /include/taglib/likearticle.lib.php

    我们的目标是:

    • 接收来自模板的 pagesize (每页显示数量) 和 pagelang (页码变量名,默认是 pageno) 参数。
    • 获取当前页码。
    • 使用 GetPageTotal() 函数计算总页数。
    • 使用 GetSql() 函数生成带 LIMIT 子句的SQL查询。
    • 将分页数据传递给模板。

    修改后的完整代码 (likearticle.lib.php) 如下:

    <?php
    if(!defined('DEDEINC')) exit('Request Error!');
    function lib_likearticle(&$ctag,&$refObj)
    {
        global $dsql;
        $attlist = "row|10,col|1,titlelen|30,infolen|160,imgwidth|120,imgheight|90,type|";
        FillAttsDefault($ctag->CAttribute,$attlist);
        extract($ctag->CAttribute, EXTR_SKIP);
        // 新增:获取分页参数
        $pagesize = isset($pagesize) ? $pagesize : $row; // 如果设置了pagesize则使用,否则使用row
        $pagelang = isset($pagelang) ? $pagelang : 'pageno'; // 页码变量名,默认为pageno
        // 获取当前页码
        $page = isset($refObj->PageNo) ? intval($refObj->PageNo) : 1;
        if(empty($page)) $page = 1;
        // 获取总记录数
        $typeid = GetSonIds($refObj->TypeLink->TypeInfos['id'], $refObj->TypeLink->TypeInfos['reid']);
        $addsql = '';
        if($type == 'keyword')
        {
            $keyword = explode(' ', trim($refObj->Fields['keywords']));
            $kword = array();
            foreach($keyword as $k)
            {
                if($k!='') $kword[] = " like '%$k%'";
            }
            if(!empty($kword)) $addsql = " And (".join(' OR ',$kword).")";
        }
        else if($type == 'tag')
        {
            $addsql = " And CONCAT(',',keywords,',') like '%,".$refObj->Fields['tags'].",%'";
        }
        else
        {
            $addsql = " And arc.typeid IN($typeid) And arc.id<".$refObj->Fields['id'];
        }
        // 获取总记录数,用于计算总页数
        $total_query = "SELECT COUNT(*) AS nums FROM `dede_archives` arc WHERE arc.arcrank > -1 $addsql";
        $row = $dsql->GetOne($total_query);
        $totalcount = $row['nums'];
        // 计算总页数
        $totalpage = ceil($totalcount / $pagesize);
        if($page > $totalpage) $page = $totalpage;
        // 修改SQL查询,添加LIMIT
        $offset = ($page - 1) * $pagesize;
        $sql = "SELECT arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,
                tp.namerule,tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath
                FROM `dede_archives` arc
                LEFT JOIN `dede_arctype` tp ON arc.typeid=tp.id
                WHERE arc.arcrank > -1 $addsql
                ORDER BY arc.id DESC
                LIMIT $offset, $pagesize";
        $innertext = trim($ctag->GetInnerText());
        $artlist = '';
        $dsql->SetQuery($sql);
        $dsql->Execute();
        $GLOBALS['autoindex'] = 0;
        while($row = $dsql->GetArray())
        {
            $row['description'] = cn_substr($row['description'], $infolen);
            $row['imglink'] = $row['typeurl'] = GetOneTypeUrlA($row);
            $row['typeurl'] = GetTypeUrl($row['typeid'], $row['typedir'], $row['isdefault'], $row['defaultname'], $row['ispart'],
                $row['namerule'], $row['namerule2'], $row['moresite'], $row['siteurl'], $row['sitepath']);
            $row['fullurl'] = $row['typeurl'];
            $row['picname'] = $row['litpic'];
            $row['stime'] = GetDateMK($row['pubdate']);
            $row['title'] = cn_substr($row['title'], $titlelen);
            if($col==1) {
                $artlist .= "<li><a href='".$row['typeurl']."' title='".$row['title']."'>".$row['title']."</a></li>\r\n";
            } else {
                $GLOBALS['autoindex']++;
                $artlist .= GetTemplets("part/like_article_item.htm", $row);
            }
        }
        // 将分页信息存入环境变量,供pagelist标签使用
        $refObj->Fields['pagecount'] = $totalpage;
        $refObj->Fields('pagecount', $totalpage); // 设置总页数
        $refObj->SetVar('pagecount', $totalpage); // 设置总页数
        $refObj->Fields('totalresult', $totalcount); // 设置总记录数
        // 调用DedeCMS内置的分页函数
        $page_con = '';
        if($totalcount > $pagesize) {
            $page_con = GetPageList($totalpage, $page, $pagelang, '', $listitem, $listsize);
        }
        $artlist = str_replace("{page}", $page_con, $artlist);
        return $artlist;
    }

代码修改详解:

  1. 获取分页参数:

    • $pagesize = isset($pagesize) ? $pagesize : $row;:允许你在模板中通过 pagesize='5' 来指定每页显示的数量,如果不指定,则默认使用 row 的值。
    • $pagelang = isset($pagelang) ? $pagelang : 'pageno';:定义URL中页码的参数名,默认是 pageno,你可以通过 pagelang='p' 来修改它,p/2.html
  2. 获取当前页码:

    • $page = isset($refObj->PageNo) ? intval($refObj->PageNo) : 1;:从 refObj 对象中获取当前页码,这个 PageNo 是DedeCMS分页系统自动传递过来的。
  3. 计算总记录数和总页数:

    • 先执行一个 COUNT(*) 查询,获取符合条件的文章总数 $totalcount
    • $totalpage = ceil($totalcount / $pagesize);:用总数除以每页显示数,得到总页数。
  4. 修改SQL查询:

    • LIMIT $offset, $pagesize;:这是分页的关键。offset 是偏移量,计算公式为 ($page - 1) * $pagesize,它告诉数据库从哪条记录开始取,取多少条。
  5. 将分页信息传递给模板:

    • SetVar()Fields() 方法将总页数 (pagecount) 和总记录数 (totalresult) 存入环境变量,这是 {dede:pagelist/} 标签能够正确显示“共X页/X条记录”等信息的关键。
    • GetPageList():这是DedeCMS内置的生成分页HTML的函数,它接收总页数、当前页、页码变量名等参数,生成分页链接。
    • $artlist = str_replace("{page}", $page_con, $artlist);:将生成的分页HTML代码 {page} 替换为实际的分页链接。

第三步:使用方法

完成以上两步后,你就可以在模板中这样使用 likearticle 分页了:

<h3>相关文章</h3>
{dede:likearticle row='10' titlelen='42' pagesize='5' pagelang='p'}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
    </li>
{/dede:likearticle}
<div class="page">
    {dede:pagelist listsize='4' listitem='info,pageno'}
    {/dede:pagelist}
</div>

解释:

  • pagesize='5': 设置每页显示5条相关文章。
  • pagelang='p': 设置页码参数为 p,所以分页链接会是 .../article.html?p=2 这样的形式。
  • {dede:pagelist/}: 正常使用,它会自动获取 likearticle.lib.php 中设置好的分页数据。

总结与注意事项

  1. 缓存问题:修改了PHP文件后,如果后台开启了模板缓存,可能需要清除缓存(后台 -> 系统 -> 站点清理 -> 清除所有HTML缓存)才能看到效果。
  2. 文件路径:确保你修改的PHP文件路径是正确的,不同版本的DedeCMS可能文件位置略有不同,但 /include/taglib/ 是最常见的位置。
  3. 性能考虑likearticle 本身需要对数据库进行查询,再加上分页的 COUNT(*) 查询,如果网站流量很大,或者相关文章非常多,可能会对数据库造成一定压力,建议合理设置 pagesize 的值。
  4. 代码兼容性:我提供的PHP代码是通用性较强的版本,适用于大多数DedeCMS 5.x版本,如果你使用的是非常古老的版本,可能需要微调。

通过以上步骤,你就可以成功地为 DedeCMS 的 likearticle 标签添加分页功能了。

-- 展开阅读全文 --
头像
dede pagebreak样式如何调整?
« 上一篇 2025-12-12
dede如何获取父页面参数?
下一篇 » 2025-12-12

相关文章

取消
微信二维码
支付宝二维码