order_by

User 69e88e27

发布于:2026-01-16

概述

order_by 是一个 Liquid 过滤器,用于对数据集合进行排序。排序规则由不同的集合类型所支持的方式而决定。该过滤器只对集合 Drop 对象有效,如果输入不是集合 Drop,将返回空数组。

语法

{{ 集合 | order_by: "字段名" }}
{{ 集合 | order_by: "-字段名" }}  <!-- 降序排序 -->
{{ 集合 | order_by: "字段1", "字段2" }}  <!-- 多字段排序 -->

排序方向

  • 升序(默认):直接使用字段名,如 "created_at"
  • 降序:在字段名前加 - 前缀,如 "-created_at"

支持的集合类型和字段

不同的集合类型支持不同的排序字段:

PagesDrop(页面集合)

支持的排序字段: - created_at - 创建时间 - visits_count - 访问次数 - edited_at - 编辑时间 - published_at - 发布时间 - feedbacks_count - 反馈数量
示例
{%# 按创建时间降序排序(最新在前) %}
{% assign latest_pages = site.pages['/'].pages_in_list | order_by: '-created_at' %}

{%# 按访问次数降序排序(最热门在前) %}
{% assign popular_pages = site.pages['/'].pages_in_list | order_by: '-visits_count' %}

{%# 按创建时间升序排序(最早在前) %}
{% assign oldest_pages = site.pages['/'].pages_in_list | order_by: 'created_at' %}

CommentsDrop(评论集合)

支持的排序字段: - created_at - 创建时间 - published_replies_count - 已发布的回复数量 - feedbacks_count - 反馈数量
示例
{%# 按创建时间降序排序(最新评论在前) %}
{% assign newest_comments = site.comments | order_by: '-created_at' %}

{%# 按回复数量降序排序(回复最多的在前) %}
{% assign popular_comments = site.comments | order_by: '-published_replies_count' %}

MembersDrop(成员集合)

支持的排序字段: - created_at - 创建时间 - pages_count - 创建的页面数量 - comment_count - 评论数量
示例
{%# 按创建时间降序排序(最新成员在前) %}
{% assign newest_members = site.members | order_by: '-created_at' %}

{%# 按页面数量降序排序(创建页面最多的在前) %}
{% assign active_members = site.members | order_by: '-pages_count' %}

使用示例

示例 1:获取最新页面列表

{% assign newest_pages = site.pages['/'].pages_in_list | order_by: '-created_at' | limit: 10 %}

<ul>
  {% for page in newest_pages %}
    <li>
      <a href="{{ page.path }}">{{ page.link_text }}</a>
      <span>创建于:{{ page.created_at | date: "%Y-%m-%d" }}</span>
    </li>
  {% endfor %}
</ul>

示例 2:获取热门页面

{% assign hottest_pages = site.pages['/'].pages_in_list | order_by: '-visits_count' | limit: 10 %}

<div class="popular-pages">
  <h2>热门页面</h2>
  {% for page in hottest_pages %}
    <div class="page-item">
      <a href="{{ page.path }}">{{ page.link_text }}</a>
      <span class="visits">访问量:{{ page.visits_count }}</span>
    </div>
  {% endfor %}
</div>

示例 3:动态排序

根据用户选择或参数动态决定排序方式。
{%# 从参数获取排序规则,默认为创建时间降序 %}
{% assign sort_field = params.sort | default: '-created_at' %}
{% assign pages = site.pages['/'].children_in_list | order_by: sort_field %}

{%# 或者根据条件选择排序方式 %}
{% if params.order == 'popular' %}
  {% assign pages = site.pages['/'].children_in_list | order_by: '-visits_count' %}
{% elsif params.order == 'oldest' %}
  {% assign pages = site.pages['/'].children_in_list | order_by: 'created_at' %}
{% else %}
  {% assign pages = site.pages['/'].children_in_list | order_by: '-created_at' %}
{% endif %}

与其他过滤器组合使用

order_by 通常与其他过滤器组合使用,实现更复杂的数据处理。

与 limit 组合

{%# 获取最新 5 个页面 %}
{% assign latest_5 = site.pages['/'].pages_in_list | order_by: '-created_at' | limit: 5 %}

与 where 过滤器组合

{%# 先筛选,再排序 %}
{% assign articles = site.pages | where: 'template_name', 'article' | order_by: '-created_at' %}

链式调用

{%# 获取热门页面,限制 10 条 %}
{% assign popular = site.pages['/'].pages_in_list | order_by: '-visits_count' | limit: 10 %}

常见错误

错误 1:对非集合使用 order_by

{%# ❌ 错误示例 %}
{% assign page = site.pages | first %}
{% assign sorted = page | order_by: '-created_at' %}  <!-- page 不是集合 -->
问题page 是单个对象,不是集合,order_by 会返回空数组。
解决
{%# ✅ 正确示例 %}
{% assign pages = site.pages['/'].pages_in_list | order_by: '-created_at' %}

错误 2:使用不支持的字段

{%# ❌ 错误示例 %}
{% assign pages = site.pages | order_by: 'title' %}  <!-- title 不是支持的排序字段 -->
问题title 不是 PagesDrop 支持的排序字段,会被忽略。
解决:使用支持的字段,如 created_atvisits_count 等。

错误 3:排序方向语法错误

{%# ❌ 错误示例 %}
{% assign pages = site.pages | order_by: 'created_at desc' %}  <!-- 语法错误 -->
问题:不支持 desc 后缀,应该使用 - 前缀。
解决
{%# ✅ 正确示例 %}
{% assign pages = site.pages | order_by: '-created_at' %}

最佳实践

  1. 明确排序需求:根据业务需求选择合适的排序字段和方向
  2. 结合 limit 使用:对于大量数据,始终结合 limit 使用,避免性能问题
  3. 使用变量:对于需要动态排序的场景,使用变量存储排序规则
  4. 降序优先:对于列表展示,通常使用降序排序(最新、最热门在前)
  5. 字段选择:根据展示需求选择合适的排序字段(时间、访问量、反馈数等)
  6. 测试验证:在不同数据量下测试排序结果,确保符合预期

总结

order_by 过滤器是处理集合数据排序的重要工具,支持多种排序字段和排序方向。正确使用此过滤器可以实现各种排序需求,如最新列表、热门内容、活跃用户等。记住只对集合 Drop 使用,并选择合适的排序字段,结合 limit 使用以优化性能。
提交反馈