dede搜索分类信息如何实现?

99ANYc3cd6
预计阅读时长 27 分钟
位置: 首页 DEDE建站 正文
  1. 默认搜索功能分析:了解DedeCMS自带的搜索是什么样的。
  2. 前台搜索页面优化:如何修改搜索页面的模板,让用户搜索更方便。
  3. 核心功能:修改搜索逻辑,实现按栏目/模型搜索:这是最关键的一步,让搜索结果更精确。
  4. 高级搜索功能:增加时间、地区、价格等筛选条件。
  5. SEO优化:让搜索结果页也有利于搜索引擎收录。
  6. 常见问题与解决方案

默认搜索功能分析

DedeCMS的搜索系统是全局的,默认会搜索文章、软件、商品等所有已启用搜索的模型,对于分类信息来说,默认情况下,它也会被包含在内,但存在一些问题:

dede搜索分类信息
(图片来源网络,侵删)
  • 搜索范围不精确:用户只想在“二手市场”里搜,但结果可能来自“新闻资讯”等其他栏目。
  • 搜索字段有限:默认可能只搜索标题和内容,无法搜索自定义字段(如价格、地区、联系人等)。
  • 结果展示不友好:搜索结果列表的样式是通用的,可能无法很好地展示分类信息的特有字段。

默认搜索功能过于基础,通常需要进行二次开发才能满足分类信息网站的需求。


前台搜索页面优化

我们需要一个美观且易用的搜索框和搜索结果页。

a. 创建搜索框

在网站首页或任何需要放置搜索框的地方,使用以下表单代码:

<form name="formsearch" action="{dede:global.cfg_cmspath/}/plus/search.php" method="get">
    <input type="hidden" name="kwtype" value="0" />
    <input type="hidden" name="searchtype" id="searchtype" value="titlekeyword" />
    <div class="search-box">
        <input type="text" name="q" class="search-keyword" placeholder="请输入您要搜索的关键词">
        <button type="submit" class="search-submit">搜索</button>
    </div>
    <div class="search-type">
        <label><input type="radio" name="searchtype" value="titlekeyword" checked /> 关键词</label>
        <label><input type="radio" name="searchtype" value="title" /> 标题</label>
    </div>
</form>
  • action 指向搜索程序 plus/search.php
  • name="q" 是搜索关键词的输入字段,这是固定的。
  • name="kwtype" 控制搜索范围,0为全站,1为本栏目,2为特定ID,我们可以利用它。
  • name="searchtype" 控制搜索内容,titlekeyword+关键词,title

b. 搜索结果页模板

DedeCMS的搜索结果页模板文件是 templets/default/search.htm,你可以直接修改这个文件,或者复制一份到你的自定义模板目录下,然后在后台“系统”->“系统基本参数”->“核心设置”里修改“搜索结果模板”路径。

dede搜索分类信息
(图片来源网络,侵删)

search.htm 中,常用的标签有:

  • {dede:global name='keyword'/}:显示用户搜索的关键词。
  • {dede:list pagesize='10'}:循环输出搜索结果列表,pagesize控制每页显示数量。
  • [field:title/]
  • [field:pubdate function="MyDate('Y-m-d',@me)"/]:发布日期。
  • [field:arcurl/]:文章链接。
  • [field:body/]

你可以根据你的分类信息模型,自定义 search.htm 的样式,比如在列表中显示价格、地区等信息。


核心功能:修改搜索逻辑,实现按栏目/模型搜索

这是实现精确搜索的关键,默认的 search.php 无法区分模型和栏目,我们需要修改它。

步骤:

  1. 备份文件:请务必先备份 /plus/search.php 文件!
  2. 修改 search.php:打开 /plus/search.php 文件,找到 //获取关键字//搜索范围 相关的代码段。
  3. 增加栏目和模型筛选:在接收表单参数的地方,增加对 typeid(栏目ID)和 mid(模型ID)的处理。

修改示例代码 (关键部分):

dede搜索分类信息
(图片来源网络,侵删)
// 在 search.php 文件中找到类似这样的代码
$keyword = trim($keyword);
$typeid = isset($typeid) && is_numeric($typeid) ? $typeid : 0;
// 在这里增加对 mid 的处理
$mid = isset($mid) && is_numeric($mid) ? $mid : 0;
// 修改 SQL 查询语句
// 找到类似 $query = "SELECT ... FROM dede_archives ... WHERE ..."; 的地方
// 将其修改为更灵活的查询
// 原始的查询可能很长,我们可以重构一下
$addquery = " arc.arcrank > -1 "; // 基本条件,审核通过
// 如果有关键词,则添加关键词搜索条件
if ($keyword != '') {
    $addquery .= " AND (";
    if ($searchtype == 'title') {
        $addquery .= " arc.title LIKE '%$keyword%' ";
    } else {
        $addquery .= " (arc.title LIKE '%$keyword%' OR arc.keywords LIKE '%$keyword%') ";
    }
    $addquery .= ")";
}
// 如果指定了栏目,则添加栏目筛选条件
if ($typeid > 0) {
    $addquery .= " AND arc.typeid IN (SELECT id FROM dede_arctype WHERE id=$typeid OR topid=$typeid) ";
}
// 如果指定了模型(这是关键!)
if ($mid > 0) {
    // 注意:dede_archives 表里有 mid 字段
    $addquery .= " AND arc.mid = $mid ";
}
// 最终的查询语句
$query = "SELECT arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,
          tp.namerule,tp.namerule2,tp.ispart,tp.moresite,tp.siteurl
          FROM dede_archives arc
          LEFT JOIN dede_arctype tp ON arc.typeid=tp.id
          WHERE $addquery
          ORDER BY arc.sortrank DESC";

