如何自定义安企CMS的搜索结果页显示逻辑和内容排序?

优化网站的搜索结果页,使其不仅能准确呈现信息,还能根据用户的偏好智能排序,是提升用户体验和网站效率的关键一环。安企CMS提供了强大而灵活的模板引擎和丰富的标签库,让定制搜索结果页的显示逻辑和内容排序变得直观且高效。

在安企CMS中,搜索结果页通常由特定的模板文件控制,该文件默认位于您当前使用的模板主题目录下的 search/index.html(或扁平化模式下的 search.html)。要自定义搜索结果的呈现方式,我们将主要围绕这个模板文件以及安企CMS内置的模板标签展开。

理解安企CMS的搜索机制

当用户在您的网站上执行搜索时,通常会访问一个类似于 /search?q=关键词 的URL。安企CMS会根据URL中的关键词(q 参数)检索相关内容,并将这些内容以及其他页面信息传递给 search/index.html 模板进行渲染。

这个过程中,archiveList 模板标签是获取搜索结果核心数据的关键。它能够根据多种条件筛选和排序内容,是自定义搜索结果页显示逻辑和排序规则的基础。

定制搜索结果页显示内容

首先,您需要找到并编辑 search/index.html 模板文件。在这个文件中,您会看到用来循环显示搜索结果的 archiveList 标签和 for 循环。

一个基本的搜索结果列表可能看起来像这样:

{% archiveList archives with type="page" limit="10" %}
    {% for item in archives %}
    <div class="search-result-item">
        <h3><a href="{{item.Link}}">{{item.Title}}</a></h3>
        <p>{{item.Description|truncatechars:150}}</p>
        <div class="meta-info">
            <span>分类:{% categoryDetail with name="Title" id=item.CategoryId %}</span>
            <span>发布日期:{{stampToDate(item.CreatedTime, "2006-01-02")}}</span>
            <span>浏览量:{{item.Views}}</span>
        </div>
        {% if item.Thumb %}
        <a href="{{item.Link}}">
            <img alt="{{item.Title}}" src="{{item.Thumb}}">
        </a>
        {% endif %}
    </div>
    {% empty %}
    <p>抱歉,没有找到与“{{urlParams.q}}”相关的结果。</p>
    {% endfor %}
{% endarchiveList %}

在上面的代码中:

  • {% archiveList archives with type="page" limit="10" %}:这行代码告诉系统获取文档列表,并以分页(type="page")的形式,每页显示10条(limit="10")结果。archives 是一个变量,包含了所有符合条件的文档数据。在搜索结果页,它会自动捕获URL中的 q 关键词进行搜索。
  • {% for item in archives %}:循环遍历 archives 中的每一条文档记录。
  • {{item.Title}}{{item.Link}}{{item.Description}} 等:这些是文档对象(item)的属性,您可以根据需要显示文档的标题、链接、简介、缩略图等信息。
  • |truncatechars:150:这是一个过滤器,用于截取简介内容,使其不超过150个字符,并自动在末尾添加省略号,保持页面整洁。
  • {% categoryDetail with name="Title" id=item.CategoryId %}:通过文档的 CategoryId 获取并显示其所属分类的名称。
  • {{stampToDate(item.CreatedTime, "2006-01-02")}}:这是一个格式化时间戳的标签,将文档的创建时间转换为易读的日期格式。
  • {% empty %}:当没有搜索结果时,此部分内容会被显示,提升用户体验。
  • {{urlParams.q}}:直接从URL中获取当前搜索的关键词,用于在无结果时提示用户。

此外,您还可以显示文档的任何自定义字段,只需在 archiveDetail 标签中指定字段名称即可,或者通过 archiveParams 循环显示所有自定义参数。

优化内容排序逻辑

搜索结果的排序方式直接影响用户找到所需信息的效率。安企CMS的 archiveList 标签提供了灵活的 order 参数,让您可以轻松控制内容的排序。

默认情况下,搜索结果可能按ID降序排列(最新发布),但您可以根据业务需求进行调整。例如,如果您希望按浏览量降序排列,可以在 archiveList 标签中添加 order="views desc"

{% archiveList archives with type="page" limit="10" order="views desc" %}
    {# ... 循环显示搜索结果 ... #}
{% endarchiveList %}

常用的排序方式包括:

  • id desc:按文档ID降序(通常是最新发布优先)。
  • id asc:按文档ID升序(通常是发布时间最旧优先)。
  • views desc:按浏览量降序(热门内容优先)。
  • views asc:按浏览量升序。
  • sort desc:按后台自定义排序字段降序。

更进一步,您还可以为用户提供排序选项。这通常通过在页面上添加一个下拉菜单或按钮组来实现。当用户选择不同的排序方式时,页面会重新加载,并在搜索URL中带上一个排序参数(例如 &order=views_desc)。然后在 archiveList 标签中,您可以动态地读取这个URL参数来设置 order

{# 假设您在URL中通过参数 'sort_by' 传递排序方式 #}
{% archiveList archives with type="page" limit="10" order="{{urlParams.sort_by|default:'id desc'}}" %}
    {# ... 循环显示搜索结果 ... #}
{% endarchiveList %}

此时,您需要在页面中提供一个排序选择的UI,例如:

<select onchange="window.location.href = updateQueryStringParameter(window.location.href, 'sort_by', this.value);">
    <option value="id desc" {% if urlParams.sort_by == 'id desc' or not urlParams.sort_by %}selected{% endif %}>最新发布</option>
    <option value="views desc" {% if urlParams.sort_by == 'views desc' %}selected{% endif %}>热门浏览</option>
</select>
<script>
function updateQueryStringParameter(uri, key, value) {
    var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i");
    var separator = uri.indexOf('?') !== -1 ? "&" : "?";
    if (uri.match(re)) {
        return uri.replace(re, '$1' + key + "=" + value + '$2');
    } else {
        return uri + separator + key + "=" + value;
    }
}
</script>

用户选择后,页面会自动刷新并按新的排序规则显示结果。

增强搜索结果显示逻辑:筛选与分类

除了排序,用户