dede搜索功能案例有哪些实用技巧?

99ANYc3cd6
预计阅读时长 32 分钟
位置: 首页 DEDE建站 正文

案例背景

假设我们有一个旅游博客网站,使用 DedeCMS 5.7 / 5.8 / 6.x 版本,网站包含文章、图集、软件下载等多个频道,我们的目标是:

dede搜索功能案例
(图片来源网络,侵删)
  1. 基础功能:实现一个在文章标题和内容中搜索的关键词搜索框。
  2. 高级功能:支持按频道(文章、图集)、发布时间、关键字标签进行筛选。
  3. 用户体验:搜索结果页美观、分页清晰,并记录用户的搜索词。
  4. SEO优化:搜索结果页 URL 规范,利于搜索引擎收录。

第一步:创建搜索表单(前端页面)

这是用户交互的第一步,我们把它放在网站的头部 head.htm 模板文件中,这样所有页面都可以使用。

文件路径/templets/default/head.htm

代码实现

<div class="search-box">
    <form name="formsearch" action="{dede:global.cfg_cmspath/}/search.php" method="get">
        <input type="hidden" name="kwtype" value="0" id="kwtype" />
        <input type="text" name="q" class="search-keyword" id="search-keyword" placeholder="请输入搜索关键词..." />
        <select name="searchtype" id="searchtype" class="search-type">
            <option value="title" selected="selected">标题</option>
            <option value="body">内容</option>
        </select>
        <button type="submit" class="search-submit">搜索</button>
    </form>
</div>

代码解析

dede搜索功能案例
(图片来源网络,侵删)
  • action="{dede:global.cfg_cmspath/}/search.php":指定搜索表单提交的地址是 DedeCMS 自带的 search.php 文件。
  • name="formsearch":表单的固定名称,DedeCMS 搜索程序会识别它。
  • name="q"这是最重要的参数,用户输入的搜索关键词将通过 q 这个变量传递给 search.php,你也可以使用 keyword,但 q 更通用。
  • name="kwtype":指定搜索范围。0 表示在所有频道中搜索;1 仅在文章频道中搜索;2 仅在软件频道中搜索,以此类推。
  • name="searchtype":指定搜索字段。title 只搜索文章标题,body 搜索文章正文。
  • placeholder:输入框的提示文本,提升用户体验。

第二步:配置搜索结果页模板

当用户提交搜索表单后,search.php 会处理请求并调用一个专门的模板文件来展示结果。

创建模板文件

/templets/default/ 目录下新建一个文件,命名为 search.htm

文件路径/templets/default/search.htm

编写模板代码

这是一个功能比较完整的搜索结果页模板,包含了结果列表、分页和高级筛选。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">{dede:global name='keyword'/} - 搜索结果 - {dede:global.cfg_webname/}</title>
    <link rel="stylesheet" href="{dede:global.cfg_cmspath/}/templets/default/css/style.css">
</head>
<body>
    <!-- 头部、导航等省略 -->
    <div class="main">
        <div class="search-result-main">
            <h1>搜索结果</h1>
            <p class="search-info">为您找到与 <strong>"{dede:global name='keyword'/}"</strong> 相关的结果 <strong>{dede:global name='resultcount'/}</strong> 个</p>
            <!-- 高级筛选 -->
            <div class="search-filter">
                <span>频道筛选:</span>
                <a href="{dede:global name='phpurl'/}/search.php?q={dede:global name='urlencode keyword'/}" {dede:global.name='typeid'/ == '' ? 'class="active"' : ''}>全部</a>
                <a href="{dede:global name='phpurl'/}/search.php?q={dede:global name='urlencode keyword'/}&typeid=1" {dede:global.name='typeid'/ == '1' ? 'class="active"' : ''}>文章</a>
                <a href="{dede:global name='phpurl'/}/search.php?q={dede:global name='urlencode keyword'/}&typeid=2" {dede:global.name='typeid'/ == '2' ? 'class="active"' : ''}>图集</a>
                <!-- 其他频道typeid... -->
            </div>
            <!-- 搜索结果列表 -->
            <div class="result-list">
                {dede:list pagesize='10'}
                <div class="result-item">
                    <h3><a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a></h3>
                    <p class="result-summary">[field:info/]...</p>
                    <div class="result-meta">
                        <span class="result-type">[field:typename/]</span>
                        <span class="result-date">[field:pubdate function="MyDate('Y-m-d', @me)"/]</span>
                    </div>
                </div>
                {/dede:list}
            </div>
            <!-- 分页 -->
            <div class="page-nav">
                {dede:pagelist listsize='5' listitem='index,pre,next,end,pageno'}
                </div>
            </div>
        </div>
    </div>
    <!-- 底部等省略 -->
</body>
</html>

代码解析

  • {dede:global name='keyword'/}:获取用户搜索的关键词,用于页面标题和提示信息。
  • {dede:global name='resultcount'/}:获取搜索到的结果总数。
  • 高级筛选链接
    • typeid=1:这是 DedeCMS 中“文章”频道的 ID,你可以在后台“频道模型”中查看各个频道的 ID。
    • &typeid=1 通过 GET 参数传递,实现按频道筛选。
  • {dede:list}:
    • pagesize='10':每页显示 10 条结果。
    • [field:arcurl/]:文章链接。
    • [field:title/]
    • [field:info/]:自动截取)。
    • [field:typename/]:文章所属栏目名称。
    • [field:pubdate/]:发布日期。
  • {dede:pagelist}:用于生成分页导航。

第三步:后台设置与优化

