织梦的搜索功能主要通过一个核心文件 plus/search.php 来实现,这个文件会根据URL中的参数(如关键字、频道类型等)来渲染搜索结果页面。
下面我将分步讲解如何实现和自定义搜索页面。
创建搜索页面模板
您需要在您的模板目录(通常是 /templets/default/ 或您自定义的模板目录)下创建一个搜索结果页模板文件。
文件名建议: search.htm
这个模板文件将用来展示搜索结果。
搜索页面核心调用代码
在 search.htm 模板文件中,您需要使用织梦的特定标签来获取和显示搜索结果,以下是完整的代码结构,包含了头部、搜索框、结果列表和分页。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">{dede:global name='keyword'/} - 搜索结果 - {dede:global.cfg_webname/}</title>
<meta name="description" content="搜索关于'{dede:global name='keyword'/}'的相关内容。">
<link rel="stylesheet" href="/templets/default/style.css"> <!-- 引入您的CSS文件 -->
</head>
<body>
<!-- 头部部分 (您的网站头部) -->
{dede:include filename="head.htm"/}
<!-- 主要内容区域 -->
<div class="main-container">
<div class="search-box">
<form name="formsearch" action="{dede:global.cfg_cmsurl/}/plus/search.php" method="get">
<input type="hidden" name="kwtype" value="0" />
<input type="text" name="q" class="search-input" placeholder="请输入搜索关键字" value="{dede:global name='keyword'/}">
<button type="submit" class="search-btn">搜索</button>
</form>
</div>
<!-- 搜索结果区域 -->
<div class="search-results">
{dede:global name='keyword'/} 的搜索结果,共找到 <strong>{dede:global name='resultcount'/}</strong> 条相关信息
<!-- 搜索结果列表开始 -->
<ul class="result-list">
{dede:list pagesize='10'}
<li>
<h3><a href="[field:arcurl/]">[field:title/]</a></h3>
<p class="summary">[field:description function='cn_substr(@me, 200)'/]...</p>
<div class="info">
<span>来源:[field:typename/]</span>
<span>时间:[field:pubdate function="MyDate('Y-m-d', @me)"/]</span>
</div>
</li>
{/dede:list}
</ul>
<!-- 搜索结果列表结束 -->
<!-- 搜索结果分页开始 -->
<div class="page-nav">
{dede:pagelist listsize='4' listitem='info,index,end,pre,next,pageno'}
</div>
<!-- 搜索结果分页结束 -->
</div>
</div>
<!-- 底部部分 (您的网站底部) -->
{dede:include filename="footer.htm"/}
</body>
</html>
代码详解
搜索表单
<form name="formsearch" action="{dede:global.cfg_cmsurl/}/plus/search.php" method="get">
<input type="hidden" name="kwtype" value="0" />
<input type="text" name="q" class="search-input" placeholder="请输入搜索关键字" value="{dede:global name='keyword'/}">
<button type="submit" class="search-btn">搜索</button>
</form>
action="{dede:global.cfg_cmsurl/}/plus/search.php":这是织梦搜索的核心处理文件,必须正确指向。method="get":使用 GET 方法提交,这样搜索关键字会显示在 URL 中,方便分享和记录。<input type="hidden" name="kwtype" value="0">:指定搜索类型。0:模糊搜索(默认)。1:精确搜索。
<input type="text" name="q">:这是搜索关键字输入框。name属性必须是q,这是search.php识别的关键字参数。value="{dede:global name='keyword'/}":这个标签非常有用,它会显示用户上一次搜索的关键字,实现“搜索框回填”功能,提升用户体验。
搜索结果头部信息
{dede:global name='keyword'/} 的搜索结果,共找到 <strong>{dede:global name='resultcount'/}</strong> 条相关信息
{dede:global name='keyword'/}:获取当前搜索的关键字。{dede:global name='resultcount'/}:获取本次搜索到的总结果数。
搜索结果列表
{dede:list pagesize='10'}
<li>
<h3><a href="[field:arcurl/]">[field:title/]</a></h3>
<p class="summary">[field:description function='cn_substr(@me, 200)'/]...</p>
<div class="info">
<span>来源:[field:typename/]</span>
<span>时间:[field:pubdate function="MyDate('Y-m-d', @me)"/]</span>
</div>
</li>
{/dede:list}
{dede:list}:这是在搜索结果页中用来循环输出文章列表的标签,它和首页列表{dede:arclist}不同,{dede:list}专门用于搜索结果页。pagesize='10':设置每页显示的搜索结果数量。[field:arcurl/]:文章的链接地址。[field:title/]:文章的标题。[field:description function='cn_substr(@me, 200)'/]:文章的摘要,并用cn_substr函数截取前200个字符。[field:typename/]:文章所在的栏目名称。[field:pubdate function="MyDate('Y-m-d', @me)"/]:文章的发布日期,并用MyDate函数格式化为年-月-日。
搜索结果分页
<div class="page-nav">
{dede:pagelist listsize='4' listitem='info,index,end,pre,next,pageno'}
</div>
{dede:pagelist}:用于生成分页链接的标签。listsize='4':显示页码的数量,... 3 4 [5] 6 7 ...。listitem='...':定义分页组件的显示项。info:显示总页数、当前页数等信息(如“共10页”)。index:返回首页链接。pre:上一页链接。next:下一页链接。end:末页链接。pageno:页码数字。
高级用法:按栏目搜索
如果您希望用户可以在特定栏目内进行搜索,可以在搜索表单中添加一个栏目选择下拉框。
修改搜索表单代码:
<form name="formsearch" action="{dede:global.cfg_cmsurl/}/plus/search.php" method="get">
<input type="hidden" name="kwtype" value="0" />
<input type="text" name="q" class="search-input" placeholder="请输入搜索关键字" value="{dede:global name='keyword'/}">
<!-- 新增:栏目选择下拉框 -->
<select name="typeid" style="margin-left: 10px;">
<option value="0">全站搜索</option>
{dede:channel type='top' currentstyle="<option value='~id~' selected>~typename~</option>"}
<option value='[field:id/]'>[field:typename/]</option>
{/dede:channel}
</select>
<button type="submit" class="search-btn">搜索</button>
</form>
<select name="typeid">:添加一个名为typeid的下拉选择框。{dede:channel type='top' ...}:调用所有顶级栏目作为选项。value="0":typeid=0代表在全站范围内搜索。- 当用户选择某个栏目并提交时,URL 会变成
.../plus/search.php?q=关键字&typeid=栏目ID,search.php会自动根据这个typeid参数来限定搜索范围。
注意事项
- 文件路径:确保
action中的plus/search.php路径正确,如果您的网站安装在子目录,需要相应调整,/your_site/plus/search.php。 - 模板标签:在搜索结果页中,请务必使用
{dede:list}而不是{dede:arclist}来调用列表数据。 - 分页问题:如果分页不显示,请检查您的
list标签是否正确闭合,以及pagesize是否设置了一个合理的数值。 - SEO优化:
<title>和<meta description>中动态插入{dede:global name='keyword'/}是很好的SEO实践,能让每个搜索结果页都针对特定关键词进行优化。
通过以上步骤,您就可以在织梦CMS中创建一个功能完善、用户体验良好的搜索页面了。
