内容丰富:如何仅使用其中一个字段来获取条目?或者,如何在网络应用程序中设置 entryId?

Contentful: How to get an entry using nothing but one of its fields? Or, how to set the entryId in web app?

我需要创建一些可共享的博客 post URLs。为此,URL 必须类似于网页。com/blog-post-title。不能是网页。com/5GFd5GDSg2345WD.

由于我使用的是动态路由,因此我需要只使用 URL 上的内容来获取一个 Contentful 条目。不应该有任何查询,因为查询很难看并且会降低共享性,例如网页。com/blog-post-title?query=queriesAreUgly.

不幸的是,我需要 entryId 来获取条目。同样不幸的是,entryIds 都非常难看,因此完全 useless/unusable。我希望我可以设置自己的 entryId,但由于神秘原因这似乎不可能。

我可以查找 table 将 URLs 与 entryId 配对,但我将把这个内容丰富的项目交给不懂技术的人,他们不应该有管理查找 table.

我可以获取所有博客条目,然后按博客标题进行过滤,但是,很明显,这是低效的,因为我会无缘无故地加载数千行文本。

我可以创建自己的后端 API 并自己完成所有这些,但这也是一个糟糕的解决方案,因为它会花费太多时间而且我无法将它交给我的 non-tech-savvy 客户.

这个由 Contentful 固有的不必要的僵化造成的问题似乎没有解决方案。

使它起作用的唯一有效方法是不是通过其 ID 而是通过其字段之一来查找条目。有没有 performant/efficient 方法来做到这一点,还是我必须过滤每个博客 post 直到找到标题正确的博客?

如何向博客 post 内容类型添加 'slug' 字段,您可以使用字段设置从标题 auto-generate 中添加一个 'slug' 字段(这样您就不必输入手动输出?)

然后您可以在查询中筛选 slug 字段。

如果您正在使用 JavaScript SDK(听起来您就是这样),您可以使用 getEntries() 并按 slug 字段进行过滤以获取单个博客 post .像这样:

import { createClient } from "contentful";

const client = createClient({
  space: {SPACE_ID},
  accessToken: {ACCESS_TOKEN},
});

const response = await client
  .getEntries({
    content_type: "blogPost",
    limit: 1,
    "fields.slug": "blog-post-title",
  })
  .then((entry) => entry)
  .catch(console.error);