织梦 自定义搜索 结果

99ANYc3cd6
预计阅读时长 31 分钟
位置: 首页 织梦建站 正文

默认的织梦搜索功能比较基础,通常只搜索文章标题和内容,自定义搜索可以让我们:

织梦 自定义搜索 结果
(图片来源网络,侵删)
  • 指定搜索模型:只在文章、软件、商品等特定模型中搜索。
  • 指定搜索栏目:只在选定的栏目及其子栏目中搜索。
  • 指定搜索关键词:可以同时搜索标题、内容、作者等多个字段。
  • 自定义搜索结果页:设计更美观、信息更丰富的搜索结果展示页面。

下面我将分步介绍两种最常用和最有效的自定义搜索方法:


利用织梦的“高级搜索”功能(推荐,简单易用)

这是织梦内置的功能,通过一个独立的搜索页面,让用户可以自由选择搜索条件,非常灵活。

第1步:创建高级搜索页面模板

  1. 在你的网站模板目录(通常是 /templets/your_template/)下,新建一个文件,命名为 advancedsearch.htm
  2. 将默认的搜索页模板 search.htm 的内容复制到 advancedsearch.htm 中,然后进行修改。

第2步:修改模板文件 advancedsearch.htm

在模板中,你需要添加一个表单,这个表单将包含所有自定义的搜索选项,核心是使用织梦提供的自定义表单标签 {dede:global name='keyword'/}{dede:global name='typeid'/}

示例代码:

织梦 自定义搜索 结果
(图片来源网络,侵删)
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">高级搜索 - {dede:global.cfg_webname/}</title>
</head>
<body>
    <h1>高级搜索</h1>
    <form name="search" action="{dede:global name='cfg_phpurl'/}/search.php" method="get">
        <!-- 1. 关键词输入框(这是必须的) -->
        <div>
            <label for="keyword">关键词:</label>
            <input type="text" name="keyword" id="keyword" value="{dede:global.name='keyword'/}" />
        </div>
        <hr>
        <!-- 2. 搜索模型选择(可选) -->
        <div>
            <label>搜索模型:</label>
            <select name="searchtype">
                <option value="title">仅搜索标题</option>
                <option value="body">仅搜索内容</option>
                <option value="data" selected>搜索所有字段</option>
                <!-- 如果你在后台添加了其他自定义模型,这里也会自动生成选项 -->
            </select>
        </div>
        <!-- 3. 栏目选择(可选) -->
        <div>
            <label>栏目范围:</label>
            <select name="typeid" style="width:200px">
                <option value='0'>所有栏目</option>
                {dede:channel type='son' currentstyle='<option value=~id~ selected>~typename~</option>'}
                <option value='id'>typename</option>
                {/dede:channel}
            </select>
        </div>
        <!-- 4. 时间范围(可选,需要配合JS实现,这里仅作示例) -->
        <div>
            <label>发布时间:</label>
            <select name="time">
                <option value='1'>一天内</option>
                <option value='3'>三天内</option>
                <option value='7'>一周内</option>
                <option value='30'>一月内</option>
                <option value='0'>全部时间</option>
            </select>
        </div>
        <hr>
        <div>
            <input type="submit" name="submit" value="开始搜索" />
        </div>
    </form>
</body>
</html>

代码解释:

  • action="{dede:global.name='cfg_phpurl'/}/search.php":表单提交地址,固定写法。
  • name="keyword":关键词输入框,name属性必须是keyword
  • name="typeid":栏目选择框,name属性必须是typeid
  • name="searchtype":搜索类型选择框,name属性必须是searchtype,它的值(如title, body)会被search.php接收并处理。
  • {dede:channel ...}:这是一个循环标签,用于自动列出所有一级栏目。currentstyle用于高亮当前选中的栏目。

第3步:使用高级搜索页面

  1. 在网站的某个位置(如页脚、顶部导航栏)添加一个链接到这个高级搜索页面:
    <a href="/advancedsearch.htm">高级搜索</a>
  2. 访问这个链接,用户就可以看到自定义的搜索表单了。

修改默认搜索页 search.phpsearch.htm(更灵活,功能更强)

如果你希望默认的搜索行为就包含自定义选项,或者需要更复杂的逻辑(例如按时间、作者等搜索),你需要直接修改 search.php 文件。

第1步:修改 search.php 文件

search.php 是处理搜索请求的核心文件,我们需要修改它,让它能接收并处理我们自定义的参数。

  1. 打开 /include/ 目录下的 search.php 文件。
  2. 找到获取参数的代码段,通常在文件开头,默认的代码是:
    $keyword = empty($keyword) ? '' : preg_replace("# #", "%", $keyword);
    $typeid = isset($typeid) && is_numeric($typeid) ? $typeid : 0;
  3. 在此基础上,添加你需要的自定义参数,我们增加一个 mid (模型ID) 参数和一个 time (时间) 参数。

修改后的 search.php 示例:

