微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Shopify Liquid:基于标签的博客文章分页 创建一个单独的 blog.ajax.liquid 模板向该新模板发出提取请求分页请求博客主页

如何解决Shopify Liquid:基于标签的博客文章分页 创建一个单独的 blog.ajax.liquid 模板向该新模板发出提取请求分页请求博客主页

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

我有一个自定义主题。我正在尝试从博客获取文章并将它们放入 7 个单独的标记页面中。本质上创建单独的博客模板标准一个博客模板。页面引入了一个分页为 6 的部分。

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

我已经在我的分配标签分页标签上尝试了“where”过滤器,但没有奏效。当我在 Shopify Slack 上询问时,有人提到将 Section Render API 与端点 '/blogs/{blog_id}/tagged/{tag_id}' 一起使用,但返回了该页面的所有 HTML,我不知道我是怎么做的d 解析和分页。至少可以说,Section Render API 文档是需要的。我在 API 方面的经验有限

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

液体解决方案的问题是我可以对标记的帖子页面应用“视图”,但我仍然必须对其进行分页。我仍然必须使用 {% 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;
})

博客主页

我可能会创建一个静态部分,您可以在其中选择该页面上的博客。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?