下面是问题1的答案,使用register_post_meta
. 这也是通过使用prepare_callback
中的选项show_in_rest
.
add_action( \'init\', \'wpse_89033_register_custom_meta\' );
function wpse_89033_register_custom_meta() {
$post_types = [
\'post\',
\'page\',
\'attachment\',
];
foreach ( $post_types as $post_type ) {
register_post_meta(
$post_type,
\'_custom_key\',
array(
\'type\' => \'string\',
\'single\' => true,
\'auth_callback\' => function() {
return current_user_can( \'edit_posts\' );
},
\'show_in_rest\' => [
\'prepare_callback\' => function( $value ) {
return wp_json_encode( $value );
}
],
)
);
}
}
的文档
show_in_rest
(参见
register_meta
) 表示这是一个布尔参数。但它将接受选项数组。要查看选项,请查看
get_registered_fields
, 尤其是
$default_args
. 这个
prepare_callback
覆盖
prepare_value
, 中的方法
WP_REST_Meta_Fields
将自定义元值从数组转换为字符串。通过回调,该数组将被编码为JSON。
在JavaScript方面,下面是一些关键声明。
// Get the custom meta
let customMeta = wp.data.select(\'core/editor\').getEditedPostAttribute(\'meta\');
// Parse the meta so you can do some JS with it
let parsed = JSON.parse(customMeta._custom_key);
// Do some JS with the parsed meta...
// Stringify the parsed meta before dispatching it
let stringified = JSON.stringify(parsed);
/*
* Dispatch (update) the meta (and don\'t forget to
* save/publish/update the post to ensure the meta goes in the database)
*/
wp.data.dispatch(\'core/editor\').editPost({meta: {_custom_key: stringified}});
回到PHP领域,获取和更新您的自定义元现在将以不同的方式工作。当你打电话的时候
get_post_meta
, 您已经习惯了使用数组,有时可能仍然需要一个数组。但是,如果您上次通过WP-restapi更新了您的自定义元,那么您将得到一个JSON字符串。在这种情况下,您必须使用
json_decode
. 一种方法是将调用包装到
get_post_meta
像这样:
function wpse_89033_get_custom_meta( $post_id, $meta_key ) {
$post_meta = get_post_meta( $post_id, $meta_key, true );
// If $post_meta is a string that\'s not empty
if ( $post_meta && is_string( $post_meta ) ) {
/*
* Use the decoded JSON string or else the original string
* if decoding fails, e.g., if the string isn\'t JSON
*/
$post_meta = json_decode( $post_meta, true ) ?: $post_meta;
}
return $post_meta;
}
如果您将自定义元更改为数组,则在调用之前不要担心重新编码
update_post_meta
. 这个
prepare_callback
将处理重新编码。
关于在PHP中更新,调用update_post_meta
在期间save_post
, 如中所示official plugin handbook, 似乎覆盖通过WP REST API进行的更新。所以还有一件事需要考虑save_post
更新自定义meta,了解文章是否正在古腾堡编辑。如果是,则将更新留给REST API。