织梦搜索如何显示自定义字段?

99ANYc3cd6
预计阅读时长 26 分钟
位置: 首页 织梦建站 正文
  1. 修改搜索程序文件:让搜索逻辑包含自定义字段。
  2. 修改搜索结果模板文件:在搜索结果页中调用并显示自定义字段。
  3. (可选)修改搜索表单:让前端搜索框可以指定搜索特定字段。

下面我将为你提供详细的图文步骤说明。

织梦搜索显示自定义字段
(图片来源网络,侵删)

准备工作:添加一个自定义字段

为了演示,我们先在后台给文章模型添加一个自定义字段,video_url”(视频链接)。

  1. 登录织梦后台。
  2. 进入「核心」 -> 「内容模型管理」。
  3. 找到并点击你正在使用的模型,通常是“文章”模型,然后点击“更改”。
  4. 在模型字段设置中,点击“添加新字段”。
  5. 填写字段信息:
    • 字段名: video_url (必须使用英文小写,不要有空格)
    • 字段类型: 选择“单行文本”
    • 字段提示: “视频链接”
    • 前台显示勾选: 勾选此项,这样在前台发布文章时才会显示这个字段。
  6. 保存设置。
  7. 现在去发布一篇新文章,你就会看到多了一个“视频链接”的输入框,填入一些测试内容,https://example.com/video.mp4

第一步:修改搜索程序文件 (search.php)

