我会尽力解释这一点,如果这看起来令人困惑,很抱歉。
我有一个定制的主题。我试着从博客中提取文章,并将它们放入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 %}
这将是我个人选择的方向,我不知道它是否符合你的需求。