社区新闻

同步模式中覆盖的介绍

发布于

WordPress不断进化,推出新功能,丰富了平台对用户和开发者的能力。WordPress 6.6 新增的覆盖功能是同步模式,允许用户在不改变图案底层布局或设计的情况下,进行内容特定的更改。该功能可用于创建精心策划的编辑体验、改进工作流程、强制设计一致性等。

本文将探讨同步模式中的覆盖是什么、它们的工作原理,以及该功能路线图上可能的改进。

那么,什么是覆盖?

请看下面的图片。编辑器展示了相对简单的卡片设计,但特别注意右侧的方块工具栏和检查器。

编辑器视图展示了同步的卡片模式和覆盖。

每张卡牌都包含相同的方块组合,但内容不同。用户只能修改(或覆盖)图案中特定方块的内容,或将其重置为原始方块。禁止访问屏蔽设置和样式。

虽然从图片上看不明显,但张卡的动力是相同的同步(或同步)模式。模式中每个可编辑内容都是覆盖。

在大层面上,模式覆盖必须满足以下要求:

  1. 图案设计必须同步。
  2. 用户必须能够编辑单个图案实例的内容,而不改变整个图案的布局或设计。
  3. 用户对内容的修改必须与同步模式“连接”。

在讨论如何在同步模式中创建覆盖之前,让我们快速回顾一下什么是同步模式,并探讨支持后两项要求的关键功能:仅内容编辑和块绑定API。

急着开始创建覆盖?跳到前面

同步模式

同步模式是WordPress已有一段时间的功能,最初被称为可重复使用块,直到WordPress 6.3。你在编辑器中通过分组块并配置它们的设置和样式来创建这些图案。设计可以保存到数据库中,且每当你进行额外修改时,所有模式实例都会保持同步。

这种模式有助于保持网站设计和内容的一致性。例如,如果你在多个页面上有号召行动(CTA),更新包含该CTA的同步图案,会在每个使用该页面发生变化。

虽然同步图案有许多应用,但也有很多情况下你可能希望修改图案的布局和设计,而内容可以由用户自行编辑。

看上面视频中的卡片示例,你可能希望用户能够编辑标题、段落和按钮块的内容。

但在那之前,我们先解决第二个要求——使用仅内容编辑来覆盖模式。

内容编辑

内容编辑于 WordPress 6.1 中引入,采用一种称为“contentOnly”的锁定机制,确保只有块或图案内嵌套的文本和媒体可以编辑,保持整体布局和设计结构不变。

该功能由列、覆盖和组等块支持,可以隐藏列表视图中无文本或媒体内容的块类型,并禁用设置和样式的检查控制。这简化了编辑过程,保持了设计的一致性。

要启用块内仅内容编辑,将属性设置为 。编辑器中没有用户界面,因此你必须手动将属性添加到块标记中。虽然这通常在模式和模板文件中完成,但你可以通过切换到代码编辑器视图并添加到任意容器块来测试。试试这个WordPress Playground演示。在演示内容中将该属性应用于堆栈块,应当得到以下结果。templateLockcontentOnly"templateLock": "contentOnly"

编辑器视图,展示了卡片布局的初始块设计。
编辑器视图显示内容编辑后卡片布局。

注意区块检查器里的所有设置都消失了。用户现在只能编辑堆栈中标题、段落和按钮块的内容。

第二个要求:确认。

你可能会好奇,为什么覆盖功能直到 WordPress 6.6 版本才被引入,尽管同步模式和内容编辑已经存在多年。

缺失的部分是能够“连接”用户修改与同步图案的能力。块绑定API现在实现了这一点。

块绑定API

WordPress 6.6引入的块绑定API使开发者能够将块属性连接到各种数据源,如自定义字段(帖子元数据)、网站数据、用户数据等。

该 API 对于实现模式覆盖至关重要,因为它将用户的修改与相应的同步模式连接起来。你不需要知道如何使用块绑定API来实现覆盖,但它有助于说明它们为何与该API及当前限制紧密相连。

