Shopify Liquid:根据标签对博客进行分页 post
Shopify Liquid: Paginating blog post based on tag
我会尽力解释这一点,抱歉,如果它看起来令人困惑。
我有一个自定义主题。我正在尝试从博客中获取文章并将它们放入 7 个单独的标记页面中。本质上是创建单独的博客模板标准一个博客模板。这些页面包含一个按 6 分页的部分。
我可以将博客文章放入版块并分页,但无法过滤掉不需要的标签。当我在分页循环中使用 if/unless 语句时,它只是没有呈现不必要的,但仍然基于它进行分页,所以我在第一页有 3 篇文章,在第二页有 2 篇,依此类推。这就是它为什么会这样做的原因。
我已经在我的分配标签和分页标签上尝试了 'where' 过滤器,但没有用。当我在 Shopify Slack 上询问时,有人提到使用 Section Render API 和端点 '/blogs/{blog_id}/tagged/{tag_id}' 但是 returns该页面中的所有 HTML,我不知道我将如何对其进行解析和分页。至少可以说,Section Render API 文档是缺乏的。我对 APIs 的经验有限
我最接近回答的是这个答案:
液体解决方案的问题是我可以将“视图”应用到标记的帖子页面,但我仍然需要对其进行分页。我仍然必须使用显然不过滤的 {% paginate blog.articles %} 。此主题中不包含分页,我不太确定如何在不干扰主要标记页面的情况下将其添加到我的 'blog-content.liquid' 文件中。
有什么想法吗?代码如下:
<div id="article-index-card-section" class="g-flex">
{% assign blog = blogs.{blog_id} %}
{% paginate blog.articles by 6 %}
{% for article in blog.articles %}
<div class="article-index-card g-vertical">
<div style="display: flex; flex-direction: column;">
<img class="article-index-card-image" src="{{ article.image.src | img_url: 'master' }}">
<div class="article-index-card-text">
<h4>{{ article.title }}</h4>
<p class="t-body">{{ article.excerpt }}</p>
</div>
</div>
<div class="article-index-card-btn btn">
<a href="{{ article.url }}">Learn More</a>
</div>
</div>
{% endfor %}
<div>
{{ paginate | default_pagination: next: '>', previous: '<' }}
</div>
{% endpaginate %}
</div>
在这种情况下,我可能会走 JS 路线。
下面是我大概会做的,不知道合不合你的需要。
创建一个单独的 blog.ajax.liquid 模板
我们将创建一个新的博客模板,我们将仅保留页面的 HTML 需要以加快请求速度并删除未使用的 HTML 元素。
{% layout none %}
<div id="article-index-card-section" class="g-flex">
{% paginate blog.articles by 6 %}
{% for article in blog.articles %}
<div class="article-index-card g-vertical">
<div style="display: flex; flex-direction: column;">
<img class="article-index-card-image" src="{{ article.image.src | img_url: 'master' }}">
<div class="article-index-card-text">
<h4>{{ article.title }}</h4>
<p class="t-body">{{ article.excerpt }}</p>
</div>
</div>
<div class="article-index-card-btn btn">
<a href="{{ article.url }}">Learn More</a>
</div>
</div>
{% endfor %}
<div>
{{ paginate | default_pagination: next: '>', previous: '<' }}
</div>
{% endpaginate %}
</div>
这就是为什么我们在顶部添加行 {% layout none %}
以从默认布局中删除所有 HTML 输出并仅在我们创建的模板上输出 HTML。
向该新模板发出获取请求
我们向博客发出提取请求,但我们必须指定它必须使用新创建的模板,而不是默认模板。
fetch('/blogs/{blog_handle}/tagged/{tag}?view=ajax').then(res => res.text()).then(res => {
document.querySelector('.blog-holder').innerHTML = res;
})
为此,我们将 ?view=ajax
添加到请求的末尾,其中 ajax
部分是我们在 blog.ajax.liquid
之后创建的模板的名称。
需要为每个单独的博客完成此请求,因此如果您有 10 个博客,您将为每个博客执行此请求 10 次。
分页请求
分页请求类似于博客的请求,但您需要将 page=2
参数添加到请求中,其中 2
是页码。
像这样:
fetch('/blogs/{blog_id}/tagged/{tag_id}?view=ajax&page=2').then(res => res.text()).then(res => {
document.querySelector('.blog-template').innerHTML = res;
})
博客主页
我可能会创建一个静态部分,您可以在其中 select 此页面上的博客。
{%- for block in section.blocks -%}
{%- assign _block = block.settings -%}
{%- assign block_blog = _block.blog -%}
<div class="blog-template" data-handle="{{block_blog}}">
</div><!-- /.blog-template -->
{%- endfor -%}
<script>
document.querySelectorAll('.blog-template').forEach(item => {
const handle = item.getAttribute('data-handle');
// make fetch request and the logic for your tags
})
</script>
{% schema %}
{
"name": "Blogs",
"blocks": [
{
"type": "blog",
"name": "Blog",
"settings": [
{
"type": "blog",
"id": "blog",
"label": "Choose a blog"
}
]
}
]
}
{% endschema %}
这是我个人选择的方向,不知道合不合你的需要。
我会尽力解释这一点,抱歉,如果它看起来令人困惑。
我有一个自定义主题。我正在尝试从博客中获取文章并将它们放入 7 个单独的标记页面中。本质上是创建单独的博客模板标准一个博客模板。这些页面包含一个按 6 分页的部分。
我可以将博客文章放入版块并分页,但无法过滤掉不需要的标签。当我在分页循环中使用 if/unless 语句时,它只是没有呈现不必要的,但仍然基于它进行分页,所以我在第一页有 3 篇文章,在第二页有 2 篇,依此类推。这就是它为什么会这样做的原因。
我已经在我的分配标签和分页标签上尝试了 'where' 过滤器,但没有用。当我在 Shopify Slack 上询问时,有人提到使用 Section Render API 和端点 '/blogs/{blog_id}/tagged/{tag_id}' 但是 returns该页面中的所有 HTML,我不知道我将如何对其进行解析和分页。至少可以说,Section Render API 文档是缺乏的。我对 APIs 的经验有限
我最接近回答的是这个答案:
液体解决方案的问题是我可以将“视图”应用到标记的帖子页面,但我仍然需要对其进行分页。我仍然必须使用显然不过滤的 {% paginate blog.articles %} 。此主题中不包含分页,我不太确定如何在不干扰主要标记页面的情况下将其添加到我的 'blog-content.liquid' 文件中。
有什么想法吗?代码如下:
<div id="article-index-card-section" class="g-flex">
{% assign blog = blogs.{blog_id} %}
{% paginate blog.articles by 6 %}
{% for article in blog.articles %}
<div class="article-index-card g-vertical">
<div style="display: flex; flex-direction: column;">
<img class="article-index-card-image" src="{{ article.image.src | img_url: 'master' }}">
<div class="article-index-card-text">
<h4>{{ article.title }}</h4>
<p class="t-body">{{ article.excerpt }}</p>
</div>
</div>
<div class="article-index-card-btn btn">
<a href="{{ article.url }}">Learn More</a>
</div>
</div>
{% endfor %}
<div>
{{ paginate | default_pagination: next: '>', previous: '<' }}
</div>
{% endpaginate %}
</div>
在这种情况下,我可能会走 JS 路线。
下面是我大概会做的,不知道合不合你的需要。
创建一个单独的 blog.ajax.liquid 模板
我们将创建一个新的博客模板,我们将仅保留页面的 HTML 需要以加快请求速度并删除未使用的 HTML 元素。
{% layout none %}
<div id="article-index-card-section" class="g-flex">
{% paginate blog.articles by 6 %}
{% for article in blog.articles %}
<div class="article-index-card g-vertical">
<div style="display: flex; flex-direction: column;">
<img class="article-index-card-image" src="{{ article.image.src | img_url: 'master' }}">
<div class="article-index-card-text">
<h4>{{ article.title }}</h4>
<p class="t-body">{{ article.excerpt }}</p>
</div>
</div>
<div class="article-index-card-btn btn">
<a href="{{ article.url }}">Learn More</a>
</div>
</div>
{% endfor %}
<div>
{{ paginate | default_pagination: next: '>', previous: '<' }}
</div>
{% endpaginate %}
</div>
这就是为什么我们在顶部添加行 {% layout none %}
以从默认布局中删除所有 HTML 输出并仅在我们创建的模板上输出 HTML。
向该新模板发出获取请求
我们向博客发出提取请求,但我们必须指定它必须使用新创建的模板,而不是默认模板。
fetch('/blogs/{blog_handle}/tagged/{tag}?view=ajax').then(res => res.text()).then(res => {
document.querySelector('.blog-holder').innerHTML = res;
})
为此,我们将 ?view=ajax
添加到请求的末尾,其中 ajax
部分是我们在 blog.ajax.liquid
之后创建的模板的名称。
需要为每个单独的博客完成此请求,因此如果您有 10 个博客,您将为每个博客执行此请求 10 次。
分页请求
分页请求类似于博客的请求,但您需要将 page=2
参数添加到请求中,其中 2
是页码。
像这样:
fetch('/blogs/{blog_id}/tagged/{tag_id}?view=ajax&page=2').then(res => res.text()).then(res => {
document.querySelector('.blog-template').innerHTML = res;
})
博客主页
我可能会创建一个静态部分,您可以在其中 select 此页面上的博客。
{%- for block in section.blocks -%}
{%- assign _block = block.settings -%}
{%- assign block_blog = _block.blog -%}
<div class="blog-template" data-handle="{{block_blog}}">
</div><!-- /.blog-template -->
{%- endfor -%}
<script>
document.querySelectorAll('.blog-template').forEach(item => {
const handle = item.getAttribute('data-handle');
// make fetch request and the logic for your tags
})
</script>
{% schema %}
{
"name": "Blogs",
"blocks": [
{
"type": "blog",
"name": "Blog",
"settings": [
{
"type": "blog",
"id": "blog",
"label": "Choose a blog"
}
]
}
]
}
{% endschema %}
这是我个人选择的方向,不知道合不合你的需要。