dede 搜索页调入

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

在 DedeCMS 中,搜索结果页的调用与普通的内容列表页(如栏目页、首页)有本质区别。它不是通过一个固定的模板标签来调用的,而是通过 PHP 代码在搜索过程中动态生成数据并传递给模板。

dede 搜索页调入
(图片来源网络,侵删)

要修改搜索页的显示,你需要理解两个核心部分:

  1. 搜索逻辑 (plus/search.php):这是处理搜索请求、从数据库查询数据的核心文件。
  2. 搜索模板 (templets/default/search.htm):这是展示搜索结果的 HTML 模板文件。

下面我将分步详细说明如何进行调用和自定义。


第一步:理解搜索流程

当你在网站前台使用搜索框进行搜索时,流程如下:

  1. 用户输入关键词,点击搜索。
  2. 请求被发送到 plus/search.php 文件。
  3. search.php 接收关键词,根据设定的搜索规则(如搜索范围、排序方式)构建 SQL 查询语句。
  4. 执行查询,获取符合条件的文章列表(包括文章 ID、标题、发布时间等)。
  5. 将查询结果(一个数组)和一些公共变量(如关键词、总结果数、分页信息等)传递给 search.htm 模板。
  6. search.htm 模板使用 DedeCMS 的模板标签(如 {dede:list}{dede:field})来循环显示这些数据。

你无法像调用一个普通栏目那样,用 {dede:arclist} 直接调用搜索结果,你操作的模板是 search.htm,而数据来源是 search.php 的处理结果。

dede 搜索页调入
(图片来源网络,侵删)

第二步:修改搜索模板 (templets/default/search.htm)

这是最常用、最安全的修改方式,你几乎所有的显示逻辑都在这里完成。

显示搜索关键词和结果统计

这些信息通常在搜索结果列表的上方,由 search.php 传递过来,使用 {dede:field} 标签调用。

<div class="search-meta">
    <p>搜索关键词:<strong>{dede:keyword/}</strong></p>
    <p>搜索结果:共找到 <strong>{dede:count/}</strong> 条相关内容</p>
</div>
  • {dede:keyword/}: 显示用户搜索的关键词。
  • {dede:count/}: 显示搜索到的总结果数。

循环显示搜索结果列表

这是搜索页的核心,使用 {dede:list} 标签来循环输出每一条搜索结果。

<ul class="search-result-list">
    {dede:list pagesize='10'}
    <li>
        <h3><a href="[field:arcurl/]">[field:title/]</a></h3>
        <p class="summary">[field:info/]...</p>
        <p class="meta">
            发布时间:[field:pubdate function="MyDate('Y-m-d H:i',@me)"/] 
            来源:[field:source/] 
            作者:[field:writer/]
        </p>
    </li>
    {/dede:list}
</ul>

常用标签说明:

dede 搜索页调入
(图片来源网络,侵删)
  • [field:arcurl/]: 文章的链接地址。
  • [field:title/]: 文章标题。
  • [field:info/]: 默认是文章正文的前部分)。
  • [field:pubdate/]: 文章发布时间,通常配合 function 格式化,如 MyDate('Y-m-d H:i',@me)
  • [field:source/]: 文章来源。
  • [field:writer/]: 文章作者。
  • pagesize='10': 每页显示的结果数量。

显示分页

当搜索结果很多时,分页是必不可少的,使用 {dede:pagelist/}

<div class="page-nav">
    {dede:pagelist listsize='4' listitem='pre,next,end,option'/}
</div>
  • listsize='4': 显示 4 个页码链接。
  • listitem='pre,next,end,option': 定义显示哪些分页元素(上一页、下一页、末页、下拉跳转)。

第三步:修改搜索逻辑 (plus/search.php)

如果你想改变搜索的行为

  • ,不搜索内容。
  • 改变搜索结果的排序方式(默认按发布时间倒序)。
  • 改变高亮显示的方式。
  • 添加或移除搜索范围(如只搜索特定栏目)。

这时你需要修改 plus/search.php 文件。

⚠️ 重要警告: 修改核心文件有风险,建议在修改前先备份原文件。

示例1:修改排序方式