如何在前台使用?

你需要修改你的搜索表单,增加 typeidmid 字段,你想让用户在“招聘”栏目(假设ID为3)中搜索:

<form action="{dede:global.cfg_cmspath/}/plus/search.php" method="get">
    <input type="hidden" name="typeid" value="3" /> <!-- 强制只在招聘栏目搜索 -->
    <input type="hidden" name="mid" value="1" />     <!-- 假设分类信息模型的ID是1 -->
    <input type="text" name="q">
    <button type="submit">搜索</button>
</form>

注意

  • typeid:栏目ID,如果想让用户选择,可以做一个下拉菜单。
  • mid:模型ID,在后台“核心”->“内容模型管理”中可以查看到各个模型的ID。

高级搜索功能

高级搜索通常意味着提供一个独立的页面,让用户可以组合多个条件进行查询。

a. 创建高级搜索页面

  1. 在后台“文件管理器”中,创建一个静态页面,templets/default/advanced-search.htm
  2. 在这个页面里,放置一个复杂的表单,包含:
    • 关键词输入框 (name="q")
    • 栏目下拉框 (name="typeid"),通过 {dede:channel type='son'} 标签生成。
    • 模型下拉框 (name="mid"),需要手动写死选项。
    • 自定义字段:如果你的分类信息有“价格”、“地区”、“发布时间”等字段,需要在这里添加对应的输入控件。
      • 价格范围:<input type="text" name="price_min"> - <input type="text" name="price_max">
      • 地区:<select name="district"><option value="">请选择</option>... </select>
  3. 将这个表单的 action 指向 /plus/search.php

b. 修改 search.php 处理高级条件

search.php 中,你需要增加对这些新增字段的判断,并拼接到SQL查询的 WHERE 子句中。

// 在 search.php 中接收这些新字段
$price_min = isset($price_min) ? floatval($price_min) : 0;
$price_max = isset($price_max) ? floatval($price_max) : 0;
$district = isset($district) ? trim($district) : '';
// 在 $addquery 变量中追加条件
if ($price_min > 0) {
    // 假设价格字段在附加表里,字段名为price
    $addquery .= " AND (SELECT arcadd.price FROM dede_addoninfos arcadd WHERE arcadd.aid=arc.id) >= $price_min ";
}
if ($price_max > 0) {
    $addquery .= " AND (SELECT arcadd.price FROM dede_addoninfos arcadd WHERE arcadd.aid=arc.id) <= $price_max ";
}
if ($district != '') {
    // 假设地区字段也在附加表里
    $addquery .= " AND (SELECT arcadd.district FROM dede_addoninfos arcadd WHERE arcadd.aid=arc.id) = '$district' ";
}

注意:自定义字段通常存储在附加表(如 dede_addoninfos)中,查询时需要进行子查询或 JOIN 操作,这会使SQL语句变得复杂,确保你的字段名和表名正确。


SEO优化

搜索结果页对SEO也很重要。

  • :在 search.htm 模板中,使用 {dede:global name='keyword'/} 动态生成标题。
  • 设置描述:同样,动态生成描述。
    <meta name="description" content="为您找到与“{dede:global name='keyword'/}”相关的分类信息共 {dede:global name='resultnum'/} 条。" />
  • 设置关键词
    <meta name="keywords" content="{dede:global name='keyword'/},分类信息,网站名称" />
  • URL规范化:确保搜索结果的URL是规范、静态的,DedeCMS默认的搜索URL是 plus/search.php?q=xxx,已经比较规范。

常见问题与解决方案

  • 问题1:搜索不到数据,但数据确实存在。

    • 原因:最常见的原因是文章未审核(arcrank > -1),或者自定义字段在附加表中,而你的SQL没有正确关联附加表。
    • 解决:检查 search.php 中的SQL语句,确保 WHERE 条件正确,并且关联了必要的附加表。
  • 问题2:搜索结果很慢。

    • 原因:当数据库中数据量很大时,LIKE '%keyword%' 这种模糊查询非常消耗性能。
    • 解决
      1. 使用全文索引:对于MySQL,可以考虑对标题和内容字段建立全文索引。
      2. 使用第三方搜索插件:如基于Elasticsearch或Sphinx的搜索方案,性能会好很多,但部署复杂。
      3. 简化查询:避免在 WHERE 子句中对字段进行函数操作。
  • 问题3:如何实现“搜索建议/自动补全”功能?

    • 解决:这需要前端JavaScript(如jQuery UI Typeahead或Bootstrap Typeahead)和后端API配合,你需要创建一个简单的PHP脚本(suggest.php),它接收一个前缀参数,查询数据库并返回JSON格式的建议词列表,供前端调用。

实现一个强大的DedeCMS分类信息搜索,通常需要修改核心文件 plus/search.php,这是一个需要谨慎操作的过程,务必先备份

基本流程

  1. 规划需求:确定是否需要按栏目、模型、自定义字段筛选。
  2. 修改模板:美化 search.htm 和前台搜索框。
  3. 修改PHP:核心步骤,通过修改 search.php 来实现精确的SQL查询。
  4. 测试:全面测试各种搜索组合,确保功能正常。
  5. 优化:针对性能和SEO进行优化。

对于不熟悉PHP和SQL的用户,可以考虑寻找现成的DedeCMS搜索插件,或者聘请专业的二次开发人员来完成这项工作。

-- 展开阅读全文 --
头像
织梦自定义表单如何实现横向布局?
« 上一篇 前天
织梦播放器插件下载,安全可靠吗?
下一篇 » 前天

相关文章

取消
微信二维码
支付宝二维码

目录[+]