让我们来看一个简单的例子,说明这种做法在实际中是如何运作的。

编辑器视图,展示了卡片布局的初始块设计。

再用卡片设计,假设你想把自定义字段连接到标题、段落和按钮块。这些信息不会作为区块内容存储,而是作为帖子元数据存储,并显示在每个区块中。

首先,为每个应连接到帖子元数据的块属性注册自定义字段。在下面的代码中,自定义字段、、 和 注册用于使用card_headercard_descriptioncard_button_textcard_button_urlregister_meta()函数,每个函数都默认值。

function theme_slug_register_meta() {
	register_meta(
		'post',
		'card_heading',
		array(
			'show_in_rest'      => true,
			'single'            => true,
			'type'              => 'string',
			'sanitize_callback' => 'wp_strip_all_tags',
			'default'           => __( 'Card heading', 'theme-slug' )
		)
	);

	register_meta(
		'post',
		'card_description',
		array(
			'show_in_rest'      => true,
			'single'            => true,
			'type'              => 'string',
			'sanitize_callback' => 'wp_strip_all_tags',
			'default'           => __( 'Card description. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.', 'theme-slug' )
		)
	);

	register_meta(
		'post',
		'card_button_text',
		array(
			'show_in_rest'      => true,
			'single'            => true,
			'type'              => 'string',
			'sanitize_callback' => 'wp_strip_all_tags',
			'default'           => __( 'Learn more', 'theme-slug' )
		)
	);

	register_meta(
		'post',
		'card_button_url',
		array(
			'show_in_rest'      => true,
			'single'            => true,
			'type'              => 'string',
			'sanitize_callback' => 'esc_url_raw',
			'default'           => 'https://wordpress.org'
		)
	);
}
add_action( 'init', 'theme_slug_register_meta' );

该代码注册自定义字段,并将其置于REST API中,允许它们绑定到相应的块属性。在处理块绑定时,参数必须设置为 。show_in_resttrue

接下来,利用属性将自定义元数据连接到块。例如,Heading块的属性可以是这样的:metadata

"metadata": {
    "bindings": {
        "content": {
            "source": "core/post-meta",
            "args": {
                "key": "card_heading"
            }
        }
    }
}

以下是房产的简要概述:

  • metadata:包含关于该块元数据的对象。
  • metadata:包含一个或多个方块绑定的对象。
  • content: block 属性绑定到自定义字段,具体字段因区块而异。
  • source:绑定的来源。对于自定义字段,源代码为 。core/post-meta
  • args:包含传递给绑定源的参数的对象。对于自定义字段,将属性设置为注册元键的名称。key

目前,编辑器没有用于对方块施加绑定的用户界面。这些属性必须手动添加到块标记中。切换到代码编辑器视图,并将该属性添加到标题块中。完整的标记应该是这样的:

<!-- wp:heading {"metadata":{"bindings":{"content":{"source":"core/post-meta","args":{"key":"card_heading"}}}}} -->
<h2 class="wp-block-heading">Card heading</h2>
<!-- /wp:heading -->

注意,绑定目标是 ,这是航向块的属性。在对段落和按钮块重复此过程时,相应地更新属性。contentcontent

以下是截至 WordPress 6.6 Block Bindings API 目前支持的块和属性:

支持的块支持属性
图片url, ,alttitle
标题content
段落content
按钮url,, ,textlinkTargetrel

由于模式覆盖本质上是块绑定,支持覆盖的块和支持绑定的块是相同的。随着更多块与块绑定API兼容,它们很可能会变得可覆盖。

下面的截图展示了卡片设计,每个方块都绑定在注册的自定义字段上。虽然由于默认内容,界面看起来基本相同,但请注意块检查器中新值和绑定面板。card_heading

编辑器视图,展示了带有块绑定的按钮块。

想了解更多关于块绑定 API 的信息,请查看这些文章以及开发者博客上的更多内容。

