dede如何只搜索指定栏目下的内容?

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

修改核心文件 (直接修改 php/search.php)

这是最直接的方法,通过修改搜索的核心文件来强制限定搜索范围。

dede只搜索指定栏目
(图片来源网络,侵删)

优点

  • 简单直接,修改一次即可全局生效。
  • 不需要额外的技术知识。

缺点

  • 侵入性强,直接修改了 DedeCMS 的核心文件,未来如果升级 DedeCMS,这些修改可能会被覆盖,需要重新修改。
  • 不够灵活,如果想临时切换搜索范围,需要再次修改代码。

操作步骤:

  1. 找到文件: 登录你的网站 FTP 或使用主机控制面板,找到并打开 plus/search.php 文件。

  2. 定位代码: 在文件中找到处理搜索关键词和栏目的关键代码段,通常在 if($keyword=="" 判断之后,我们需要在执行搜索查询之前,增加一个条件来限制 typeid

    dede只搜索指定栏目
    (图片来源网络,侵删)
  3. 修改代码: 找到类似下面这样的代码段(不同版本的 DedeCMS 可能略有差异,但逻辑相似):

    // ... 前面的代码 ...
    if($keyword=="" && $typeid==0)
    {
        ShowMsg("请输入搜索关键词!","-1");
        exit();
    }
    // 获得搜索的结果列表
    $typeid = isset($typeid) ? intval($typeid) : 0;
    // --- 在这里插入我们的限制代码 ---
    $channelid = isset($channelid) && is_numeric($channelid) ? $channelid : 0;
    // ... 后面的代码 ...

    // --- 在这里插入我们的限制代码 --- 这一行,替换为以下代码:

    // --- 开始修改 ---
    // 【重要】在这里设置你想要搜索的栏目ID,多个ID用英文逗号隔开
    // 只搜索栏目ID为 1 和 5 的内容
    $allowed_typeids = "1,5";
    // 如果用户没有指定栏目,或者指定的栏目不在允许列表中,则强制设置为允许的栏目
    if ($typeid == 0 || !in_array($typeid, explode(',', $allowed_typeids))) {
        $typeid = $allowed_typeids;
    }
    // --- 结束修改 ---
  4. 保存并上传: 保存修改后的 search.php 文件,并上传回你的服务器,覆盖原文件。

代码解释

dede只搜索指定栏目
(图片来源网络,侵删)
  • $allowed_typeids = "1,5";:这是核心配置,请将 "1,5" 替换成你实际想要搜索的栏目 ID,多个栏目 ID 用英文逗号 分隔。
  • if ($typeid == 0 || !in_array($typeid, explode(',', $allowed_typeids))):这个判断逻辑是:
    • 如果用户没有选择任何栏目($typeid == 0),或者
    • 用户选择的栏目 ID 不在我们允许的列表里(!in_array($typeid, explode(',', $allowed_typeids))),那么
  • $typeid = $allowed_typeids;:就强制将搜索范围设置为我们的允许列表。

这样修改后,无论用户在搜索框中输入什么,只要不指定栏目,或者指定的栏目不在你的白名单里,搜索都会被限制在你指定的栏目内。


使用自定义函数 (推荐,更灵活)

这种方法不修改核心文件,而是通过在模板中调用一个自定义函数来实现,这是更推荐的做法,因为它不会在升级时丢失。

优点

  • 非侵入性:不修改 DedeCMS 核心文件,升级无忧。
  • 灵活:可以在不同的搜索结果页模板中调用不同的栏目列表,实现“一页一配置”。
  • 可复用:自定义函数可以在其他地方也使用。

缺点

  • 需要修改模板文件,并了解一些 PHP 和模板标签的基础。

操作步骤:

  1. 创建自定义函数文件

    • 在你的网站根目录下创建一个名为 myfunctions.php 的文件(如果已存在则无需创建)。
    • myfunctions.php 文件中,添加以下 PHP 函数代码:
    <?php
    /**
     * 获取指定栏目的ID列表,用于搜索
     * @param string $commaSeparatedIds 逗号分隔的允许搜索的栏目ID
     * @return string 返回处理后的栏目ID字符串,用于SQL查询
     */
    function getSearchAllowedTypeids($commaSeparatedIds) {
        // 1. 安全处理:将输入的ID字符串转换为数组
        $allowedIds = array_map('intval', explode(',', $commaSeparatedIds));
        // 2. 过滤掉无效的ID(比如空值或非数字)
        $allowedIds = array_filter($allowedIds);
        // 3. 如果允许的ID列表不为空,则用逗号重新组合
        if (!empty($allowedIds)) {
            return implode(',', $allowedIds);
        }
        // 4. 如果列表为空,则返回0,表示不搜索任何内容(或返回一个你默认的栏目ID)
        return '0';
    }
    ?>
  2. 引入自定义函数

    • 打开 plus/search.php 文件。
    • 在文件最顶部,require_once(dirname(__FILE__)."/../include/config_base.php"); 这一行之后,添加以下代码来引入你的自定义函数文件:
    // ... 原有代码 ...
    require_once(dirname(__FILE__)."/../include/config_base.php");
    require_once(dirname(__FILE__)."/../include/arc.searchview.class.php");
    // --- 在这里引入自定义函数文件 ---
    require_once(dirname(__FILE__)."/../myfunctions.php");
    // --- 结束引入 ---
    // ... 后面的代码 ...
  3. 修改模板文件

    • 打开你的搜索结果页模板文件,通常位于 templets/default/search.htm (或者你自定义的模板目录下)。
    • 在模板中找到 {dede:search} 标签,或者 {dede:pagelist} 标签附近,添加一个隐藏的 input 字段来传递允许的栏目ID。
    <form name="search" action="{dede:global.cfg_cmspath/}/search.php">
      <input type="hidden" name="typeid" id="typeid" value="{dede:php}echo getSearchAllowedTypeids('1,5');{/dede:php}">
      <input type="hidden" name="kwtype" value="0" />
      <input type="text" name="q" class="search-keyword" placeholder="请输入搜索关键词">
      <button type="submit" class="search-submit">搜索</button>
    </form>

    代码解释

    • {dede:php}echo getSearchAllowedTypeids('1,5');{/dede:php}:这是 DedeCMS 模板中执行 PHP 代码的方式。
    • getSearchAllowedTypeids('1,5'):调用我们第一步创建的函数。
    • '1,5'请替换成你实际想要搜索的栏目 ID,你可以根据不同的页面设置不同的值,实现更灵活的控制。
  4. 保存文件: 保存 myfunctions.phpsearch.php 和你的模板文件 (search.htm)。

总结与建议

特性 方法一 (修改核心文件) 方法二 (自定义函数)
侵入性 高,修改核心文件 低,只修改模板和引入文件
升级影响 升级后代码丢失,需重做 无影响,升级后代码依然有效
灵活性 低,全局统一配置 高,可按页面自定义配置
推荐度 ⭐⭐ (仅适用于快速、临时、不考虑升级的场景) ⭐⭐⭐⭐⭐ (强烈推荐,更专业、更稳定)

给你的建议

  • 如果你只是想快速实现这个功能,并且不打算在近期升级 DedeCMS,可以使用方法一
  • 如果你希望网站长期稳定维护,并且可能需要在不同的搜索页面上有不同的搜索范围,强烈推荐使用方法二,这是更规范、更可扩展的做法。
-- 展开阅读全文 --
头像
dede手机端如何调用栏目?
« 上一篇 03-07
织梦模板演示为何生成不了?
下一篇 » 03-07

相关文章

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

目录[+]