搜索页的分页与普通列表页(如文章列表、产品列表)的分页在实现原理上基本一致,但关键区别在于如何获取搜索条件,并将其传递给分页链接。

下面我将分步讲解,从核心代码到完整示例,确保你能成功实现。
核心原理
分页的核心是两个函数:
GetArcList(): 用于获取当前页的数据(文章列表)。GetPageList(): 用于生成分页的HTML代码(页码、上一页/下一页等)。
对于搜索页,最重要的就是要确保在生成分页链接时,用户输入的关键词能够被正确地附加到每一个页码链接的URL后面。
第一步:修改搜索页模板文件
你需要修改织梦默认的搜索页模板,通常是 /templets/default/search.htm。

获取并传递搜索关键词
在调用分页函数之前,必须先获取到用户搜索的关键词,织梦会通过 dedesearch 这个全局变量来传递搜索参数。
在模板的适当位置(通常是循环列表之前)加入以下PHP代码:
{dede:php}
// 获取搜索关键词,并进行安全处理
$keyword = isset($dedesearch['keyword']) ? htmlspecialchars($dedesearch['keyword']) : '';
// 将关键词赋值给一个PHP变量,供后续分页函数使用
// 这里的 $searchkey 会在调用 GetPageList 时被用到
$searchkey = $keyword;
{/dede:php}
代码解释:
isset($dedesearch['keyword']): 判断是否存在搜索关键词。htmlspecialchars(): 对关键词进行HTML实体转义,防止XSS攻击。$searchkey = $keyword;: 将处理后的关键词赋值给$searchkey变量,这个变量名将在分页函数中被引用。
调用 GetArcList 获取搜索结果
使用 {dede:arclist} 标签来获取当前页的搜索结果数据。arclist 标签本身并不直接支持搜索,所以我们需要结合 {dede:php} 和 GetArcList 函数来实现。
{dede:php}
// 设置每页显示条数
$pagesize = 10;
// 获取当前页码
$page = isset($pageno) ? intval($pageno) : 1;
// 计算总条数 (这里需要一个能统计搜索结果总数的函数,我们后面会提供)
$total_result = SearchTotal($searchkey);
$totalpage = ceil($total_result / $pagesize);
// 如果当前页码大于总页数,则跳转到最后一页
if($page > $totalpage) $page = $totalpage;
// 调用 GetArcList 获取当前页数据
// 注意:这里的关键词参数需要根据你的织梦版本和实际情况调整
// 通用写法是传入 'keyword' => $searchkey
$arcList = GetArcList(
$typeid = 0, // 搜索所有栏目,0表示不限制
$channel = 0, // 搜索所有模型,0表示不限制
$flag = '', // 标志位,空表示不限制
$orderby = 'id desc',// 按ID降序排列
$ismake = 0, // 是否生成静态,0为否
$innertext = '', // 模板内代码,留空
$arcids = '', // 文章ID,留空
$channeltype = '', // 模型ID,留空
$limit = ($page - 1) * $pagesize . ',' . $pagesize, // 分页限制
$att = '', // 属性,留空
$keyword = $searchkey // 【核心】传入搜索关键词
);
// 循环输出文章列表
foreach($arcList as $a) {
// 设置文章相关信息,以便在模板中使用
$fields = GetOneArchive($a['id']);
$a['arcurl'] = $fields['arcurl'];
$a['typeurl'] = GetTypeUrl($a['typeid'], $a['typedir'], $a['isdefault'], $a['namerule'], $a['moresite'], $a['siteurl'], $a['defaultname']);
// 将当前文章数据赋值给 $fields,供 {dede:field} 等标签使用
// 注意:这需要在 {dede:php} 标签内使用 echo 来输出
// 更好的方式是直接在这里处理,然后将结果输出到模板变量
// 这里为了简化,我们直接输出HTML
echo '<li><a href="'.$a['arcurl'].'">'.$a['title'].'</a></li>';
}
{/dede:php}
注意: 上述 GetArcList 的 keyword 参数在某些旧版本的织梦中可能不起作用,如果无效,请尝试以下方法:
方法A:使用 Select 查询(更可靠)
GetArcList 不支持 keyword 参数,可以直接用SQL查询。
{dede:php}
$pagesize = 10;
$page = isset($pageno) ? intval($pageno) : 1;
$searchkey = isset($dedesearch['keyword']) ? htmlspecialchars($dedesearch['keyword']) : '';
// 构建基础查询
$addquery = " WHERE arcrank > -1 ";
if (!empty($searchkey)) {
// 使用 CONCAT 连接标题和内容进行模糊搜索
$addquery .= " AND (title LIKE '%$searchkey%' OR body LIKE '%$searchkey%') ";
}
// 获取总记录数
$dsql->SetQuery("SELECT COUNT(*) as dd FROM `dede_archives` $addquery");
$dsql->Execute();
$total_result = $dsql->GetArray('dd');
$total_result = $total_result['dd'];
$totalpage = ceil($total_result / $pagesize);
if($page > $totalpage) $page = $totalpage;
// 获取当前页数据
$limitstart = ($page - 1) * $pagesize;
$dsql->SetQuery("SELECT * FROM `dede_archives` $addquery ORDER BY id DESC LIMIT $limitstart, $pagesize");
$dsql->Execute();
while($row = $dsql->GetArray()){
$arcRow = GetOneArchive($row['id']);
echo '<li><a href="'.$arcRow['arcurl'].'">'.$row['title'].'</a></li>';
}
{/dede:php}
调用 GetPageList 生成分页导航
在文章列表输出之后,调用 GetPageList 函数来生成分页链接。
<div class="pagelist">
{dede:php}
// 调用 GetPageList 生成分页
// 参数说明:
// 1. $list_len: 页码显示数量,如 5 表示显示 ... 1 2 3 4 5 ...
// 2. $listitem: 显示的项目,如 'info,index,pre,next,pageno'
// 3. $listitemstyle: 项目之间的分隔符
// 4. $searchkey: 【核心】要附加到URL上的搜索关键词
$page_list = GetPageList(
$list_len = 5,
$listitem = 'info,index,pre,next,pageno',
$listitemstyle = '',
$searchkey = $searchkey // 使用之前定义的变量
);
echo $page_list;
{/dede:php}
</div>
代码解释:
GetPageList的第四个参数$searchkey是关键,它会将这个值附加到每个页码链接的末尾,格式为?q=关键词。GetPageList函数内部会处理URL的构建,确保搜索参数不会丢失。
第二步:完善搜索结果总数统计函数
在第一步的代码中,我们用到了 SearchTotal($searchkey) 函数来获取搜索结果总数,这个函数在织梦默认环境中并不存在,所以我们需要手动添加。
打开 /include/extend.func.php 文件(如果不存在,请创建),在文件末尾添加以下函数:
/**
* 统计搜索结果总数
* @param string $keyword 搜索关键词
* @return int
*/
function SearchTotal($keyword = '')
{
global $dsql;
$addquery = " WHERE arcrank > -1 ";
if (!empty($keyword)) {
$addquery .= " AND (title LIKE '%$keyword%' OR body LIKE '%$keyword%') ";
}
$dsql->SetQuery("SELECT COUNT(*) as dd FROM `dede_archives` $addquery");
$dsql->Execute();
$row = $dsql->GetArray();
return $row['dd'];
}
重要提示:
- 这个函数使用了
LIKE模糊查询,对于大型网站,效率可能不高。 - 更高效的方式是使用织梦自带的 全文索引 功能,但这需要配置 MySQL 的
FULLTEXT索引,如果你的网站数据量很大,强烈建议研究并配置全文索引来优化搜索性能。
第三步:完整 search.htm 模板示例
将以上所有部分组合起来,一个功能完整的搜索页模板 search.htm 如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">搜索结果 - {dede:global.cfg_webname/}</title>
</head>
<body>
<h1>搜索结果</h1>
<!-- 1. 获取并传递搜索关键词 -->
{dede:php}
$keyword = isset($dedesearch['keyword']) ? htmlspecialchars($dedesearch['keyword']) : '';
$searchkey = $keyword;
{/dede:php}
<p>您搜索的关键词是:<strong>{dede:php}echo $keyword;{/dede:php}</strong></p>
<ul>
<!-- 2. 调用 GetArcList 获取搜索结果 -->
{dede:php}
$pagesize = 10;
$page = isset($pageno) ? intval($pageno) : 1;
$total_result = SearchTotal($searchkey);
$totalpage = ceil($total_result / $pagesize);
if($page > $totalpage) $page = $totalpage;
if($page < 1) $page = 1;
// 使用可靠的SQL查询方式
$limitstart = ($page - 1) * $pagesize;
$addquery = " WHERE arcrank > -1 ";
if (!empty($searchkey)) {
$addquery .= " AND (title LIKE '%$searchkey%') "; // 为了效率,只搜索标题
}
$dsql->SetQuery("SELECT * FROM `dede_archives` $addquery ORDER BY id DESC LIMIT $limitstart, $pagesize");
$dsql->Execute();
while($row = $dsql->GetArray()){
$arcRow = GetOneArchive($row['id']);
echo '<li><a href="'.$arcRow['arcurl'].'" target="_blank">'.$row['title'].'</a></li>';
}
{/dede:php}
</ul>
<!-- 3. 调用 GetPageList 生成分页导航 -->
{if $totalpage > 1}
<div class="pagelist">
{dede:php}
echo GetPageList(5, 'info,index,pre,next,pageno', '', $searchkey);
{/dede:php}
</div>
{/if}
</body>
</html>
常见问题与解决方案
Q1: 分页链接没有带上搜索关键词,导致点击第二页后搜索结果消失。 A: 这是最常见的问题,请确保:
- 在模板中正确获取了
$searchkey。 - 在调用
GetPageList时,第四个参数正确传入了$searchkey。 - 检查你的搜索表单提交方式是否正确,通常是
GET方式,URL类似search.php?keyword=织梦。
Q2: GetArcList 函数不生效,搜不到结果。
A: GetArcList 的 keyword 参数在某些版本中确实不稳定,强烈建议改用 方法A 中的直接SQL查询方式,这样更可控、更可靠。
Q3: 如何修改分页的样式?
A: GetPageList 生成的HTML有固定的class名,
- 上一页:
class="pagepre" - 下一页:
class="pagenext" - 页码:
class="pageinfo"(1/2) - 具体数字:
class="pageitem"
你可以在你的CSS文件中定义这些class的样式来美化分页。
/* 示例CSS */
.pagelist a { text-decoration: none; padding: 5px 10px; border: 1px solid #ccc; margin: 0 2px; }
.pagelist a:hover { background-color: #f0f0f0; }
.pagelist .thisclass { background-color: #ff6600; color: white; border-color: #ff6600; }
.pagelist .pagepre, .pagelist .pagenext { border-color: #999; }
通过以上步骤,你就可以在织梦CMS中实现一个功能完善、用户体验良好的搜索结果分页了。
