Shopify Liquid:基于标签的博客文章分页



我会尽力解释这一点,如果这看起来令人困惑,很抱歉。

我有一个定制的主题。我试着从博客中提取文章,并将它们放入7个单独的标签页面中。本质上是创建独立的博客模板标准的一个博客模板。这些页面引入了一个页码为6的部分。

我可以将博客文章放入该部分并分页,但无法过滤掉不必要的标签。当我在分页循环中使用if/excess语句时,它没有呈现不必要的语句,但仍然基于它进行分页,所以我在第一页上有3篇文章,在第二页上有2篇文章,依此类推。这就是为什么它会这样做的原因。

我在assign标记和paginate标记上尝试了"where"过滤器,但没有成功。当我在Shopify Slack上询问时,有人提到使用Section Render API,端点为"/blogs/{blog_id}/tagged/{tag_id}",但返回该页面的所有HTML,我不知道如何解析和分页。至少可以说,渲染API部分文档是需要的。我的API经验有限

我最接近的答案是这样的:https://stackoverflow.com/a/60000460/12948634

液体溶液的问题在于;视图";到标记的帖子页面,但我仍然需要对其进行分页。我仍然需要使用显然没有筛选的{%paginate blog.articles%}。分页不包括在这个主题中,我不太确定如何在不干扰主标签页的情况下将其添加到我的"博客内容.液体"文件中。

有什么想法吗?以下代码:

<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.ax.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;
})

博客主页

我可能会创建一个静态部分,在那里你可以选择这个页面上的博客。

{%- 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 %}

这将是我个人选择的方向,我不知道它是否符合你的需求。

最新更新