为了让搜索功能更强大,我们需要在 DedeCMS 后台进行一些设置。

开启“使用全文索引”

这是提升搜索速度和准确度的关键步骤。

  • 路径:后台 -> 系统 -> 系统基本参数 -> 核心设置
  • 找到是否开启全文索引 -> 选择“是”
  • 作用:开启后,DedeCMS 会对文章内容建立索引,搜索速度会快很多,尤其是在数据量大的时候。

重新生成索引

设置开启后,需要重新生成索引才能生效。

  • 路径:后台 -> 生成 -> 目录管理 -> 重新生成 HTML -> 选择“仅重新生成文档HTML”
  • 作用:系统会遍历所有文章,为它们建立搜索索引。

设置“搜索页面”

  • 路径:后台 -> 系统 -> 系统基本参数 -> 搜索引擎优化
  • 找到搜索页面 -> 设置为 search.php
  • 作用:确保搜索结果的 URL 是 search.php?q=关键词 的形式,而不是默认的 plus/search.php

第四步:高级功能扩展

我们的基础搜索已经可以用了,我们来实现更高级的功能。

扩展1:按发布时间范围搜索

修改 search.htm 模板,增加时间筛选的表单。

search-filter div 中添加:

<div class="search-filter">
    <span>时间筛选:</span>
    <a href="{dede:global name='phpurl'/}/search.php?q={dede:global name='urlencode keyword'/}&starttime=&endtime=">全部时间</a>
    <a href="{dede:global name='phpurl'/}/search.php?q={dede:global name='urlencode keyword'/}&starttime={dede:php}echo date('Y-m-d', time()-86400);{/dede:php}&endtime={dede:php}echo date('Y-m-d');{/dede:php}">一天内</a>
    <a href="{dede:global name='phpurl'/}/search.php?q={dede:global name='urlencode keyword'/}&starttime={dede:php}echo date('Y-m-d', time()-86400*7);{/dede:php}&endtime={dede:php}echo date('Y-m-d');{/dede:php}">一周内</a>
    <a href="{dede:global name='phpurl'/}/search.php?q={dede:global name='urlencode keyword'/}&starttime={dede:php}echo date('Y-m-d', time()-86400*30);{/dede:php}&endtime={dede:php}echo date('Y-m-d');{/dede:php}">一月内</a>
</div>

代码解析

  • &starttime=&endtime= 是 DedeCMS 搜索程序支持的参数,用于限定发布时间。
  • {dede:php}...{/dede:php} 标签允许我们在模板中直接执行 PHP 代码,这里用来动态计算日期。

扩展2:记录热门搜索词

我们可以利用 DedeCMS 的自定义标记功能,记录并展示热门搜索词。

创建数据表

在数据库中执行以下 SQL 语句(#__ 前缀请根据你的网站配置修改):

CREATE TABLE `dede_search_keywords` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `keyword` varchar(100) NOT NULL,
  `count` int(10) unsigned NOT NULL DEFAULT '0',
  `resultcount` int(10) unsigned NOT NULL DEFAULT '0',
  `addtime` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `keyword` (`keyword`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

修改 search.php 文件

search.php 文件中找到处理搜索结果的部分,在查询数据库之前,添加记录搜索词的逻辑。

search.php 中找到类似 if($typeid > 0) $addquery .= " And arc.typeid='$typeid' "; 的地方,在其上方添加:

// --- 记录搜索词开始 ---
require_once(DEDEINC."/search.class.php");
$sp = new Search();
$sp->RecordKeyword($keyword, $typeid, $resultnum);
// --- 记录搜索词结束 ---
if($typeid > 0) $addquery .= " And arc.typeid='$typeid' ";

在首页模板中调用热门搜索词

在首页 index.htm 的合适位置(比如页脚)添加以下代码:

<div class="hot-search">
    <h3>热门搜索</h3>
    {dede:hotwords num='10' sublen='6'}
    <a href="[field:link/]">[field:keyword/]</a>
    {/dede:hotwords}
</div>

代码解析

  • {dede:hotwords} 是 DedeCMS 的一个自定义标记,用于从 #@__hotwords 表(我们上面新建的 dede_search_keywords 表)中读取热门关键词。
  • num='10':显示 10 个热门词。
  • [field:link/]:生成搜索该词的链接。
  • [field:keyword/]:显示关键词。

第五步:美化与最终调试

  1. CSS 样式:为 search-box, result-item, page-nav 等元素编写 CSS 样式,让它们看起来更美观。
  2. 测试:尝试搜索不同的关键词,测试分页、筛选、高亮(DedeCMS 默认会高亮搜索词)等功能是否正常。
  3. 性能:如果网站数据量非常大,确保第一步的“全文索引”已经开启,否则搜索会非常慢。

通过以上五个步骤,我们就成功地为 DedeCMS 网站构建了一个功能完善、用户体验良好、具备一定SEO优化的搜索系统。

  • 基础层:通过 head.htm 的表单和 search.htm 的模板实现了基本搜索。
  • 优化层:通过后台开启“全文索引”大幅提升了搜索性能。
  • 扩展层:通过修改模板和 PHP 文件,增加了时间筛选和热门搜索词记录功能。

这个案例可以根据你的具体需求进行进一步的修改和扩展,例如增加按作者、按标签等筛选条件。

-- 展开阅读全文 --
头像
dede会员文章隐藏功能如何设置与使用?
« 上一篇 昨天
手机C语言编程软件有哪些?
下一篇 » 昨天
取消
微信二维码
支付宝二维码