DedeCMS 的搜索分页和普通列表页分页原理类似,但实现起来稍微复杂一些,因为它涉及到两个核心文件:

- 搜索处理页面:
plus/search.php,负责接收搜索关键词、执行查询,并包含分页的“上一页”、“下一页”等链接。 - 搜索结果模板:
templets/default/search.htm,负责显示搜索到的内容列表和分页导航。
下面我将分步为你讲解如何实现和自定义搜索分页。
第一步:理解核心文件
在修改之前,请务必了解这两个文件的作用:
plus/search.php:这是 PHP 脚本,它从 URL 中获取关键词(如q=织梦和typeid=1),然后根据这些条件构建 SQL 查询语句,它调用GetPageList()函数生成分页 HTML 代码,并将列表数据传递给模板。templets/default/search.htm:这是 HTML 模板文件,它使用 DedeCMS 的模板标签(如{dede:list}或{dede:arclist})来显示从search.php传过来的数据,并使用{dede:pagelist}标签来显示分页导航。
第二步:修改搜索处理页面 (plus/search.php)
这是实现分页功能最关键的一步,你需要确保 search.php 正确地获取了分页参数并生成了分页链接。
-
找到并修改分页参数获取: 在
plus/search.php文件中,找到获取当前页码的代码,通常是这样的:
(图片来源网络,侵删)// 获取当前页码 $page = isset($page) && is_numeric($page) ? intval($page) : 1;
这段代码确保了
$page变量是一个有效的整数,URL 中没有page参数,则默认为第 1 页。 -
修改 SQL 查询以支持分页: 找到执行数据库查询的核心部分,你需要修改 SQL 语句,使用
LIMIT子句来限制每页显示的记录数。假设你的查询代码大概长这样(需要根据你的实际情况调整):
// 原始查询(未分页) // $query = "SELECT arc.id, arc.title, arc.litpic, arc.pubdate FROM `dede_archives` arc WHERE arc.title LIKE '%$keyword%'"; // 修改后的查询(带分页) $pageSize = 10; // 每页显示10条记录 $start = ($page - 1) * $pageSize; // 计算记录偏移量 $query = "SELECT arc.id, arc.title, arc.litpic, arc.pubdate, CONCAT(arc.typeid,',') AS ids FROM `#@__archives` arc WHERE arc.title LIKE '%$keyword%' ORDER BY arc.id DESC LIMIT $start, $pageSize";$pageSize:定义每页显示的文章数量。$start:计算从数据库的第几条记录开始查询。LIMIT $start, $pageSize:这是 MySQL 的分页语法,LIMIT offset, count。
-
生成分页链接:
search.php文件通常会调用GetPageList()函数,你需要确保它正确地传递了所有必要的参数,以便分页链接能正确地跳转。查找类似这样的代码(DedeCMS 版本不同,代码可能略有差异):
// ... 执行查询 $dsql->Execute('me', $query); $totalResult = $dsql->GetTotalResult(); // 获取总记录数 $totalPage = ceil($totalResult / $pageSize); // 计算总页数 // 调用分页函数 $pageList = GetPageList($totalPage, $page, $cfg_rewrite == 'Y' ? 'search' : 'plus/search.php', $keyword, $typeid); // 将分页HTML和列表数据传递给模板 $tpl->Assign('pageList', $pageList); $tpl->Assign('fields', $dsql->GetArray('me')); // ... 其他赋值 $tpl->Display();GetPageList()函数需要总页数、当前页、分页基础链接、关键词和栏目ID等信息。cfg_rewrite == 'Y'判断是否开启了伪静态,这会影响分页链接的生成方式(search/织梦/page/2.htmlvsplus/search.php?q=织梦&page=2)。
第三步:修改搜索结果模板 (templets/default/search.htm)
在模板文件中,你需要使用两个核心标签:{dede:list} 用于显示文章列表,{dede:pagelist} 用于显示分页导航。
-
使用
{dede:list}显示搜索结果:{dede:list}标签在搜索模板中的用法和列表页类似,它会循环显示search.php查询并传递过来的数据。<div class="search_result"> <h2>搜索结果:"{dede:global name='keyword'/}"</h2> <ul> {dede:list pagesize='10'} <!-- 注意:这里的 pagesize 属性通常会被 search.php 中的 $pageSize 覆盖,但保留也无妨 --> <li> <a href="[field:arcurl/]">[field:title/]</a> <span class="date">([field:pubdate function="MyDate('Y-m-d',@me)"/])</span> <p>[field:description/]...</p> </li> {/dede:list} </ul> </div> -
使用
{dede:pagelist}显示分页导航: 这个标签会直接显示search.php中$pageList变量生成的 HTML 代码。<div class="page_nav"> {dede:pagelist listsize='5' listitem='index pre pageno next end '/} </div>listsize='5':显示页码的数量,1 2 3 4 5。listitem='...':定义要显示的分页元素,常用值包括:index:首页pre:上一页pageno:页码next:下一页end:尾页option:跳转下拉框
第四步:自定义分页样式(CSS)
{dede:pagelist} 生成的 HTML 结构通常是固定的,你可以通过 CSS 来美化它。
-
查看生成的 HTML 结构: 在浏览器中打开一个搜索结果页,然后查看分页导航部分的 HTML 代码,它通常是这样的结构:
<div class="page_nav"> <span class="pageinfo">共 <strong>1</strong> 页 <strong>10</strong> 条记录</span> <a href="search.php?q=织梦&page=1">首页</a> <a href="search.php?q=织梦&page=1">上一页</a> <span class="thisclass">1</span> <a href="search.php?q=织梦&page=2">2</a> <a href="search.php?q=织梦&page=3">3</a> ... <a href="search.php?q=织梦&page=2">下一页</a> <a href="search.php?q=织梦&page=10">尾页</a> </div>
-
添加 CSS 样式: 在你的模板 CSS 文件(如
templets/default/style/css.css)中,为分页元素添加样式。/* 分页容器 */ .page_nav { text-align: center; margin: 20px 0; font-size: 14px; } /* 所有分页链接的公共样式 */ .page_nav a, .page_nav span { display: inline-block; margin: 0 5px; padding: 5px 10px; border: 1px solid #ddd; color: #666; text-decoration: none; } /* 鼠标悬停效果 */ .page_nav a:hover { background-color: #f8f8f8; color: #0066cc; } /* 当前页码样式 */ .page_nav .thisclass { background-color: #0066cc; color: #fff; border-color: #0066cc; font-weight: bold; } /* 页面信息样式 */ .page_nav .pageinfo { color: #999; }
常见问题与解决方法
-
问题:搜索结果页没有分页,或者点击分页后没有变化。
- 原因:
plus/search.php中的分页逻辑有误,或者$page参数没有正确传递。 - 解决:仔细检查
search.php中的 SQLLIMIT子句和GetPageList()函数的调用。
- 原因:
-
问题:分页链接是
search.php?q=关键词&page=2,但网站开启了伪静态,希望是search/关键词/page/2.html的形式。- 原因:伪静态规则未配置或配置有误。
- 解决:
- 确保后台“系统” -> “系统基本参数” -> “选项”中的“是否使用伪静态”是“是”。
- 检查网站根目录下的
httpd.ini(IIS) 或.htaccess(Apache) 文件,确保包含了搜索页的伪静态规则。 - 对于 Apache,
.htaccess中通常需要类似这样的规则:RewriteRule ^search/(.*)/([0-9]+).html$ /plus/search.php?q=$1&page=$2 RewriteRule ^search/(.*).html$ /plus/search.php?q=$1
-
问题:搜索结果为空,但关键词在文章中确实存在。
-
原因:
- 关键词是中文,且数据库表使用了
latin1编码,导致查询失败。 - 关键词中包含特殊字符(如 ,
&),没有进行过滤。
- 关键词是中文,且数据库表使用了
-
解决:
-
修改
search.php中的查询语句,使用dede_filter函数对关键词进行安全过滤,并确保编码正确。// 对关键词进行过滤和编码处理 $keyword = dede_filter($keyword); $keyword = cn_substr($keyword, 20); // 限制关键词长度 // 修改 SQL,使用 CONCAT 和 FIND_IN_SET 来优化搜索(可选) // $query = "SELECT ... WHERE CONCAT(arc.title, arc.keywords) LIKE '%$keyword%'";
-
检查数据库字符集,建议统一使用
utf8mb4。
-
-
实现 DedeCMS 搜索分页的完整流程如下:
- 配置
plus/search.php:获取分页参数,修改 SQL 查询加入LIMIT,调用GetPageList()生成链接。 - 编辑
templets/default/search.htm:使用{dede:list}显示列表,使用{dede:pagelist}显示分页导航。 - 编写 CSS:美化
{dede:pagelist}生成的 HTML 结构。
通过以上步骤,你就可以成功地为 DedeCMS 的搜索功能添加分页了,如果遇到问题,优先检查 search.php 的 PHP 逻辑和模板中 {dede:pagelist} 的使用方法。