这些资源将帮助你扎实地理解如何在WordPress项目中实现和利用Block Bindings API。

把一切整合起来

既然我们已经涵盖了同步图案、仅内容编辑和块绑定,现在是时候创建几个模式覆盖了。

再说一次,我们来看卡片设计。

编辑器视图,展示了卡片布局的初始块设计。

你可以通过这个WordPress Playground演示,跟随下一步操作。

在这个例子中,用户应该能够修改头部、描述和按钮。其他所有内容都应该固定,并且在每个模式实例间保持同步。

第一步是将设计变成同步图案。选择外层堆栈块,然后在方块工具栏的选项菜单中选择创建图案

在出现的模态中,给模式命名并确保选择了同步开关。

编辑器视图,展示了如何创建同步图案。

方块工具栏现在会有一个紫色图标,方块的边框将由蓝色改为紫色。这种颜色变化表明内容已经同步。请注意,你现在不能直接编辑方块的内容了。

从块子工具栏选择“编辑原始”,以编辑你新同步图案的内容。这样做后,图案会在专用界面中打开。

编辑器视图展示了同步的卡片图案。

下一步是给标题、段落和按钮块添加覆盖。由于这三个块都支持块绑定,它们也支持覆盖。

首先选择标题块,并在块检测器中打开高级面板。你会看到一个按钮,上面写着“启用覆盖”

编辑器视图,展示了“启用覆盖”按钮在块检查器中的位置。

点击启用覆盖,会打开一个模态。

模态会提示你输入覆盖的唯一名称。这一要求使 WordPress 能够将用户创建的内容映射到图案中的正确区块。

随你喜欢的名字。下面的图片用“卡片标题”来简化了概念。

编辑器视图,展示了如何提供一个可覆盖且名称唯一的模块。

对段落和按钮块重复这个过程。你的图案现在应该和下面展示的类似。请注意列表视图中的命名块和模式检查器右侧定义的覆盖。

在独立模式编辑器中同步的卡片图案,且所有覆盖都已启用。

继续之前,切换到代码编辑器视图,检查区块标记。你会看到每个块的绑定源,覆盖设置为 。这就是块绑定API的实际应用。core/pattern-overrides

这里有一个段落块应该是什么样子的示例。

<!-- wp:paragraph {"metadata":{"bindings":{"__default":{"source":"core/pattern-overrides"}},"name":"Card Description"},"fontSize":"small"} -->
<p class="has-small-font-size">Card description. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
<!-- /wp:paragraph -->

保存图纸,然后返回包含卡片图样的帖子。你会在“列”块的第一列看到它。将相同的模式插入第二列,并修改标题,看看覆盖效果如何。编辑体验应与本文中仅内容编辑示例相同。

同步的卡牌模式,带有覆盖功能。

接下来,修改同步模式,看看它如何更新每个实例,同时保留内容变化。试着加一些覆盖,比如卡片顶部的图片。玩得开心点,享受这个功能吧!

到现在为止,你应该已经开始看到模式覆盖的力量了。只需几次点击,你就能打造高度策划的编辑体验,同时完全掌控每个图案的设计美学。而这仅仅是个开始。

下一步

同步模式的覆盖功能将很快随着 WordPress 6.6 的发布而推出。不过,会有一些限制,包括:

  • 支持的块和属性数量有限,目前没有自定义块的选择加入机制。
  • 同步图案只存储在数据库中,不能打包成主题中的图案文件。

未来的版本将支持更多核心模块和属性。查看关于自定义块选择加入机制的持续讨论。你可以在GitHub上的官方追踪问题中关注进展。

在主题文件中启用同步模式则稍微复杂一些。本有早期探索内容可供回顾。截至本文发布之日,贡献者们已开始起草将包含在 WordPress 6.7 中的目标。分享你对这个问题的看法。

尽管有这些限制,你仍然可以完成相当多的事情。你应该开始探索 WordPress 6.6 中的模式覆盖,因为它们将从根本上改变许多网站所有者管理 WordPress 内容的方式。