限制 gatsby-plugin-feed 中的项目数量

Limiting number of items in gatsby-plugin-feed

internals for gatsby-plugin-feed 似乎表明我们可以对显示在提要中的帖子数量设置限制:

{
  // Create a default RSS feed. Others may be added by using the format below.
  feeds: [
    {
      query: `
      {
        allMarkdownRemark(
          limit: 1000,
          sort: {
            order: DESC,
            fields: [frontmatter___date]
          }
        ) {
          edges {
            node {
              frontmatter {
                title
                date
              }
              fields {
                slug
              }
              excerpt
              html
            }
          }
        }
      }
    `,
    ...
  ]
}

当我在gatsby-config.js中尝试将我自己的定义中的limit更改为10时,似乎没有任何效果。有没有一种标准方法可以限制 RSS 提要中的项目数量,这样我就不会在其中发表超过 250 篇文章?

我在我的个人项目中使用 gatsby-plugin-feed。我尝试按照您在问题中建议的那样在 GraphQL 查询中使用 limit 并且它适用于我的情况。

我的猜测是您项目中的某些其他插件或代码干扰了 xml 生成。调试您的问题的唯一方法可能是创建一个准系统项目并首先尝试限制您的项目。我记得我错误地列出了 gatsby-plugin-feed 两次,因此删除了第一个列表中的说明。

这是我的代码。或许对你有帮助:

// gatsby-config.js

{
  resolve: `gatsby-plugin-feed`,
  options: {
    query: `
      {
        site {
          siteMetadata {
            title
            description
            siteUrl
            site_url: siteUrl
          }
        }
      }
    `,
    feeds: [
      {
        serialize: ({ query: { site, allMarkdownRemark } }) => {
          return allMarkdownRemark.edges.map(edge => {
            return Object.assign({}, edge.node.frontmatter, {
              description: edge.node.excerpt,
              url: site.siteMetadata.siteUrl + "/blog" + edge.node.fields.slug,
              guid: site.siteMetadata.siteUrl + "/blog" + edge.node.fields.slug,
              categories: ["Startup"],
              custom_elements: [
                { "content:encoded": edge.node.html },
                { "author": edge.node.frontmatter.author },
                { "language": "en" },
              ],
            });
          });
        },
        query: `
          {
            allMarkdownRemark(
              sort: { order: DESC, fields: [frontmatter___date] },
              filter: {fileAbsolutePath: {regex: "content/blog/"}},
              limit: 2
            ) {
              edges {
                node {
                  excerpt
                  html
                  fields { slug }
                  frontmatter {
                    title
                    date
                    author
                  }
                }
              }
            }
          }
        `,
        output: "/rss.xml",
        title: "Blog",
        match: "^/blog/",
      },
    ],
  },
},

@AlbertSkibinski 的 documentation link 在他的评论中帮助我意识到 RSS 提要仅在 gatsby build 上生成。我正在进行更改并尝试 运行 gatsby develop,这对我在 public 文件夹中检查的输出没有影响。

我不太喜欢覆盖不需要覆盖的默认值,所以我通过从 gatsby-plugin-feed/internals:

导入默认值来拼凑我自己的配置代码
const gatsbyFeedOpts = require('gatsby-plugin-feed/internals')

// Copy and replace limit in default options
let feedOpts = gatsbyFeedOpts.defaultOptions
feedOpts.feeds[0].query = feedOpts.feeds[0].query.replace(
  'limit: 1000',
  'limit: 10'
)

module.exports = {
  siteMetadata: {
    // Excluded for brevity
  },
  plugins: [
    // Other plugins excluded for brevity
    {
      resolve: `gatsby-plugin-feed`,
      options: feedOpts,
    },
  ],
}

有趣的是,尽管文档说我们需要在 Feed 配置中实施 serialize 方法,但它并未包含在我在这里使用的导入默认值中。这可能会导致 gatsby-plugin-feed 的未来版本出现问题,但它适用于我当前使用的版本 (2.4.1)。