跳到主要内容

Functional Specification

Yoast SEO 的 "Indexables" 框架提供了一个抽象层,用于处理与 SEO 相关的文章元数据。

以页面为中心的网页模型

我们软件的大部分功能是存储、管理和评估与 页面 相关的信息。每个页面都有一个唯一的(规范URL

这是大多数搜索引擎和系统对网页的'思考'方式。它们基于 URL 为所有已知页面构建一张 地图。我们也采用同样的方法。有了这张地图,我们就能轻松检查、更新和管理特定页面的信息。

表面上看,这似乎是一个简单的概念。但像'页面'这样的词隐藏着复杂性和细微差别——尤其是在 WordPress 的语境中。

例如,在 WordPress 中,存储在数据库中的文章 并不附带 URL。每次系统需要知道页面 URL 时,都必须进行 计算(基于用户为网站定义的 URL 结构设置)。这在计算上是昂贵的。

但处理开销并非唯一的挑战——还存在一些场景,其中'页面'的含义并不明确。

但什么是页面?

除了我们通常理解的网站"页面"概念,我们可能还会遇到 归档 视图(例如某作者发布的所有文章)、替代内容 格式(例如 RSS 源)、分类法(例如标签和分类)、错误模板(例如 404 页面)、分页 结果以及其他特殊类型的内容。在搜索引擎看来,这些都属于"页面"。

从 SEO 的角度来看,每种情况都需要不同的处理方式——各自有其规则和条件。即使是一篇简单的博客文章,也可能有 数十个 需要我们考量和评估的数值。这些包括爬取和索引控制、内容评估分数、关键词、展示设置、媒体资源等等。在确定页面上应输出哪些 SEO 元数据的过程中,我们必须考虑所有这些字段及其相互关系。

例如,仅确定页面的合适 规范 URL 就需要大量的查询和评估。

对于大型网站,所有这些逻辑、存储和处理都可能影响性能——尤其是在 WordPress 中,其数据库结构并非为此类需求设计或优化。

此外,网站包含许多我们 希望进行 SEO 评估的"页面"。某些内容类型可能存在于系统中(例如仅用于管理视图),但从未在公开 URL 上暴露。存储和处理这些信息没有意义,因为它们无法被搜索引擎 索引

明确哪些内容 可索引、哪些 不可索引,是实现高效元数据管理的关键。

什么是可索引项?

可索引项 是指任何能够(理论上)被搜索引擎根据给定 URL 索引 的资源。这包括许多超出“页面”范畴的内容类型——例如分类目录、作者归档、日期归档的分页状态、媒体文件等。

示例:

注意:我们有意_排除_任何非公开页面以及返回错误的页面。

WordPress 中的 Yoast SEO 索引表

Yoast SEO 通过专用数据库表在 WordPress 中创建并管理索引表。该表存储了从 SEO 角度所需的所有信息,涵盖我们已知的每个可索引对象。这意味着当我们需要查询特定页面以确定 SEO 元数据时,可以极其高效地完成此操作。

此过程在后台静默运行,并与 WordPress 原生元数据字段及流程无缝同步。

该表还会自动填充和更新自身。当我们遇到未知的可索引对象时,会创建新记录,以便后续请求可使用该数据。我们还在管理工具中提供了(重新)索引流程,可主动根据网站数据库构建索引表。

通过建立索引表,我们获得了以“SEO 为中心”的网站视图,重点关注页面(及其应输出的元数据)。

索引机制

我们的索引表通过两种方式构建和维护:

  • Yoast SEO 界面中的各类优化流程会提示用户执行"索引"操作,这是使用多种工具和控制功能的前提条件。
  • 对先前未发现的索引项的请求将触发延迟生成流程。

这些流程确保索引表始终完整且准确地反映网站状态。

Yoast SEO 存储哪些类型的可索引对象?

我们存储的可索引对象类型包括:

  • 所有公开*的文章和分类法
  • 网站首页
  • 作者归档页(针对已发布公开文章的作者)

我们还存储了几种“模式”,这些模式代表 模板 和内容类型,为每个可能的排列创建独立可索引对象既无价值也无必要。这些模式包括:

  • 文章类型、分类法和日期归档页
  • 错误页面
  • 内部搜索结果页面

*当文章/分类法类型的 public 属性在 register_post_type/register_taxonomy 中设置为 true 时,我们即认为该页面是“公开”的。

使用场景

当我们全面掌握网站所有公开页面后,即可利用数据库驱动功能与工具。例如:

  • 获取页面 <head> 元数据时,可通过单次数据库请求获取所有相关预计算字段
  • 构建 XML 站点地图时,可即时判定应包含或排除哪些可索引项
  • 其他软件系统能轻松集成、修改并扩展我们的逻辑体系

修改索引对象行为

大多数用户无需直接与索引对象表或逻辑交互。但高级用户可能希望自定义行为以满足特定需求。 为此,我们提供了一系列过滤器来修改默认行为或与数据表交互: