如何创建单个盖茨比页面以按标签/类别显示和过滤所有博客文章

狐猴网

您好,我正在使用Gatsby和Netlify CMS建立博客。我从gatsby-starter-netlify-cms模板开始。

我有一个/blog页面,我当前在其中显示所有帖子以及所有标签的列表。当用户单击标签时,当前将其重定向到tags/name-of-tag页面,在该页面上显示所有带有该标签的帖子的列表。

我要代替的是直接过滤/blog页面上的列表这样,我只有一个页面可以按标签(可能还可以按术语搜索)显示和过滤博客文章。

因此,标记链接应重定向至/blog?tag-name或类似的名称。我不确定如何告诉Gatsby创建单个页面并可能注入filter值以将其传递给页面查询。

/tags/当前如何创建页面:

// Tag pages:
    let tags = []
    // Iterate through each post, putting all found tags into `tags`
    posts.forEach((edge) => {
      if (_.get(edge, `node.frontmatter.tags`)) {
        tags = tags.concat(edge.node.frontmatter.tags)
      }
    })
    // Eliminate duplicate tags
    tags = _.uniq(tags)

    // Make tag pages
    tags.forEach((tag) => {
      const tagPath = `/tags/${_.kebabCase(tag)}/`

      createPage({
        path: tagPath,
        component: path.resolve(`src/templates/tags.js`),
        context: {
          tag,
        },
      })
    })

这是我的博客页面查询(我希望能够按标签过滤的查询):

export const blogPageQuery = graphql`
  query BlogPageTemplate {
    markdownRemark(frontmatter: { templateKey: { eq: "blog-page" } }) {
      frontmatter {
        image {
          childImageSharp {
            fluid(maxWidth: 2048, quality: 80) {
              ...GatsbyImageSharpFluid
            }
          }
        }
        heading
        subheading
      }
    }
    allMarkdownRemark(
      sort: { order: DESC, fields: [frontmatter___date] }
      filter: { frontmatter: { templateKey: { eq: "blog-post" } } }
    ) {
      edges {
        node {
          id
          fields {
            slug
          }
          excerpt(pruneLength: 180)
          frontmatter {
            date(formatString: "MMMM DD, YYYY")
            title
            description
            featuredpost
            featuredimage {
              childImageSharp {
                fluid(quality: 50, maxWidth: 512) {
                  ...GatsbyImageSharpFluid
                }
              }
            }
          }
        }
      }
    }
  }
`
费兰·布埃鲁

我不确定如何告诉Gatsby创建单个页面并可能注入filter值以将其传递给页面查询。

你不能 在页面查询中过滤数据的唯一方法是使用上下文传递数据。就像您在标签页面中所做的一样:

  createPage({
    path: tagPath,
    component: path.resolve(`src/templates/tags.js`),
    context: {
      tag,
    },
  })

最简单和本机的方法是使用/tag/tag-name页面,该页面旨在按标记名称进行过滤,否则,您将需要获取URL参数并在JavaScriptfilter函数中使用它来过滤来自页面查询的所有数据。由于您缺少博客页面的呈现部分,因此这种方法应该可以起作用:

const BlogTemplate=({ data }){
    if(typeof window !== "undefined"){
      const queryString = window.location.search;
      const urlParams = new URLSearchParams(queryString);
      const urlTag= urlParams.get('tag');
      const filteredPosts= data.allMarkdownRemark.edges.node.filter(node=> node.frontmatter.tag.includes(urlTag))
      const loopData= urlParams.has('tag') ? filteredPosts : data
   }
   
return loopData.allMarkdownRemark.edges.node.map(node=> <h1 key={node.title}>{node.title}</h1>)

}

注意:当然,可以根据您的需要进行调整,但是请理解。

还要注意,您将需要在typeof window !== "undefined"条件中包装所有窗口逻辑,因为在SSR window(和其他全局对象)中不可用

关键部分是根据URL参数的存在来使用data使用filteredPosts,因此,如果存在,则需要过滤数据,否则,需要使用“默认” data(未过滤)。

很难猜测代码的行为方式,但是这个想法依赖于根据URL更改可迭代数据,如果需要,可以使用一些钩子。

根据您的查询,您的博客似乎tag在博客模板查询中不包含任何字段,因此您需要添加它以使filter循环起作用。

代码正常工作后,您将需要添加适当的控件,以避免在缺少某些字段时导致代码中断,但是,思路和遵循的方法是这样。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Scrapy-如何从类别中提取所有博客文章?

如何更新博客文章上的所有标签?

如何显示特定类别而不是所有文章的文章

循环博客文章,按SilverStripe上的类别过滤

使用 onChange 从 <select> 标签更新状态并过滤类别列表以显示来自该类别的博客文章

Joomla 3-在单个文章下面显示类别博客

如何在wordpress博客的单个页面中显示所有帖子的特色图片

显示Wordpress博客文章类别

如何显示所有子类别的文章?

如何从WordPress博客文章页面中排除类别

按类别中的标签过滤文章-Joomla和K2

如何使用标签和过滤器从index.html到所有html页面显示页脚?

Blogdown类别页面显示所有帖子,无论类别如何

如何在 Sitefinity v9.1 中过滤所有未发布的博客文章?

如何在特定的管理页面上显示magento的所有已创建类别?

Django:如何过滤和显示页面上类别中的帖子

使用 Gatsby Contentful 显示所有博客文章

使用 Silverstripe 博客模块时,如何仅显示已分配类别的博客文章?

Silverstripe:按作者过滤博客文章

在WordPress的当前类别页面上显示所有子类别和父类别

我想在Wordpress中显示类别名称和所有相关文章

OctoberCMS - Rainlabs 博客插件 - foreach 类别显示博客文章

如何为网站的所有页面使用单个标题标签

显示用户设计创建的所有文章

如何设置 DNNArticle 选项卡以按类别显示文章

在Wordpress的单个页面上显示某个类别的所有帖子

如何在盖茨比博客网站中有效显示GIF图像?

如何根据当前用户是否是博客文章的所有者来限制模板中显示的编辑链接?

WikiMedia API:如何按类别和位置获取文章列表?