这是最关键的一步,我们需要修改搜索的核心逻辑,让它去查询我们的自定义字段。

  1. 找到文件: 使用FTP或你的主机控制面板,找到并下载 /plus/search.php 文件。

  2. 定位代码: 在 search.php 文件中,找到以下这段代码(通常在第30行左右):

    织梦搜索显示自定义字段
    (图片来源网络,侵删)
    $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;
    //搜索关键词处理
    $keyword = isset($keyword) ? trim(FilterSearch($keyword)) : '';
    if ($keyword == '') {
        ShowMsg('关键字不能为空!', '-1');
        exit();
    }
  3. 修改代码: 在这段代码的下面,添加如下代码,这段代码的作用是获取当前模型的所有自定义字段名。

    // 获取当前模型的自定义字段名
    $addFieldSql = "SELECT `e`.`maintable` FROM `dede_arctype` AS `t` LEFT JOIN `dede_channeltype` AS `e` ON `t`.`channeltype`=`e`.`id` WHERE `t`.`id` = $typeid";
    $addFieldRow = $dsql->GetOne($addFieldSql);
    $addFieldNames = array();
    if (is_array($addFieldRow) && !empty($addFieldRow['maintable'])) {
        $tableFields = $dsql->GetFields($addFieldRow['maintable']);
        foreach ($tableFields as $field) {
            // 排除系统默认字段,只取自定义字段
            if (!in_array($field['Field'], array('id', 'typeid', 'arcrank', 'channel', 'senddate', 'sortrank', 'mid', 'click', 'money', 'title', 'shorttitle', 'description', 'keywords', 'templet', 'userip', 'filename', 'dutyadmin', 'ismake', 'channeltype', 'image', 'litpic', 'pubdate', 'adminid', 'ismobile', 'typeoptions', 'relatedlinks', 'pagestyle', 'body', 'mtype', 'lastpost', 'tag')) {
                $addFieldNames[] = $field['Field'];
            }
        }
    }
  4. 修改SQL查询语句: 继续向下翻,找到执行数据库查询的SQL语句,它看起来像这样:

    $query = "SELECT arc.id,arc.title,arc.typeid,arc.ismake,arc.channel,arc.arcrank,arc.click,arc.litpic,arc.senddate,arc.mid,arc.memberid
    FROM `dede_archives` arc
    WHERE {$addquery} $anduser
    ORDER BY arc.sortrank DESC";

    这段代码只是查询了主表 dede_archives,我们需要修改它,让它也去查询附加表(存储自定义字段的表)。

    将上述查询代码替换为以下代码:

    // 构建查询附加表的SQL
    $addsql = '';
    if (!empty($addFieldNames)) {
        foreach ($addFieldNames as $field) {
            // 将每个自定义字段都加入到搜索条件中
            $addsql .= " OR arc.addtable LIKE '%".$field."%'";
        }
    }
    // 修改主查询,让它包含附加表中的内容
    $query = "SELECT arc.id,arc.title,arc.typeid,arc.ismake,arc.channel,arc.arcrank,arc.click,arc.litpiC,arc.senddate,arc.mid,arc.memberid
    FROM `dede_archives` arc
    WHERE {$addquery} $anduser
    AND (1=1
        " . $addsql . "
    )
    ORDER BY arc.sortrank DESC";

    注意:上面的 arc.litpiC 应该是 arc.litpic,这里只是展示一个拼写错误的可能性,请确保你的代码是正确的。

  5. 保存文件: 将修改好的 search.php 文件上传回服务器,覆盖原文件。

原理说明

  • 我们首先获取了当前模型的所有自定义字段名。
  • 我们构建了一个 OR 条件,将这些字段名加入到SQL的 WHERE 子句中,虽然 LIKE '%field%' 这种方式不是最高效的,但它能确保搜索程序会去扫描附加表的结构,从而找到包含关键词的记录。
  • 更高级的做法是直接操作附加表,但这种方法相对简单,且能满足大多数需求。

第二步:修改搜索结果模板文件 (search.htm)

现在搜索功能已经可以找到包含自定义字段内容的文章了,但我们还需要在结果页上把它显示出来。

  1. 找到文件: 进入后台「模板」 -> 「模板管理」 -> 「默认模板目录」 -> 「plus」。 找到并下载 search.htm 文件。

  2. 定位代码: 在 search.htm 中,找到循环显示搜索结果的部分,通常是一个 {dede:list}{dedarclist} 标签。

    <div class="listbox">
        {dede:list pagesize='10'}
        <li>
            <span class="title"><a href="[field:arcurl/]">[field:title/]</a></span>
            <span class="info">([field:pubdate function="MyDate('Y-m-d',@me)"/])</span>
        </li>
        {/dede:list}
    </div>
  3. 添加自定义字段调用: 在 {dede:list} 标签内部,你希望显示自定义字段的位置,添加以下代码:

    <div class="listbox">
        {dede:list pagesize='10'}
        <li>
            <h3><a href="[field:arcurl/]">[field:title/]</a></h3>
            <p class="intro">[field:description/]...</p>
            <!-- ====== 在这里添加自定义字段的调用 ====== -->
            <p class="custom-field">
                视频链接:<a href="[field:video_url/]" target="_blank">观看视频</a>
            </p>
            <!-- ======================================== -->
            <div class="info">发布时间:[field:pubdate function="MyDate('Y-m-d',@me)"] | 点击:[field:click/]</div>
        </li>
        {/dede:list}
    </div>
    • [field:video_url/] 就是调用我们第一步中创建的自定义字段。字段名必须和后台设置的字段名完全一致
    • 你可以根据需要,为这个字段添加CSS样式,让它在页面上更美观。
  4. 保存文件: 将修改好的 search.htm 文件上传回服务器,覆盖原文件。


第三步:(可选)修改搜索表单,实现字段筛选

我们希望用户可以直接选择搜索“标题”还是“自定义字段内容”,这需要修改搜索表单和 search.php

  1. 修改搜索表单: 在你的网站搜索框所在的模板文件(如 head.htm)中,将普通的搜索表单修改为带下拉选择框的表单。

    <form name="formsearch" action="/plus/search.php">
        <input type="hidden" name="kwtype" value="0" id="kwtype" />
        <select name="searchtype" id="searchtype">
            <option value="title" selected>搜索标题</option>
            <option value="body">搜索内容</option>
            <option value="video_url">搜索视频链接</option> <!-- 新增 -->
        </select>
        <input type="text" name="q" id="q" />
        <button type="submit">搜索</button>
    </form>
  2. 修改 search.php: 在 search.php 中,找到处理 $keyword 的地方,根据 searchtype 的值来构建不同的查询条件。

    // ... (前面的代码不变) ...
    $keyword = isset($keyword) ? trim(FilterSearch($keyword)) : '';
    if ($keyword == '') {
        ShowMsg('关键字不能为空!', '-1');
        exit();
    }
    // 获取搜索类型
    $searchtype = isset($searchtype) ? trim($searchtype) : 'title';
    // 根据搜索类型构建查询条件
    $addquery = " arc.title LIKE '%$keyword%' ";
    if ($searchtype == 'body') {
        $addquery = " arc.body LIKE '%$keyword%' ";
    } elseif ($searchtype == 'video_url') {
        // 这里假设你的自定义字段在 dede_addonarticle 表中
        // 注意:如果你的附加表名不是这个,需要修改
        $addquery = " EXISTS (SELECT 1 FROM dede_addonarticle WHERE aid = arc.id AND video_url LIKE '%$keyword%') ";
    }
    // ... (后面的代码保持不变) ...

    注意:这种直接拼接SQL的方式存在SQL注入风险,在实际生产环境中,你应该使用 $dsql->SetQuery()$dsql->Execute() 等更安全的方式来执行查询,但对于一个简单的自定义功能,这种方式可以快速实现。


总结与注意事项

  • 步骤顺序:务必按照“修改程序 -> 修改模板”的顺序进行。
  • 文件备份:在修改任何核心文件(如 search.php)之前,请务必备份原文件,以防出错。
  • 缓存问题:修改模板后,如果看不到效果,请去后台清理一下“模板缓存”。
  • 字段名大小写:调用自定义字段时 [field:video_url/]video_url 必须和后台设置的字段名完全一致,包括大小写。
  • 效率问题:修改 search.php 的方法会增加数据库查询的负担,如果你的网站数据量非常大,可能会导致搜索变慢,对于大型网站,建议考虑使用更专业的全文搜索引擎(如Elasticsearch)来替代织梦的默认搜索。

通过以上步骤,你就可以成功地在织梦CMS的搜索结果中显示自定义字段了。

-- 展开阅读全文 --
头像
火车头采集器与dede5.7如何对接?
« 上一篇 01-11
谭浩强C语言视频教程适合零基础学吗?
下一篇 » 01-11
取消
微信二维码
支付宝二维码

目录[+]