下面我将从核心优化思路、具体操作步骤和进阶技巧三个方面,为你提供一份详尽的Dede栏目分页优化指南。

核心优化思路
在动手修改之前,我们必须明确优化的目标:
- 用户体验优先:分页要清晰、易用,让用户能轻松找到想看的内容,页码不宜过多,导航要明确。
- SEO权重集中:将最重要的页面(通常是第1页,即栏目首页)的权重传递给其他页面,避免搜索引擎抓取大量低价值的分页页,造成“权重稀释”。
- URL规范化:使用简洁、规范的URL结构,便于搜索引擎理解和用户记忆。
- 加载速度优化:减少不必要的数据库查询和代码执行,提升页面打开速度。
具体操作步骤
步骤1:修改分页数量(控制分页深度)
这是最直接也是最有效的一步,默认情况下,Dede可能会生成非常多的分页页,这对于SEO和用户体验都是不利的。
目标:限制每个栏目下生成的分页总数,最多只显示前10页的内容。
修改文件:include/arc.listview.class.php

-
找到关键代码: 用代码编辑器打开
arc.listview.class.php文件,搜索GetPageListDT函数(这是用于获取“数字分页”的函数)。 -
添加限制逻辑: 在
GetPageListDT函数中,你会看到一个循环生成页码的for循环,我们需要修改这个循环,让它只生成我们想要数量的页码。原始代码片段(大约在第780行左右,版本不同可能略有差异):
for($i=1;$i<=$totalpage;$i++) { if($i==$nowpage) { $listdd .= "<li class='page_now'>".$i."</li>\r\n"; } else { $listdd .= "<li><a href='".$purl."/$i".$addstr."'>".$i."</a></li>\r\n"; } }这里的
$totalpage是总页数,如果总页数有100页,这里就会生成100个页码。
(图片来源网络,侵删) -
修改后的代码: 我们添加一个
$maxshowpage变量来控制最大显示页数,并修改循环逻辑。// 在函数内部开始处定义最大显示页数 $maxshowpage = 10; // 最多显示10个页码 // 修改循环逻辑 $startpage = max(1, $nowpage - floor($maxshowpage / 2)); $endpage = min($totalpage, $startpage + $maxshowpage - 1); // 如果总页数小于最大显示页数,则从第1页开始 if ($endpage - $startpage + 1 < $maxshowpage) { $startpage = max(1, $endpage - $maxshowpage + 1); } for($i=$startpage;$i<=$endpage;$i++) { if($i==$nowpage) { $listdd .= "<li class='page_now'>".$i."</li>\r\n"; } else { $listdd .= "<li><a href='".$purl."/".$i.$addstr."'>".$i."</a></li>\r\n"; } }代码解释:
$maxshowpage = 10;设置最多显示10个页码。- 新的循环逻辑会确保当前页码始终在显示的页码列表中间(或尽可能中间),如果页码总数超过10个,则只显示当前页附近的10个页码,形成一个“... 8 9 10 11 12 ...”的效果,而不是从1一直排到100,这极大地提升了用户体验。
步骤2:优化分页样式(美化与用户体验)
默认的分页样式比较简陋,我们可以通过修改模板文件来美化它。
目标:使用更现代、更清晰的分页样式,如Bootstrap或自定义的CSS。
修改文件:
-
模板文件:
templets/default/list_channel.htm(这是栏目列表页的模板) -
CSS文件:
templets/default/style.css(存放样式) -
在模板中修改分页HTML结构: 打开
list_channel.htm,找到类似{dede:pagelist listsize='5' /}的标签。 我们可以给它包裹一个div并添加一个class,方便我们用CSS控制。<!-- 修改前 --> <div class="dede_pages"> <ul class="pagelist"> {dede:pagelist listsize='5' /} </ul> </div> <!-- 修改后,添加了class --> <div class="pagination-wrapper"> <ul class="pagination"> {dede:pagelist listsize='5' /} </ul> </div> -
添加自定义CSS样式: 在
style.css文件中添加以下CSS代码,可以参考Bootstrap的分页样式。/* 分页容器样式 */ .pagination-wrapper { margin: 30px 0; text-align: center; } /* 分页列表样式 */ .pagination { display: inline-block; padding-left: 0; margin: 0; border-radius: 4px; } /* 分页项样式 */ .pagination li { display: inline; /* 让所有li在同一行 */ } .pagination li a, .pagination li span { position: relative; float: left; padding: 6px 12px; margin-left: -1px; line-height: 1.42857143; color: #337ab7; text-decoration: none; background-color: #fff; border: 1px solid #ddd; } /* 当前页样式 */ .pagination li.page_now { z-index: 2; color: #fff; cursor: default; background-color: #337ab7; border-color: #337ab7; } /* 首页/尾页/上一页/下一页链接样式 */ .pagination li a:hover, .pagination li a:focus { background-color: #eee; }
步骤3:优化分页链接(SEO友好)
默认的分页链接是 list_1.html, list_2.html... 这种形式很好,但我们可以做得更好,比如使用更语义化的URL。
目标:将分页URL修改为 /category/栏目名/page/2.html 这样的形式。
修改文件:include/arc.listview.class.php
-
找到生成URL的代码: 在
GetPageListDT函数中,找到生成$purl的地方,通常在函数的顶部。 -
修改URL生成逻辑: 原始代码可能类似这样:
$purl = $GLOBALS['cfg_phpurl']."/list.php?tid=".$this->TypeID;
我们可以修改它,使其生成更友好的URL,这通常需要配合伪静态规则。
修改后(示例):
// 假设你已经配置好了伪静态规则 $purl = $GLOBALS['cfg_phpurl']."/list/".$this->TypeID; // 去掉 ?tid=
在生成具体分页链接时,代码会变成:
// ... 在循环内部 ... $listdd .= "<li><a href='".$purl."/page/".$i.$addstr.".html'>".$i."</a></li>\r\n";
注意:修改URL结构后,你必须在服务器上配置相应的伪静态规则(如Nginx或Apache的Rewrite规则),否则会导致404错误,Dede后台的“系统” -> “系统基本参数” -> “核心设置”里也可以开启伪静态。
进阶技巧与最佳实践
使用 "rel" 属性指导搜索引擎
这是SEO中非常重要的一环,通过 rel="next" 和 rel="prev" 属性,你可以明确告诉搜索引擎页面之间的序列关系,帮助它理解分页结构,并将权重正确地传递到第一页。
修改文件:include/arc.listview.class.php (修改 GetPageList 函数,这是用于生成“上下页”分页的函数)
在生成上一页和下一页链接的地方,添加 rel 属性。
// 在 GetPageList 函数中找到生成上一页和下一页的代码
// ... 省略其他代码 ...
// 上一页
if($nowpage>1)
{
$prepage.="<li><a href='".$purl."/".$prepagenum.$addstr."'>上一页</a></li>\r\n";
$prepage.="<link rel='prev' href='".$purl."/".$prepagenum.$addstr.".html' />\r\n"; // 添加这一行
}
// 下一页
if($nowpage!=$totalpage)
{
$nextpage.="<li><a href='".$purl."/".$nextpagenum.$addstr."'>下一页</a></li>\r\n";
$nextpage.="<link rel='next' href='".$purl."/".$nextpagenum.$addstr.".html' />\r\n"; // 添加这一行
}
// ... 省略其他代码 ...
注意: 特别多的栏目,提供一个“查看全部”的链接是一个很好的SEO策略,这个页面包含所有内容,权重最高,而分页页则作为补充。 直接修改 重要提醒:
在进行任何文件修改之前,务必备份原始文件!DedeCMS版本众多,文件行号可能略有差异,请根据你的实际情况灵活调整,修改后,清除网站缓存,并检查效果。rel="prev" 和 rel="next" 应该放在 <head> 标签内,上面的代码只是示例,实际操作中,你可能需要将 <link> 标签整合到模板的头部,更稳妥的方法是直接修改模板文件,在 {dede:pagelist /} 标签前后通过判断来输出这些 <link>
"View All" (查看全部) 页面
list_all.htm。list_channel.htm 模板中,分页导航的旁边添加一个链接:<a href="/plus/list.php?tid={$typeid}&totalall=yes" class="view-all">查看全部</a>
arc.listview.class.php,增加一个判断,当URL参数 totalall 存在时,不进行分页查询,获取所有内容。noindex 标签,因为它包含了重复内容,我们不希望它和分页页竞争排名。修改
list.php 文件(可选)list.php 可以实现更底层的URL重写或逻辑控制,但这比较复杂,风险也较高,不建议新手操作,如果你有特殊需求,可以研究一下 list.php 的代码,并配合服务器的Rewrite规则。
优化项目
核心目标
操作文件
关键点
分页数量控制
避免权重稀释,提升用户体验
include/arc.listview.class.php修改
GetPageListDT 函数的循环逻辑,限制最大显示页数。
分页样式美化
提升用户体验,网站美观
templets/default/list_channel.htmtemplets/default/style.css修改HTML结构,添加自定义CSS,可参考Bootstrap。
分页链接优化
URL规范化,更利于SEO
include/arc.listview.class.php
服务器伪静态规则修改URL生成逻辑,并配置服务器Rewrite规则。
SEO指导 (rel属性)
明确页面关系,传递权重
include/arc.listview.class.php 或直接修改模板为上一页/下一页添加
rel="prev" 和 rel="next"。
"View All"页面
集中权重,处理海量内容
新建模板,修改PHP逻辑
提供一个包含所有内容的页面,并设置
noindex。
