Shopify标签视图下blog.articles无法显示全部文章的问题
解决Shopify博客标签页归档只显示当前年月的问题
这个问题我之前帮不少Shopify开发者踩过坑——核心原因很简单:当你进入标签页面(比如/blogs/news/tagged/december-2017)时,blog.articles已经是经过标签过滤后的文章集合,只包含当前标签下的内容,所以你循环这个集合只能拿到2017年12月的文章,自然没法展示全量的归档信息。
要解决这个问题,关键是要获取整个博客的所有文章,而不是当前页面过滤后的子集。具体实现步骤如下:
1. 替换文章集合为全量博客文章
在Liquid中,你可以通过blogs['你的博客handle'].articles来获取指定博客的全部文章,而不是依赖当前页面的blog.articles。比如你的博客handle是news,就用blogs['news'].articles,这个集合在任何页面(包括标签页、文章详情页)都能返回该博客的所有文章。
2. 去重年月并输出归档链接
接下来还是用你熟悉的if/unless逻辑去重年月,但基于全量文章集合处理。下面是完整的侧边栏归档代码示例:
{% comment %} 替换成你实际的博客handle,比如news {% endcomment %} {% assign all_articles = blogs['news'].articles %} {% assign processed_dates = '' | split: ',' %} <div class="blog-archive-sidebar"> <h3>博客归档</h3> <ul class="archive-list"> {% for article in all_articles %} {% comment %} 提取文章发布的年份和带年份的月份名称 {% endcomment %} {% assign article_year = article.published_at | date: '%Y' %} {% assign article_month_name = article.published_at | date: '%B %Y' %} {% comment %} 用「年份-月份数字」作为唯一标识,避免重复输出同一个年月 {% endcomment %} {% assign date_identifier = article_year | append: '-' | append: article.published_at | date: '%m' %} {% comment %} 只输出未处理过的年月 {% endcomment %} {% unless processed_dates contains date_identifier %} <li> {% comment %} 生成和你标签匹配的URL,handleize会自动转成december-2017这种格式 {% endcomment %} <a href="/blogs/news/tagged/{{ article_month_name | handleize }}"> {{ article_month_name }} </a> </li> {% comment %} 将已处理的年月标识加入数组,避免重复 {% endcomment %} {% assign processed_dates = processed_dates | push: date_identifier %} {% endunless %} {% endfor %} </ul> </div>
3. 关键细节说明
- 博客handle替换:一定要把
blogs['news'].articles中的news改成你自己博客的handle(可以在Shopify后台博客设置里查看)。 - 标签URL匹配:
article_month_name | handleize会自动把December 2017转换成december-2017,和你现有的标签页面URL完全匹配,不用手动修改标签命名。 - 性能注意:如果你的博客文章超过50篇,Shopify默认只会返回前50篇,这时候归档会缺失更早的内容。解决办法是:
- 如果你用的是Shopify Plus,可以通过
limit参数获取更多文章(最多200篇); - 普通店铺可以考虑用Metafield预先存储所有归档年月,或者通过AJAX加载更多文章来补充归档。
- 如果你用的是Shopify Plus,可以通过
这样修改后,不管你在博客首页还是任何标签页面,侧边栏都会显示全量的博客归档信息啦。
内容的提问来源于stack exchange,提问作者nebulousecho
相关产品推荐
相关产品推荐

