织梦search.htm如何自定义搜索结果页?

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

search.htm搜索结果页的模板文件,当用户在你的网站使用搜索功能时,系统会自动调用这个模板来展示搜索到的内容。

织梦 search.htm
(图片来源网络,侵删)

下面我将从几个方面为你全面解析它:


文件位置

search.htm 文件通常位于你当前使用主题(模板)的目录下。

  • 默认路径: /templets/default/search.htm
  • 自定义路径: /templets/你的主题名称/search.htm

如果你修改了默认模板,但没有在自定义主题下创建 search.htm,那么系统会回退到默认模板路径去寻找。


核心结构解析

一个标准的 search.htm 文件通常包含以下几个关键部分:

织梦 search.htm
(图片来源网络,侵删)

a. 搜索表单

这是搜索结果页的“输入口”,让用户可以输入新的关键词进行搜索,它通常位于页面顶部。

<form name="formsearch" action="{dede:global name='cfg_phpurl'/}/search.php" method="get">
    <div class="form-search">
        <input type="hidden" name="kwtype" value="0" />
        <input type="hidden" name="searchtype" value="titlekeyword" />
        <input type="text" name="q" class="search-keyword" placeholder="在这里搜索...">
        <button type="submit" class="search-submit">搜索</button>
    </div>
</form>
  • action="{dede:global name='cfg_phpurl'/}/search.php":指定搜索表单提交的目标地址。cfg_phpurl 是系统配置的PHP文件目录,通常是 /plus/php
  • name="q":这是搜索关键词的标准字段名,织梦的搜索程序就是通过读取 $_GET['q'] 来获取用户输入的关键词的。这个字段名不要轻易修改。
  • name="kwtype":关键词类型。
    • 0:精确匹配(默认)
    • 1:模糊匹配
  • name="searchtype":搜索范围。
    • titlekeyword:仅搜索标题和关键词(最常用)
    • keyword:仅搜索文章关键词
    • title:仅搜索文章标题
    • arcbody:仅搜索文章内容

b. 搜索结果列表

这是页面的主体部分,用于循环展示所有搜索到的文章列表,它使用织梦的 arclist 标签或 loop

{dede:arclist titlelen='100' orderby='pubdate' idlist=''}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <span class="info">([field:pubdate function="MyDate('Y-m-d', @me)"/])</span>
        <p>[field:description function="cn_substr(@me, 100)"/]...</p>
    </li>
{/dede:arclist}

{dede:arclist} 标签在搜索页面的特殊用法:

在搜索结果页,arclist 标签有一个非常重要的内置属性 typeid,它的值不是栏目ID,而是用来接收搜索关键词的。

  • typeid='0':表示搜索所有栏目。
  • typeid='-1':表示不搜索任何栏目(通常不用)。
  • 如何传递关键词? 织梦会自动将URL中的 q 参数值(即用户输入的关键词)传递给 arclistkeyword 属性。

一个更完整的搜索结果列表标签应该是这样的:

{dede:arclist 
    typeid='0' 
    keyword='[field:keyword/]' len='60' 
    infolen='160' 
    listsize='10' 
    orderby='pubdate' 
    idlist=''
}
    <div class="result-item">
        <h3><a href="[field:arcurl/]" target="_blank">[field:title/]</a></h3>
        <p class="summary">[field:description/]...</p>
        <div class="info">
            <span>来源:[field:typename/]</span>
            <span>时间:[field:pubdate function="MyDate('Y-m-d', @me)"/]</span>
        </div>
    </div>
{/dede:arclist}

关键属性解释:

  • typeid='0':搜索全站。
  • keyword='[field:keyword/]':这是核心!它将URL中的搜索关键词 q 的值,作为 keyword 参数传递给 arclist,实现搜索功能。[field:keyword/] 在这里会自动获取当前搜索的关键词。
  • titlelen长度。
  • infolen:摘要长度。
  • listsize:每页显示的结果数量(与分页标签配合)。
  • orderby='pubdate':按发布时间排序,也可以是 hot (点击量)、scores (评分) 等。

c. 分页导航

当搜索结果很多,需要分页显示时,就需要分页导航标签。

<div class="dede_pages">
    <ul>
        {dede:pagelist listsize='4' listitem='info,index,end,pre,next,pageno'}
        {/dede:pagelist}
    </ul>
</div>
  • {dede:pagelist}:织梦的分页标签。
  • listsize='4':显示4个页码按钮(如 ... 2 3 [4] 5 6 ...)。
  • listitem='...':定义分页栏显示哪些元素。
    • info:显示总页数、总记录数等信息。
    • index:显示首页。
    • pre:显示上一页。
    • next:显示下一页。
    • pageno:显示页码。
    • end:显示尾页。

一个完整的 search.htm 示例

这是一个功能完整、结构清晰的 search.htm 模板文件,你可以直接使用或在此基础上修改。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">搜索结果 - {dede:global name='cfg_webname'/}</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 引入你的CSS文件 -->
    <link rel="stylesheet" href="/templets/你的主题名称/css/style.css">
</head>
<body>
    <header>
        <!-- 你的网站头部,Logo,导航等 -->
        {dede:include filename='header.htm'/}
    </header>
    <div class="main-container">
        <div class="breadcrumb">
            <a href="/">首页</a> > <span>搜索结果</span>
        </div>
        <!-- 搜索框 -->
        <div class="search-box">
            <form name="formsearch" action="{dede:global name='cfg_phpurl'/}/search.php" method="get">
                <div class="form-search">
                    <input type="hidden" name="kwtype" value="0" />
                    <input type="hidden" name="searchtype" value="titlekeyword" />
                    <input type="text" name="q" class="search-keyword" placeholder="请输入关键词" value="{dede:global name='keyword'/}">
                    <button type="submit" class="search-submit">搜索</button>
                </div>
            </form>
        </div>
        <!-- 搜索结果提示 -->
        <div class="search-result-info">
            <p>为您找到 <strong>{dede:global name='resultcount'/}</strong> 条与 "<strong>{dede:global name='keyword'/}</strong>" 相关的结果</p>
        </div>
        <!-- 搜索结果列表 -->
        {dede:arclist 
            typeid='0' 
            keyword='[field:keyword/]' 
            titlelen='60' 
            infolen='160' 
            listsize='10' 
            orderby='pubdate' 
            idlist=''
        }
        <div class="result-item">
            <h3><a href="[field:arcurl/]" target="_blank">[field:title/]</a></h3>
            <p class="summary">[field:description/]...</p>
            <div class="info">
                <span>来源:[field:typename/]</span>
                <span>时间:[field:pubdate function="MyDate('Y-m-d', @me)"/]</span>
            </div>
        </div>
        {/dede:arclist}
        <!-- 如果没有搜索到结果 -->
        {dede:global name='itemindex' runphp='yes'}
        if(@me == 1) {
            @me = '<div class="no-result">抱歉,没有找到与 "<strong>{dede:global name="keyword"/}</strong>" 相关的结果。</div><div class="search-suggest">建议您:<br>1. 检查输入的关键词是否正确<br>2. 尝试使用其他关键词或更简洁的关键词搜索</div>';
        } else {
            @me = '';
        }
        {/dede:global}
        <!-- 分页导航 -->
        {dede:pagelist listsize='4' listitem='info,index,end,pre,next,pageno'/}
    </div>
    <footer>
        <!-- 你的网站底部 -->
        {dede:include filename='footer.htm'/}
    </footer>
</body>
</html>

常见问题与高级技巧

Q1: 如何让搜索结果按相关度排序,而不是按时间?

A1: 在 arclist 标签中,将 orderby 属性改为 rank

{dede:arclist ... orderby='rank' ...}

rank 就是按相关度排序,这通常能带来更好的搜索体验。

Q2: 如何修改搜索结果的摘要长度?

A2: 使用 infolen 属性控制。infolen='200' 表示摘要长度为200个字符。

{dede:arclist ... infolen='200' ...}

Q3: 如何实现“搜索并指定栏目”?

A3: 这需要稍微修改一下,你不能直接在 search.htm 里硬编码栏目ID,因为用户可能想搜索所有栏目,通常的做法是在搜索表单里增加一个栏目选择的下拉框。

修改后的搜索表单:

<form name="formsearch" action="{dede:global name='cfg_phpurl'/}/search.php" method="get">
    <input type="text" name="q" placeholder="关键词">
    <!-- 增加一个栏目选择下拉框 -->
    <select name="typeid">
        <option value="0">全站搜索</option>
        {dede:channel type='son' noself='yes'}
        <option value='{typeid}'>{typename}</option>
        {/dede:channel}
    </select>
    <button type="submit">搜索</button>
</form>

修改后的 arclist

这时,typeid 的值就不是固定的 '0' 了,它需要从URL参数中获取。

{dede:arclist 
    typeid='{dede:global name='typeid'/}' 
    keyword='[field:keyword/]' 
    ... 
}

这样,当用户选择了某个栏目并搜索时,typeid 的值就是所选栏目的ID,arclist 就只会在该栏目下搜索。

Q4: 为什么搜索结果页的标题是 "搜索结果",而不是包含关键词的标题?

A4: 你需要在 <title> 标签里动态获取关键词。

这样,当用户搜索“织梦教程”时,页面标题就会变成“搜索结果: 织梦教程 - 你的网站名”,对SEO更友好。

希望这份详细的解析能帮助你完全理解和使用织梦的 search.htm 模板!

-- 展开阅读全文 --
头像
织梦CMS数据库配置文件在哪?
« 上一篇 01-03
dede如何调用当前顶级栏目链接?
下一篇 » 01-03

相关文章

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