网站已运行 162 · 20小时 · 41 · 29
目录

Shopify Liquid paginate 教程:Dawn 集合页分页与性能限制实测

Shopify Liquid paginate 集合页分页代码与页码示意图

Shopify Liquid paginate 不只是把页码放到商品列表底部。它同时决定每次查询多少条数据、当前页使用哪个 URL 参数,以及筛选条件能否在翻页时继续保留。本文基于 Dawn 16.0.0 的集合页代码做一次完整拆解,并用 Shopify CLI 4.7.1 验证分页大小门禁。

本次只修改本地主题副本,没有上传主题,也没有改动在线商店。基线 Theme Check 检查 156 个文件,得到 Dawn 副本已有的 11 个 warning;加入测试 Section 后,把每页数量从 60 改回 24,新增的 PaginationSize warning 消失,最终仍是原来的 11 个 warning。

Shopify Liquid paginate 解决什么问题

Liquid 的普通 for 循环每页最多迭代 50 次。要遍历更长的可分页数组,应把循环放进 paginate 标签。这样 Shopify 会按页查询数据,并在标签内部提供 paginate 对象。

可分页对象不只有 collection.products,还包括博客文章、搜索结果、客户订单、产品变体,以及部分列表类型的主题设置。对集合页来说,最常见的结构是“分页标签包住商品循环,循环结束后再输出翻页导航”。

Dawn 集合页的实际分页结构

Dawn 16.0.0 在 sections/main-collection-product-grid.liquid 中使用下面这行代码:

{% paginate collection.products by section.settings.products_per_page %}

products_per_page 不是写死的数字,而是该 Section 的范围设置。Dawn 给出的范围是 8–36,步进 4,默认值 16。商品循环、筛选组件和分页导航都位于同一个 paginate 作用域内;只有 paginate.pages > 1 时,才会渲染 snippets/pagination.liquid

如果还没理清 template、section 和 snippet 的职责,可以先看 Shopify Dawn 主题目录结构。集合模板负责装配 Section,商品网格 Section 负责查询与循环,pagination snippet 则专门负责导航标记。

一个可复现的最小分页 Section

为了单独验证 Shopify Liquid paginate,我在 Dawn 副本中增加了一个只用于本地测试的集合页 Section。它每页取 24 个商品,并复用 Dawn 现有的分页 snippet:

<div class="page-width">
  {% paginate collection.products by 24 %}
    <ul role="list">
      {% for product in collection.products %}
        <li>{{ product.title | escape }}</li>
      {% endfor %}
    </ul>

    {% if paginate.pages > 1 %}
      {% render 'pagination', paginate: paginate %}
    {% endif %}
  {% endpaginate %}
</div>

这里的 paginate 对象只在标签内部可用。把导航挪到 endpaginate 后面,或在 render 时忘记显式传入 paginate,snippet 都拿不到当前页、上一页和下一页数据。

default_pagination 还是自定义 snippet

最快的写法是 {{ paginate | default_pagination }}。它会直接生成上一页、页码和下一页链接,也能通过参数调整前后翻页文字或追加锚点。适合原型和简单主题。

Dawn 没有直接使用这个过滤器,而是遍历 paginate.parts,并读取 paginate.previouspaginate.nextpaginate.current_page。这样可以控制图标、class、aria-current 和无障碍标签,同时保持与主题样式一致。

自定义导航时不要只拼接 ?page=2。优先使用 part.urlprevious.urlnext.url,因为这些 URL 由 Shopify 生成,更适合与集合筛选、排序和现有查询参数一起工作。

250 是平台上限,不是建议的每页数量

Shopify 当前允许 paginatepage_size 在 1–250 之间,但这只是平台边界,不代表集合页应该一次输出 250 张商品卡。Dawn 把可配置范围收在 8–36,默认 16,更符合常见商品网格的图片、DOM 数量和移动端加载成本。

另一个边界是最多分页到数组的第 25,000 项;对超过这个规模的目录,官方建议先通过商品类型、价格、库存等筛选缩小结果,而不是让买家一直翻到极深页码。计数超过 25,000 时也要把 25,001 理解为“多于 25,000”,不是精确总数。

Theme Check 前后实测

平台允许到 250,但项目可以设更严格的性能阈值。我在测试副本的 .theme-check.yml 中把 PaginationSize.max_size 设为 50,再把测试 Section 改成每页 60 条:

PaginationSize:
  enabled: true
  min_size: 1
  max_size: 50

运行 shopify theme check 后,新增文件得到一条 PaginationSize warning,提示分页数量必须在 1–50 之间。把 60 改成 24 后再次检查,这条 warning 消失;全主题只剩 11 条与基线相同的既有 warning,测试 Section 本身没有 offense。单独使用 Shopify Liquid 校验器检查该 Section 也通过。

这类对比必须保留基线。否则看到 Theme Check 仍有 warning,很容易把 Dawn 原有问题误判成本次修改引入;反过来,只看命令退出成功,也可能漏掉新出现的性能提示。完整的 Theme Check 使用方法可以继续看 Shopify Theme Check 教程

page 参数和多个分页列表

普通分页默认使用 page 查询参数,可以通过 paginate.page_param 读取。对主题设置或 metafield 中的 product_listcollection_listarticle_list 数组,Shopify 会生成类似 page_a9e329dc 的唯一参数,让同一页面上的多个列表可以独立分页。

如果需要让两个列表独立翻页且不刷新整页,官方建议结合 Section Rendering API。这个范围已经不只是输出几个页码,还要处理请求竞争、加载状态、浏览器历史和无障碍焦点;不要先用一段全局 JavaScript 拦截所有分页链接。

修改 Dawn 分页时的检查清单

  1. 确认循环和分页导航都在同一组 paginate 标签内。
  2. 使用 paginate.pages > 1 避免单页结果输出空导航。
  3. 优先使用 Shopify 生成的 part.url,不要手工丢掉筛选和排序参数。
  4. 根据商品卡图片和移动端布局设置合理的每页数量,不把 250 当推荐值。
  5. 保留 Theme Check 修改前后的结果,区分基线 warning 与新增 offense。
  6. 在草稿主题中检查第一页、中间页、最后一页、筛选后翻页和返回键。

本次结论

Shopify Liquid paginate 的可靠改法不是把数字尽量调大,而是让查询大小、商品循环、导航 URL 和主题设置保持一致。Dawn 16.0.0 默认每页 16、可调 8–36;这次本地测试把 60 调回 24 后,PaginationSize 新增 warning 被消除,原有基线 warning 数量保持不变。

如果分页代码还要放进新的页面结构,建议先读 Shopify JSON template 实测,再把 Section 加到备用模板中验证。这样能把“分页逻辑是否正确”和“模板是否装配正确”分开排查。

官方资料:Liquid paginate tagpaginate objectdefault_pagination filter平台分页限制PaginationSize分页限制 ChangelogDawn v16.0.0 集合页源码Dawn v16.0.0 分页 snippet(访问日期:2026 年 9 月 9 日;实测环境:Dawn 16.0.0、Shopify CLI 4.7.1)。

数臻源码猫咪图标
目录
数臻源码猫咪图标

目录

标签云: