实体和撤消/重做。

WordPress编辑器,无论是Post还是Site Editor,都可以操作我们所称的实体记录。这些是表示帖子、页面、用户、术语、模板等的对象。它们是存储在数据库中并由编辑器操作的数据。每个编辑器可以同时获取、编辑和保存多个实体记录。

例如,在站点编辑器中打开页面时:

  • 您可以编辑页面本身的属性(标题、内容等)
  • 您可以编辑页面模板的属性(模板内容、设计等)
  • 您可以编辑与模板一起使用的模板部件(页眉、页脚)的属性。

编辑器跟踪所有这些修改,并协调保存所有这些修改的记录。这发生在@文字新闻/核心数据包裹。

编辑实体

为了能够编辑实体,您需要首先获取它并将其加载到核心数据商店。例如,以下代码将ID为1的帖子加载到商店中。(实体是帖子,帖子1是实体记录)。

wp.data.select('core').getEntityRecord('postType','post',1);

实体加载后,您可以对其进行编辑。例如,以下代码将帖子的标题设置为“Hello World”。对于每个提取的实体记录岩心数据商店跟踪以下信息:

  • “持久化”记录:从后端提取记录时的最后一个状态。
  • “编辑”列表:记录的一个或多个属性的未保存本地修改。

该包还公开了一组操作来操作获取的实体记录。

要编辑实体记录,可以调用编辑实体记录,它将实体类型、实体ID和新实体记录作为参数。以下示例将ID为1的帖子的标题设置为“Hello World”。

wp.data.dispatch(“core”).editEntityRecord(“postType”,“post”,1,{title:“Hello World”});

编辑完实体记录后,可以保存它。下面的代码保存ID为1的帖子。

wp.data.dispatch('core').saveEditedEntityRecord('postType','post',1);

取消/重做

由于WordPress编辑器允许同时编辑多个实体记录核心数据包跟踪在通用撤消/重做堆栈中获取和编辑的所有实体记录。撤消/重做堆栈中的每个步骤都包含一个“编辑”列表,在调用解开重做行动。

为了能够正确执行撤消和重做操作,编辑列表中的每个修改都包含以下信息:

  • 实体种类和名称:核心数据中的每个实体都由对标识(种类、名称)。这对应于修改实体的标识符。
  • 实体记录ID:修改的记录的ID。
  • 属性:修改的属性的名称。
  • 发件人:属性的上一个值(需要应用撤消操作)。
  • 收件人:属性的新值(应用重做操作所需)。

例如,假设用户编辑一篇文章的标题,然后修改文章的slug,然后修改与文章一起使用的可重用块的标题。以下信息存储在撤消/重做堆栈中:

  • [{kind:“postType”,名称:“post”,id:1,属性:“title”,发件人:“”,收件人:“Hello World”}]
  • [{kind:“postType”,name:“post”,id:1,property:“slug”,from:“Previous slug“,to:“This is the slug of the hello world post”}]
  • [{kind:“postType”,名称:“wp_block”,id:2,属性:“title”,从:“Reusable block”,到:“Awesome Reusable block”}]

存储还跟踪当前“撤消/重做”步骤的“指针”。默认情况下,指针始终指向堆栈中的最后一项。当用户执行撤消或重做操作时,将更新此指针。

缓存的更改

撤销/重做核心行为还支持我们所称的“缓存修改”。这些修改不会立即存储在撤消/重做堆栈中。例如,当用户开始在文本字段中键入内容时,该字段的值会在存储中进行修改,但直到用户移动到下一个单词或几毫秒后,此修改才会存储在撤消/重做堆栈中。这样做是为了避免为用户键入的每个字符创建新的撤消/重做步骤。

缓存的更改被保存在undo/redo堆栈之外的修改“缓存”中,这些修改仅在我们显式调用undo/redo堆栈时存储在其中__unstableCreateUndoLevel或者下一次修改不是缓存的修改。

默认情况下,所有调用编辑实体记录被视为“非缓存”,除非已缓存选项传递为true。例子:

wp.data.dispatch(“core”).editEntityRecord(“postType”,“post”,1,{title:“Hello World”},{isCached:true});