织梦搜索页标签为何失效?

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

下面我将从最常见的原因解决方案,再到进阶自定义,为你详细拆解这个问题。

织梦搜索页标签没起作用
(图片来源网络,侵删)

核心原因:搜索页的执行流程

要解决问题,首先要明白为什么普通标签在搜索页失效。

  1. 页 (如 article_articlelist.htm):

    • 用户访问一个栏目页或文章页。
    • Dedecms 系统根据 URL 中的 ID(如 arcid=123typeid=45)去数据库查询对应的数据。
    • 然后将这些数据一次性加载到模板中,标签如 {dede:field.title/}{dede:field.body/} 等直接从已加载的数据里读取并显示。
  2. 搜索页 (search.php + search.htm):

    • 用户在搜索框输入关键词,点击搜索,访问 search.php?keyword=你的关键词
    • search.php 脚本被触发,它接收 keyword 参数。
    • 关键步骤search.php 会在数据库中执行 LIKE '%关键词%' 这样的查询,找到所有匹配的文章。
    • 它将查询结果(一个文章ID的列表)传递给搜索模板 search.htm
    • search.htm 中,你看到的 {dede:list}{dede:arclist} 标签,其作用域不是全站所有文章,而是仅限于 search.php 传递过来的这个“搜索结果集”

搜索页的标签之所以“没作用”,往往是因为你试图用标签去获取文章本身的字段(如 {dede:field.title/}),但搜索页模板的核心是循环显示一个动态的、由关键词筛选出的结果列表

织梦搜索页标签没起作用
(图片来源网络,侵删)

最常见的错误及解决方案

问题1:使用了错误的标签来显示搜索结果

错误示例:search.htm 中直接使用:

{dede:field.title/}

这几乎肯定无法工作,因为 search.php 传递给模板的主要数据是“结果列表”,而不是单个文章的详细字段。

正确做法: 使用列表标签来循环遍历搜索结果,在织梦搜索页,最常用的是 {dede:list}

正确示例 (search.htm 模板代码):

织梦搜索页标签没起作用
(图片来源网络,侵删)
<html>
<head>搜索结果-{dede:global name='keyword'/} - {dede:global.cfg_webname/}</title>
</head>
<body>
    <h1>搜索关键词:"{dede:global name='keyword'/}" 的结果</h1>
    {dede:list pagesize='10'}
    <div class="result-item">
        <h2><a href="[field:arcurl/]">[field:title/]</a></h2>
        <p>[field:description function='cn_substr(@me,200)'/]...</p>
        <div class="info">发布时间:[field:pubdate function="MyDate('Y-m-d',@me)"/] &nbsp; 来源:[field:source/] &nbsp; 点击:[field:click/]</div>
    </div>
    {/dede:list}
    <!-- 分页标签 -->
    <div class="page">
        {dede:pagelist listsize='4' listitem='info,index,end,pre,next,pageno'}
        {/dede:pagelist}
    </div>
</body>
</html>

标签解释:

  • {dede:global name='keyword'/}: 获取用户搜索的关键词,这是搜索页最常用的全局变量。
  • {dede:list}: 循环输出搜索结果,它的行为和普通列表页的 {dede:list} 一样,但数据源被 search.php 限制为搜索结果。
  • [field:title/], [field:arcurl/], [field:description/]: 这些是 {dede:list} 内部的字段标签,用于获取当前循环中这篇文章的标题、链接、摘要等。
  • {dede:pagelist}: 输出分页导航,搜索结果通常很多,分页是必须的。

问题2:{dede:list} 没有输出任何内容

