这是一个非常常见的需求,因为默认的搜索结果列表可能很长,没有分页会严重影响用户体验和网站性能。

核心思路
实现 DedeCMS 搜索分页的核心思路是利用 DedeCMS 自带的分页函数,但需要确保在搜索结果页面中正确地传递和接收分页所需的参数(尤其是关键词 q)。
默认情况下,DedeCMS 的搜索分页是失效的,因为分页链接会丢失 q 这个关键参数,我们的任务就是修复这个问题。
修改核心文件(最直接、最常用)
这是最经典和直接的方法,通过修改 arc.searchview.class.php 文件来解决问题,这个文件是处理所有列表页(包括搜索结果页)分页逻辑的核心。
操作步骤:
-
找到并打开文件 使用 FTP 或文件管理器登录你的网站,找到并编辑以下文件:
/include/arc.searchview.class.php
(图片来源网络,侵删) -
定位关键代码 在文件中找到
GetPageListDM函数(大约在 680 行左右,不同版本可能略有差异),这个函数负责生成分页代码。 -
修改分页链接 找到类似
$listitem = "<a href='".$purl."?PageNo=$i'>".$i."</a>";的代码行,我们需要确保$purl这个基础 URL 包含了搜索关键词q。在
GetPageListDM函数内,找到生成$purl的部分,通常在函数开头,你会看到类似这样的代码:// 获取当前页码 $this->PageNo = $this->GetCurPage(); // 获取链接 $geturl = "keyword=".rawurlencode($this->keyword)."&searchtype=".$this->searchtype; $purl = $this->GetCurUrl(); // ... 其他代码 ...
问题所在:这里的
$purl是当前页的完整 URL,但当你点击 "下一页" 时,DedeCMS 默认会移除一些 GET 参数,导致keyword丢失。
(图片来源网络,侵删)解决方案:修改
$purl的生成逻辑,强制它包含搜索关键词。将生成
$purl的那几行代码替换为以下代码:// 获取当前页码 $this->PageNo = $this->GetCurUrlPageNo(); // 获取链接 - 修改从这里开始 $geturl = "keyword=".rawurlencode($this->keyword)."&searchtype=".$this->searchtype; $purl = $this->GetCurUrl(); // --- 关键修改 --- // 确保 URL 中包含搜索关键词 if (strpos($purl, '?') === false) { $purl .= '?'.$geturl; } else { $purl .= '&'.$geturl; } // --- 修改结束 --- $purl = str_replace("(&)", "&", $purl); $purl = ereg_replace("(&{1,})","&", $purl); $purl = str_replace("&?","&", $purl); if($purl=="") $purl = './'; if($purl != './' && substr($purl, -1) != '/'){ if(strpos($purl, '?') === false){ $purl .= '/'; } }更简单且有效的修改方案(推荐): 如果你不想处理上面的复杂逻辑,可以直接找到
$purl = $this->GetCurUrl();这一行,在它后面添加一行代码,强制将keyword参数追加到 URL 中。找到这一行:
$purl = $this->GetCurUrl();
在它后面添加:
// 强制将关键词参数附加到URL上,解决搜索分页失效问题 $purl .= (strpos($purl, '?') === false ? '?' : '&') . "keyword=" . rawurlencode($this->keyword) . "&searchtype=" . $this->searchtype;
这行代码的作用是:检查当前 URL 是否已经有 ,如果没有就加 ,有就加
&,然后手动把keyword和searchtype这两个搜索参数加上去,这样无论怎么翻页,这两个参数都不会丢失。 -
保存文件 保存对
arc.searchview.class.php文件的修改。 -
更新缓存 登录你的 DedeCMS 后台,点击 “系统” -> “一键更新网站”,然后选择 “更新HTML” 或 “更新主页”,最后点击 “开始更新”,这一步是为了让服务器重新加载修改过的 PHP 文件。
完成以上步骤后,你的搜索结果分页就应该可以正常工作了。
修改搜索模板(如果方法一无效)
在某些特殊模板或版本中,可能还需要检查并修改搜索结果页的模板文件。
-
找到模板文件 搜索结果页的模板文件通常位于你的模板目录下,文件名一般为
search.htm。 路径:/templets/你的模板名称/search.htm -
检查表单提交 确保搜索表单的
action属性指向正确的搜索页面,通常是这样的:<form name="formsearch" action="{dede:global name='cfg_phpurl'/}/search.php"> <input type="hidden" name="kwtype" value="0" /> <input type="hidden" name="searchtype" value="titlekeyword" /> <input type="text" name="q" class="search-keyword" /> <button type="submit" class="search-submit">搜索</button> </form>这里的
name="q"是 DedeCMS 默认接收关键词的变量名。 -
检查分页标签 在
search.htm模板中,调用分页的标签应该是:{dede:pagelist listitem="info,index,end,pre,next,pageno" listsize="5"/}确保这个标签存在于你的搜索结果列表循环
{dede:arclist}之外,分页标签本身通常是没问题的,问题出在它生成的链接上,所以主要还是靠方法一。
调试与常见问题
如果修改后仍然不工作,可以按以下步骤排查:
-
检查 URL 在搜索结果页,点击“下一页”或页码,查看浏览器地址栏里的 URL,看看
keyword参数是否存在,如果不存在,说明方法一的修改没有生效,请检查文件路径和代码是否正确。 -
检查关键词编码 如果搜索的是中文关键词,确保 URL 中是正确的编码(如
%E6%90%9C%E7%B4%A2)。rawurlencode函数就是用来处理这个的。 -
浏览器缓存 清除浏览器缓存或使用无痕模式访问,确保你看到的是最新的页面效果。
-
PHP 错误 检查
arc.searchview.class.php文件是否有语法错误,可以通过在页面中故意写错一个 PHP 代码(如echo $i;)来测试是否能报错,以确认文件是否被正确加载。
对于 DedeCMS 5.7 的搜索分页问题,99% 的情况都可以通过修改 /include/arc.searchview.class.php 文件解决。
核心要点:修改 GetPageListDM 函数中 $purl 的生成逻辑,强制在分页链接中包含 keyword 和 searchtype 参数,上面提供的“更简单且有效的修改方案”是最推荐的一行代码修复法。
希望这个详细的教程能帮助你成功解决问题!
