DedePagelist分页完美优化:省略部分页码,告别冗长列表,提升用户体验
文章描述 (Description):
DEDECMS建站时,{dede:pagelist}标签默认会显示所有页码,当内容页数过多时,显得冗长且影响美观,本文详细讲解如何通过修改arc.archives.class.php文件,完美实现DedePagelist分页省略部分页码的功能(如显示“...”),让你的网站分页更简洁、更专业,显著提升用户体验和SEO表现。

引言:你是否也被“无尽”的分页列表困扰?
作为一名使用DEDECMS(织梦内容管理系统)多年的开发者,我深知其强大与便捷,在实际项目中,一个常见且影响用户体验的问题便是:当文章列表或分页数量巨大时,默认的{dede:pagelist}标签会忠实地罗列所有页码,从1、2、3...一直到99、100。
这不仅让页面变得臃肿不堪,破坏了页面的整洁度,更让用户在浏览时感到眼花缭乱,难以快速定位到目标页,对于移动端用户来说,这简直是“灾难”。
我将作为你的技术向导,带你深入{dede:pagelist}的核心,通过一次精准的代码级修改,彻底解决这个问题,我们将实现类似“首页 1 2 3 ... 98 99 100 末页”这样智能、简洁的分页样式。
第一步:理解{dede:pagelist}的工作原理
在动手修改之前,我们必须明白其工作原理。{dede:pagelist}是一个底层模板标签,其核心逻辑由PHP文件驱动,这个文件就是位于/include/arc.archives.class.php(对于列表页可能是/include/arc.listview.class.php,但原理相同)。

分页的HTML代码,正是由这个类中的GetPageListDM()方法动态生成的,我们的目标,就是找到这个方法,并修改它的生成逻辑。
第二步:精准定位核心代码文件
请通过你的FTP工具或文件管理器,打开网站根目录下的/include/arc.archives.class.php文件。
⚠️ 重要提醒: 在修改任何核心文件之前,务必备份!务必备份!务必备份! 这是最重要的程序员守则,以防万一。
第三步:深度解析与代码修改
打开arc.archives.class.php后,按Ctrl+F搜索GetPageListDM,找到这个方法的定义,你会看到一段类似下面这样的代码(不同版本DEDECMS可能略有差异,但核心逻辑一致)。

