order_by

User 69e88e27

发布于:2026-01-16

## 概述

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

## 语法

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

## 排序方向

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

## 支持的集合类型和字段

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

### PagesDrop(页面集合)

支持的排序字段:
- `created_at` - 创建时间
- `visits_count` - 访问次数
- `edited_at` - 编辑时间
- `published_at` - 发布时间
- `feedbacks_count` - 反馈数量

**示例**:

```liquid
{%# 按创建时间降序排序(最新在前) %}
{% 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` - 反馈数量

**示例**:

```liquid
{%# 按创建时间降序排序(最新评论在前) %}
{% 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` - 评论数量

**示例**:

```liquid
{%# 按创建时间降序排序(最新成员在前) %}
{% assign newest_members = site.members | order_by: '-created_at' %}

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

## 使用示例

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

```liquid
{% 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:获取热门页面

```liquid
{% 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:动态排序

根据用户选择或参数动态决定排序方式。

```liquid
{%# 从参数获取排序规则,默认为创建时间降序 %}
{% 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 组合

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

### 与 where 过滤器组合

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

### 链式调用

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

## 常见错误

### 错误 1:对非集合使用 order_by

```liquid
{%# ❌ 错误示例 %}
{% assign page = site.pages | first %}
{% assign sorted = page | order_by: '-created_at' %}  <!-- page 不是集合 -->
```

**问题**:`page` 是单个对象,不是集合,`order_by` 会返回空数组。

**解决**:

```liquid
{%# ✅ 正确示例 %}
{% assign pages = site.pages['/'].pages_in_list | order_by: '-created_at' %}
```

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

```liquid
{%# ❌ 错误示例 %}
{% assign pages = site.pages | order_by: 'title' %}  <!-- title 不是支持的排序字段 -->
```

**问题**:`title` 不是 PagesDrop 支持的排序字段,会被忽略。

**解决**:使用支持的字段,如 `created_at`、`visits_count` 等。

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

```liquid
{%# ❌ 错误示例 %}
{% assign pages = site.pages | order_by: 'created_at desc' %}  <!-- 语法错误 -->
```

**问题**:不支持 `desc` 后缀,应该使用 `-` 前缀。

**解决**:

```liquid
{%# ✅ 正确示例 %}
{% assign pages = site.pages | order_by: '-created_at' %}
```

## 最佳实践

1. **明确排序需求**:根据业务需求选择合适的排序字段和方向

2. **结合 limit 使用**:对于大量数据,始终结合 `limit` 使用,避免性能问题

3. **使用变量**:对于需要动态排序的场景,使用变量存储排序规则

4. **降序优先**:对于列表展示,通常使用降序排序(最新、最热门在前)

5. **字段选择**:根据展示需求选择合适的排序字段(时间、访问量、反馈数等)

6. **测试验证**:在不同数据量下测试排序结果,确保符合预期

## 总结

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

提交反馈