如果你用了 {dede:list} 但什么都没显示,原因通常是:

  1. 没有匹配的结果:最简单的原因,数据库里根本没有包含你搜索关键词的文章。

    • 解决方法:确认你的搜索关键词是存在的,并且发布文章时,标题、内容等字段确实包含了该词。
  2. 织梦搜索功能未开启或损坏

    • 解决方法
      1. 登录织梦后台。
      2. 进入【系统】-> 【系统基本参数】
      3. 在左侧菜单选择 【核心设置】
      4. 找到 “是否开启全文搜索功能”,确保它被设置为“是”。
      5. 点击【保存】。
  3. 搜索索引表未生成或为空: 织梦的搜索依赖一个名为 dede_searchindex 的数据表来存储索引,如果这个表是空的或损坏了,搜索就找不到结果。

    • 解决方法(重建索引):
      1. 登录织梦后台。
      2. 进入【系统】-> 【系统设置】 -> 【全站搜索设置】
      3. 在这里你可以找到“重建搜索索引”的按钮或链接,点击它,系统会重新扫描所有文章并生成索引,这个过程可能需要一些时间,特别是文章很多的时候。

问题3:需要调用文章的其他自定义字段

假设你的文章模型有自定义字段,如 writer(作者)、price(价格)等。

错误示例:{dede:list} 循环外调用,或者使用了错误的标签。

<!-- 错误 -->
作者:{dede:field.writer/}

正确做法:{dede:list} 的循环内部,使用 [field:自定义字段名/] 的形式调用。

正确示例:

{dede:list pagesize='10'}
<div class="result-item">
    <h2><a href="[field:arcurl/]">[field:title/]</a></h2>
    <p>作者:[field:writer/]</p>  <!-- 正确调用自定义字段 -->
    <p>价格:¥[field:price/]</p> <!-- 正确调用自定义字段 -->
    <p>[field:description function='cn_substr(@me,200)'/]...</p>
</div>
{/dede:list}

进阶:自定义搜索页模板和逻辑

有时候默认的 search.phpsearch.htm 无法满足需求,比如你想根据不同栏目搜索,或者想修改搜索结果的排序方式,这时你需要修改PHP文件。

场景: 我想让搜索结果按“发布时间”倒序排列,而不是默认的相关度。

操作步骤:

  1. 备份文件:非常重要!请先备份 /plus/search.php 文件。

  2. 修改 search.php: 用代码编辑器打开 /plus/search.php,找到生成查询SQL语句的核心部分,通常在 if($typeid > 0) 这样的判断之后。 你会看到类似这样的代码:

    // ... 其他代码 ...
    $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} $typeidorder $ordersql LIMIT $startrow,$pagesize";
    // ... 其他代码 ...

    你需要修改 $ordersql 这个变量,默认的 $ordersql 可能是 ORDER BY arc.id DESC。 你可以将其修改为:

    // 在生成 $query 之前,确保 $ordersql 被定义为按发布时间排序
    // 找到类似 $ordersql = ''; 的行,并修改它
    $ordersql = " ORDER BY arc.pubdate DESC "; // 按发布时间倒序
    // 或者
    // $ordersql = " ORDER BY arc.click DESC "; // 按点击量倒序

    注意:修改SQL语句有风险,请确保你的SQL语法正确。

  3. 上传并测试:将修改后的 search.php 文件上传到你的服务器,然后进行搜索测试。


总结排查清单

当你的织梦搜索页标签不工作时,请按以下顺序检查:

  1. 检查模板标签:确认在 search.htm 中使用了 {dede:list}[field:*] 标签来循环和显示结果,而不是直接使用 {dede:field.*}
  2. 检查关键词:确认搜索的关键词在数据库中确实存在。
  3. 检查搜索功能开关:后台【系统基本参数】->【核心设置】->“是否开启全文搜索功能”设为“是”。
  4. 重建搜索索引:后台【系统设置】->【全站搜索设置】->“重建搜索索引”。
  5. 检查自定义字段:如果需要调用自定义字段,确保在 {dede:list} 循环内部使用 [field:字段名/]
  6. 检查模板文件:确保 search.htm 文件存在于你的模板目录下,并且文件名正确。
  7. 检查缓存:清除浏览器缓存和织梦后台的缓存(【生成】->【更新系统缓存】)。

按照这个流程,90% 以上的搜索页标签问题都能得到解决,如果还有问题,请提供你的 search.htm 模板代码,以便更精确地定位问题。

-- 展开阅读全文 --
头像
dede 整合 ucenter
« 上一篇 01-09
织梦数据库安装视频新手如何避坑?
下一篇 » 01-09

相关文章

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

目录[+]