WordPress 5.3在REST API中支持object和array元数据类型

虎皮椒-个人微信和支付宝支付接口


从WordPress 5.3开始,register_meta函数(包括register_post_meta)将支持\'object\'对象和\'array\'数组元数据类型。以前,要创建复杂的基于元数据的Gutenberg区块,需要对块的复杂属性值进行JSON编码,然后将该字符串传递给API。 现在 REST API 将原生支持那些复杂的元数据类型。这允许利用REST API来执行基于架构的验证,并且还简化通过REST API与这些复杂值交互的客户端代码。


重要的是,这些数据类型遵循JSON规范,而不是PHP定义。为了进行比较,这意味着JSON object类型等效于PHP中的关联数组。JSON array类型是一个数字索引数组。


注册复杂的元数据字段时,几乎总是需要同时指定一个描述预期结构的JSON模式。这可以通过show_in_rest从简单true值切换到arrayschema数组键下指定所需架构的来完成。

Object 示例


以下代码示例注册了一个名为“ release”的文章元字段,该字段接受给定的JSON数据。


{
\"meta\": {
\"release\": {
\"version\": \"5.2\",
\"artist\": \"Jaco\"
}
}
}

register_post_meta(
\'post\',
\'release\',
array(
\'single\' => true,
\'type\' => \'object\',
\'show_in_rest\' => array(
\'schema\' => array(
\'type\' => \'object\',
\'properties\' => array(
\'version\' => array(
\'type\' => \'string\',
),
\'artist\' => array(
\'type\' => \'string\',
),
),
),
),
)
);

默认情况下,仅允许在架构中明确指定的属性。该additionalProperties关键字可以用来改变这种行为。additionalProperties应该是用于验证所有未知对象成员的另一个JSON模式。例如,要强制所有其他属性均为数字,可以使用以下代码。


{
\"meta\": {
\"release\": {
\"version\": \"5.2\",
\"artist\": \"Jaco\",
\"unknown_field\": 5.3
}
}
}

register_post_meta(
\'post\',
\'version\',
array(
\'single\' => true,
\'type\' => \'object\',
\'show_in_rest\' => array(
\'schema\' => array(
\'type\' => \'object\',
\'properties\' => array(
\'version\' => array(
\'type\' => \'string\',
),
\'artist\' => array(
\'type\' => \'string\',
),
),
\'additionalProperties\' => array(
\'type\' => \'number\',
),
),
),
)
);

另外, 可以将 additionalProperties设置为true允许任何格式的未知属性,但是不建议这样做。

Array 示例


以下代码示例注册了一个名为“ projects”的文章元字段,该字段包含一个接受给定JSON数据的项目名称列表。


{
\"meta\": {
\"projects\": [
\"WordPress\",
\"BuddyPress\"
]
}
}

register_post_meta(
\'post\',
\'projects\',
array(
\'single\' => true,
\'type\' => \'array\',
\'show_in_rest\' => array(
\'schema\' => array(
\'type\' => \'array\',
\'items\' => array(
\'type\' => \'string\',
),
),
),
)
);

“ items”关键字用于定义JSON模式,以验证每个数组成员所针对的JSON模式。它可以是“string”之类的简单类型,也可以是“object”之类的复杂类型。


例如,要接受给定的JSON数据,将使用以下元数据注册。


{
\"meta\": {
\"projects\": [
{
\"name\": \"WordPress\",
\"website\": \"https://wordpress.org\"
},
{
\"name\": \"BuddyPress\",
\"website\": \"https://buddypress.org\"
}
]
}
}

register_post_meta(
\'post\',
\'projects\',
array(
\'single\' => true,
\'type\' => \'array\',
\'show_in_rest\' => array(
\'schema\' => array(
\'items\' => array(
\'type\' => \'object\',
\'properties\' => array(
\'name\' => array(
\'type\' => \'string\',
),
\'website\' => array(
\'type\' => \'string\',
\'format\' => \'uri\',
),
),
),
),
),
)
);

非单个元数据


非单个( Non-single )元字段每个文章具有一组值,而不是每个文章具有一个值。这些值中的每一个都存储在postmeta表中的单独行中。


arrayobject数据类型也可以用在非单个元数据字段。例如,如果先前的“ release”元键single设置为false,则可接受以下JSON数据。


{
\"meta\": {
\"release\": [
{
\"version\": \"5.2\",
\"artist\": \"Jaco\"
},
{
\"version\": \"5.1\",
\"artist\": \"Betty\"
}
]
}
}

这将添加两个postmeta数据库行。第一个包含{ \"version\": \"5.2\", \"artist\": \"Jaco\" },第二个包含{ \"version\": \"5.1\", \"artist\": \"Betty\" }


同样, 如果将single设置为false ,下面的数据将被“projects”示例所接受。


{
\"meta\": {
\"projects\": [
[
\"WordPress\",
\"BuddyPress\"
],
[
\"bbPress\"
]
]
}
}

这将添加两个postmeta数据库行。第一个包含[ \"WordPress\", \"BuddyPress\" ],第二个包含[ \"bbPress\" ]

无效的存储值


如果元字段的现有值未针对注册的类型和架构进行验证,则该元字段的值将返回 null 。这是5.3中的更改,以前仅验证了元类型。


测试
喔喔竹 » WordPress 5.3在REST API中支持object和array元数据类型

提供最优质的资源集合

立即查看 了解详情
©2019|喔喔竹www.oozhu.com|粤ICP56421396号