默认情况下,搜索结果按 pubdate(发布时间)降序排列,如果你想改为按 click(点击量)降序排列。

  1. 打开 plus/search.php
  2. 找到构建 SQL 查询语句的部分,通常在 //获得搜索的关键字//搜索关键字不能为空 这两行代码之后。
  3. 找到类似这样的代码:
    $query = "SELECT arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,
              tp.namerule,tp.namerule2,tp.ispart,tp.moresite,tp.siteurl
              FROM `#@__archives` arc LEFT JOIN `#@__arctype` tp ON arc.typeid=tp.id
              WHERE {$orwhere} $orderquery LIMIT $startrow,$pagesize";
  4. 修改 $orderquery 变量的定义,默认可能是 $orderquery = "ORDER BY arc.sortrank DESC";$orderquery = "ORDER BY arc.pubdate DESC";
  5. 将其修改为:
    $orderquery = "ORDER BY arc.click DESC"; // 按点击量降序
    // 或者
    $orderquery = "ORDER BY arc.id DESC"; // 按文章ID降序

示例2:修改高亮样式

默认高亮是 <span class='highlight'>关键词</span>,如果你想修改这个样式名。

  1. search.php 文件中,找到 highlight 函数的定义或调用位置。
  2. 通常会有一个循环,将关键词替换为高亮标签的代码,类似:
    $body = str_replace($keyword, "<span class='highlight'>".$keyword."</span>", $body);
  3. 修改 class 的值即可,例如改为 red-text
    $body = str_replace($keyword, "<span class='red-text'>".$keyword."</span>", $body);
  4. 你需要在搜索模板的 CSS 中定义 .red-text 的样式:
    .red-text {
        color: red;
        font-weight: bold;
    }

第四步:高级技巧 - 自定义搜索表单

如果你想创建一个功能更强大的搜索框,比如可以指定栏目、指定时间范围等,你需要自定义搜索表单,并修改 search.php 来接收这些参数。

  1. 创建自定义搜索表单 (例如在 head.htm 或其他页面)

    <form action="{dede:global.cfg_cmspath/}/plus/search.php" name="searchform" method="get">
        <input type="hidden" name="kwtype" value="0" />
        <input type="text" name="q" placeholder="请输入关键词" />
        <select name="typeid">
            <option value="0">全站</option>
            {dede:channel type='son' noself='yes'}
            <option value="[field:id/]">[field:typename/]</option>
            {/dede:channel}
        </select>
        <button type="submit">搜索</button>
    </form>
    • action 指向 search.php
    • name="q" 是关键词的默认字段名。
    • name="typeid" 是指定栏目ID的字段名。
  2. 修改 plus/search.php 接收参数search.php 中,获取关键词的代码 $keyword = empty($keyword)? '': FilterSearch($keyword); 附近,添加获取栏目ID的代码:

    $typeid = isset($typeid) && is_numeric($typeid) ? intval($typeid) : 0;
  3. 修改 SQL 查询条件 在构建 $orwhere 变量的地方,根据 $typeid 的值添加条件。

    $orwhere = " (arc.title like '%$keyword%') ";
    // 如果typeid不为0,则增加栏目条件
    if($typeid > 0) {
        $orwhere .= " AND arc.typeid = '$typeid' ";
    }

    这样,搜索就只会在你选择的栏目内进行了。

任务 修改文件 核心方法
修改搜索结果显示样式 templets/default/search.htm 使用 {dede:field}{dede:list} 等模板标签。
修改搜索结果排序方式 plus/search.php 修改 $orderquery 变量的值。
修改搜索范围(如只搜标题) plus/search.php 修改 $orwhere 变量的 SQL 条件。
修改关键词高亮样式 plus/search.php 修改 str_replace 中的高亮 HTML 标签。
创建高级搜索表单 自定义HTML表单 + plus/search.php 在表单中添加自定义字段(如 typeid),并在 search.php 中处理。

对于绝大多数用户来说,只修改 search.htm 模板文件就足够满足大部分需求了,只有在需要改变搜索底层逻辑时,才需要谨慎地修改 search.php

-- 展开阅读全文 --
头像
织梦仿站单页模板,如何高效适配多需求?
« 上一篇 昨天
织梦下拉搜索怎么做
下一篇 » 昨天
取消
微信二维码
支付宝二维码