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

实现分页主要分为两大步:
- 修改模板文件:在推荐文章列表的循环前后,加入分页的HTML代码。
- 修改PHP源码:找到处理
likearticle标签的核心PHP文件,使其支持分页逻辑。
第一步:修改模板文件 (article_article.htm)
这是最直观的一步,你需要在你希望显示分页导航的地方,加入标准的分页代码。
-
找到你的文章内容页模板:通常是
/templets/default/article_article.htm。 -
定位
likearticle:找到你之前写好的likearticle标签,它大概长这样:
(图片来源网络,侵删){dede:likearticle row='10' titlelen='42'} <li> <a href="[field:arcurl/]">[field:title/]</a> </li> {/dede:likearticle} -
在
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文件,并修改它。

-
找到核心PHP文件:
likearticle标签的解析逻辑通常在/include/taglib/likearticle.lib.php文件中。 -
备份原文件:在进行任何修改之前,请务必备份这个文件!以防修改出错导致网站问题。
-
修改
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; } - 接收来自模板的
代码修改详解:
-
获取分页参数:
$pagesize = isset($pagesize) ? $pagesize : $row;:允许你在模板中通过pagesize='5'来指定每页显示的数量,如果不指定,则默认使用row的值。$pagelang = isset($pagelang) ? $pagelang : 'pageno';:定义URL中页码的参数名,默认是pageno,你可以通过pagelang='p'来修改它,p/2.html。
-
获取当前页码:
$page = isset($refObj->PageNo) ? intval($refObj->PageNo) : 1;:从refObj对象中获取当前页码,这个PageNo是DedeCMS分页系统自动传递过来的。
-
计算总记录数和总页数:
- 先执行一个
COUNT(*)查询,获取符合条件的文章总数$totalcount。 $totalpage = ceil($totalcount / $pagesize);:用总数除以每页显示数,得到总页数。
- 先执行一个
-
修改SQL查询:
LIMIT $offset, $pagesize;:这是分页的关键。offset是偏移量,计算公式为($page - 1) * $pagesize,它告诉数据库从哪条记录开始取,取多少条。
-
将分页信息传递给模板:
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中设置好的分页数据。
总结与注意事项
- 缓存问题:修改了PHP文件后,如果后台开启了模板缓存,可能需要清除缓存(后台 -> 系统 -> 站点清理 -> 清除所有HTML缓存)才能看到效果。
- 文件路径:确保你修改的PHP文件路径是正确的,不同版本的DedeCMS可能文件位置略有不同,但
/include/taglib/是最常见的位置。 - 性能考虑:
likearticle本身需要对数据库进行查询,再加上分页的COUNT(*)查询,如果网站流量很大,或者相关文章非常多,可能会对数据库造成一定压力,建议合理设置pagesize的值。 - 代码兼容性:我提供的PHP代码是通用性较强的版本,适用于大多数DedeCMS 5.x版本,如果你使用的是非常古老的版本,可能需要微调。
通过以上步骤,你就可以成功地为 DedeCMS 的 likearticle 标签添加分页功能了。