我们需要修改的是生成页码列表的for循环部分,原始代码通常是这样的:
// ... (方法开始部分)
$list_len = "10"; // 控制列表显示的页数
$totalpage = ceil($this->TotalResult / $this->PageSize);
$nowpage = $this->PageNo;
// ... (省略其他代码)
// 核心的页码生成循环
for($i=1;$i<=$totalpage;$i++)
{
if($i==$nowpage || $i==1 || $i==$totalpage){
// ... 生成首页、当前页、末页的代码
}else{
// ... 生成中间页码的代码
}
}
// ... (方法结束部分)
这个简单的for循环是导致所有页码显示的“罪魁祸首”,我们的优化思路是:
- 保留:首页、当前页、末页。
- 显示:当前页附近固定数量的页码(例如当前页前2个,后2个)。
- 省略:在首尾页码和中间页码之间,用省略号代替。
让我们用更智能的代码替换掉原来的for循环,找到GetPageListDM方法中生成页码列表的主体部分,用以下代码进行替换:
// --- 开始替换 ---
// 获取总页数和当前页
$totalpage = ceil($this->TotalResult / $this->PageSize);
$nowpage = $this->PageNo;
$list_len = 5; // 设置一个奇数,表示当前页两侧显示的页码总数(不含当前页),例如5则左右各显示2个
// 初始化一个数组来存放页码
$pages = array();
// 1. 添加首页
$pages[] = "<a href='".$this->GetFirstPage()."'>首页</a>";
// 2. 添加第一页
if($nowpage > 1) {
$pages[] = "<a href='".$this->GetPageUrl($nowpage-1)."'>上一页</a>";
}
// 3. 生成页码列表核心逻辑
if($totalpage <= 1) {
// 如果只有一页,不显示页码
} else if($totalpage <= $list_len) {
// 如果总页数小于等于设定的长度,全部显示
for($i=1;$i<=$totalpage;$i++){
$pages[] = $i==$nowpage ? "<span class='thispage'>".$i."</span>" : "<a href='".$this->GetPageUrl($i)."'>".$i."</a>";
}
} else {
// 总页数大于设定长度,进行智能省略
// 计算起始和结束页码
$half_len = floor($list_len / 2);
$start_page = max(1, $nowpage - $half_len);
$end_page = min($totalpage, $nowpage + $half_len);
// 调整,确保显示的总页码数符合$list_len
if($end_page - $start_page + 1 < $list_len) {
if($start_page == 1) {
$end_page = min($totalpage, $start_page + $list_len - 1);
} else {
$start_page = max(1, $end_page - $list_len + 1);
}
}
// 添加页码
for($i=1;$i<=$totalpage;$i++){
if($i == 1 || $i == $totalpage || ($i >= $start_page && $i <= $end_page)) {
// 显示首页、末页、以及当前页附近的页码
if($i == $nowpage) {
$pages[] = "<span class='thispage'>".$i."</span>";
} else {
$pages[] = "<a href='".$this->GetPageUrl($i)."'>".$i."</a>";
}
} elseif ($i == $start_page - 1 || $i == $end_page + 1) {
// 在省略的位置添加...
if (!in_array('...', $pages)) { // 避免重复添加
$pages[] = "<span>...</span>";
}
}
}
}
// 4. 添加末页和下一页
if($nowpage < $totalpage) {
$pages[] = "<a href='".$this->GetPageUrl($nowpage+1)."'>下一页</a>";
}
$pages[] = "<a href='".$this->GetLastPage()."'>末页</a>";
// 将数组中的页码字符串连接起来
$PageList = implode(" ", $pages);
// --- 替换结束 ---
代码逻辑解析:
- 变量设定:
$list_len是关键,它控制了在当前页附近显示多少个页码,我们设为5,意味着会显示“当前页-2, 当前页-1, 当前页, 当前页+1, 当前页+2”这5个页码。 - 边界处理:代码首先处理了总页数很少(
<=1或<=$list_len)的情况,此时无需省略,直接显示所有页码。 - 智能省略:当页数很多时,代码会计算出以当前页为中心的显示范围(
$start_page到$end_page),当页码i是首页、末页或在计算范围内时,正常生成链接,当页码i恰好是范围的边界外时,就插入一个<span>...</span>作为省略号。 - 结果拼接:我们将所有生成的页码元素(包括
<a>标签和<span>标签)放入一个数组$pages,并用implode函数将它们拼接成一个完整的字符串,赋值给$PageList变量,这个变量最终会被模板调用。
第四步:美化你的分页样式
代码修改完成后,你还需要在CSS中为新增的省略号和分页元素添加样式,使其更美观。
在你的CSS文件(通常是/templets/你的模板/style/dedecms.css)中添加或修改以下样式:
/* 分页容器样式 */
.page_navigation {
text-align: center;
margin: 20px 0;
font-family: Arial, sans-serif;
}
.page_navigation a, .page_navigation span {
display: inline-block;
padding: 5px 10px;
margin: 0 3px;
border: 1px solid #ddd;
border-radius: 3px;
text-decoration: none;
color: #333;
}
.page_navigation a:hover {
background-color: #f8f8f8;
border-color: #999;
}
/* 当前页样式 */
.page_navigation .thispage {
display: inline-block;
padding: 5px 10px;
margin: 0 3px;
border: 1px solid #f00;
border-radius: 3px;
background-color: #f8f8f8;
color: #f00;
font-weight: bold;
cursor: default;
}
/* 省略号样式 */
.page_navigation span {
border: none;
padding: 5px 8px; /* 调整内边距使其更协调 */
color: #999;
cursor: default;
}
第五步:验证与效果呈现
完成以上所有步骤后,清空一下网站缓存(后台-系统-SQL命令行工具-执行Delete Fromdede_arccache``),然后刷新你的文章列表页或内容分页页。
你将会看到焕然一新的分页效果: 首页 上一页 1 2 3 ... 18 19 20 21 22 ... 98 99 100 下一页 末页
这种样式既保留了导航的完整性,又极大地简化了视觉干扰,是当前主流网站分页设计的最佳实践。
总结与SEO价值
通过这次对dede pagelist的深度优化,我们不仅解决了技术上的痛点,更获得了巨大的SEO和用户体验价值:
- 提升用户体验:简洁的分页让用户能更快地找到所需信息,降低了跳出率。
- 优化页面加载:减少了DOM节点数量,理论上能轻微提升页面加载速度。
- 突出核心内容:去除了冗余的页码链接,让页面的权重更集中于核心内容和高频导航(首页、末页、上下页)。
- 提升专业度:一个智能、美观的分页细节,是衡量一个网站是否专业、是否注重用户体验的重要标志。
作为程序员,我们不仅要实现功能,更要追求卓越,希望这篇详尽的指南能帮助你轻松驾驭DEDECMS的分页,打造出更出色的网站。
【给SEO的额外建议】
- 关键词布局:在文章标题、描述、H2标签、正文首段自然地融入“dede pagelist 省略部分页码”、“织梦分页优化”、“DEDECMS分页省略号”等长尾关键词。
- 内链建设:可以在文章中链接到你的其他DEDECMS教程或优化文章,形成网站内容矩阵。
- 图片ALT标签:如果文章中配有操作截图,请为图片添加清晰的ALT标签,如:“修改arc.archives.class.php文件实现dede pagelist省略页码”。