// ... 文件顶部其他代码 ...
// 获取并处理关键词
$keyword = empty($keyword) ? '' : preg_replace("# #", "%", $keyword);
// 获取并处理栏目ID
$typeid = isset($typeid) && is_numeric($typeid) ? $typeid : 0;
// ====== 新增自定义参数处理 ======
// 1. 获取模型ID (mid)
$mid = isset($mid) && is_numeric($mid) ? intval($mid) : 0; // 0表示搜索所有模型
// 2. 获取时间范围 (time)
$addtime = '';
if (isset($time) && is_numeric($time)) {
    if ($time == 0) {
        $addtime = ''; // 全部时间
    } else {
        $addtime = " AND arc.senddate > UNIX_TIMESTAMP() - $time * 3600 * 24"; // $time天内
    }
}
// =================================
// ... 接下来是构建SQL查询的部分 ...
// 默认的查询条件
$orwhere = " (arc.title like '%$keyword%') ";
$orwhere .= " OR arc.body like '%$keyword%' ";
// ====== 在构建SQL查询时加入自定义条件 ======
// 将模型ID和时间条件加入到主查询中
$query = "SELECT arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,tp.namerule,
          tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath
          FROM `dede_archives` arc
          LEFT JOIN `dede_arctype` tp ON arc.typeid=tp.id
          WHERE $orwhere AND arc.arcrank > -1 ";
// 如果指定了栏目,则添加栏目条件
if ($typeid > 0) {
    $query .= " AND arc.typeid IN (SELECT id FROM `dede_arctype` WHERE id='$typeid' OR topid='$typeid') ";
}
// 如果指定了模型,则添加模型条件
if ($mid > 0) {
    $query .= " AND arc.channel = '$mid' ";
}
// 如果指定了时间,则添加时间条件
if ($addtime) {
    $query .= $addtime;
}
// ... 后续分页等代码 ...

search.php 修改要点:

  • 接收参数:使用 isset()is_numeric() 安全地获取URL传递过来的 midtime 参数。
  • 构建SQL:在构建最终的SQL查询语句时,使用 AND 将新的条件(如 arc.channel = '$mid')拼接进去。
  • 注意SQL注入:对于来自用户输入的变量(如$keyword),最好使用 dede_filter 函数或 preg_replace 进行过滤,上面的代码已做简单处理。

第2步:修改搜索结果页模板 search.htm

现在我们需要在 search.htm 中添加表单元素,让用户可以提交这些自定义参数。

示例代码:

<form name="formsearch" action="{dede:global name='cfg_phpurl'/}/search.php">
    <div>
        <input type="hidden" name="kwtype" value="0" />
        <input type="text" name="keyword" id="keyword" />
        <select name="typeid">
            <option value='0'>所有栏目</option>
            {dede:channel type='son'}
            <option value='id'>typename</option>
            {/dede:channel}
        </select>
        <!-- 新增:模型选择 -->
        <select name="mid">
            <option value="0">所有模型</option>
            <option value="1">文章</option>
            <option value="2">软件</option>
            <!-- 这里的value需要对应你后台的模型ID -->
        </select>
        <!-- 新增:时间选择 -->
        <select name="time">
            <option value="0">全部时间</option>
            <option value="1">一天内</option>
            <option value="3">三天内</option>
            <option value="7">一周内</option>
        </select>
        <button type="submit">搜索</button>
    </div>
</form>
<!-- 搜索结果列表 -->
{dede:list pagesize='10'}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
        <p>[field:description/]...</p>
    </li>
{/dede:list}
<!-- 分页 -->
{dede:pagelist listitem="index,end,pre,next,pageno" listsize="5"/}

第3步:在后台生成HTML

修改完 search.phpsearch.htm 后,需要到织梦后台:

  1. 生成 -> HTML更新 -> 搜索页面更新,重新生成搜索结果页。
  2. 或者直接在后台首页点击“更新系统缓存-更新所有”或“一键更新网站”。

总结与建议

特性 方法一 (高级搜索) 方法二 (修改默认搜索)
实现难度 简单,无需修改PHP代码。 中等,需要修改核心文件。
灵活性 较高,适合用户自由选择多种条件。 极高,可以实现任何复杂的搜索逻辑。
适用场景 大多数网站,需要一个独立的、功能丰富的搜索页面。 需要将自定义搜索作为默认行为,或需要非常特殊搜索逻辑的网站。
维护性 模板独立,不影响核心文件,易于维护。 修改了核心文件,升级织梦时可能需要重新修改。

给新手的建议:

  • 优先使用方法一,它足够强大,且安全、易于维护,你可以创建一个“高级搜索”页面,同时保留默认的简单搜索,满足不同用户的需求。
  • 方法二适合有二次开发经验的用户,在修改 search.php 时,请务必小心,特别是SQL查询部分,避免出现安全漏洞。

通过以上两种方法,你就可以轻松地为你的织梦网站打造出功能强大的自定义搜索了。

-- 展开阅读全文 --
头像
织梦后台如何更换网站模板?
« 上一篇 01-30
dede ajax分类信息如何实现动态交互?
下一篇 » 01-30

相关文章

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

目录[+]