WordPress Codex建议two ways在响应中添加post meta。我试图用register_meta()实现这一点,因为它似乎对我来说是正确的方法。
问题:
当我使用register_meta()时,响应中的meta 字段仍为空,尽管 show_in_rest 设置为true。
解:
感谢Allan Fuller指出, $ object_type 参数( register_meta()函数中的第一个参数 post < / em>而不是帖子类型。comments section of the new code reference
中也提到了这一点解决方案前的说明
我这是怎么做到的:
第1步: 来自functions.php的调用:
\add_action('init', [$this, 'init'], 10);
第2步: 在init函数中注册自定义帖子类型:
\register_post_type(
CompanyPostType::POST_TYPE_NAME,
[
'labels' => [
'name' => __('Companies'),
'singular_name' => __('Company')
],
'public' => true,
'show_in_rest' => true,
'rest_base' => CompanyPostType::REST_BASE,
'has_archive' => false,
'rewrite' => false,
'supports' => [
'custom-fields',
'revisions'
]
]
);
第3步 - 利润:
在init函数中为自定义帖子类型注册meta
$meta = [
'key' => CompanyPostType::META_NAME,
'description' => 'Name of the company',
'type' => 'string'
],
\register_meta(CompanyPostType::POST_TYPE_NAME, $meta['key'],
[
'show_in_rest' => true,
'single' => true,
'type' => $meta['type'],
'description' => $meta['description'],
]
);
meta字段在响应中仍然为空。但是,如果我在同一个init钩子中使用codex(register_rest_field())中建议的第二种方式:
\add_action( 'rest_api_init', function () {
\register_rest_field( CompanyPostType::POST_TYPE_NAME, CompanyPostType::META_NAME, array(
'get_callback' => function($params ) {
$meta = \get_post_meta( $params['id'], CompanyPostType::META_NAME, true);
return (string) $meta;
},
) );
} );
然后带有其值的字段出现在响应中。我错过了什么?
由于我使用的是自定义帖子类型,因此也可能值得查看这部分代码。如编码中所述,在注册时我设置'supports'=&gt; ['custom-fields']以便自定义字段显示在其余响应中。整体看起来像这样:
return \register_post_type(
self::POST_TYPE_NAME,
[
'labels' => [
'name' => __('Companies'),
'singular_name' => __('Company')
],
'public' => true,
'show_in_rest' => true,
'rest_base' => self::REST_BASE,
'has_archive' => false,
'rewrite' => false,
'supports' => [
'title',
'custom-fields',
'revisions'
]
]
);
修改
我按照Allan Fuller blog post的建议尝试将 \ register_meta()放在 rest_api_init 挂钩中,但它没有在回应中对元的影响。
答案 0 :(得分:0)
如果您想使用register_meta
工作,则必须明确地将其挂钩到rest_api_init
所以对于你的例子
add_action( 'rest_api_init', 'register_posts_meta_field' );
function register_posts_meta_field() {
register_meta('post', $meta['key'],
[
'show_in_rest' => true,
'single' => true,
'type' => $meta['type'],
'description' => $meta['description'],
]
);
}
以上内容尚未经过测试,但请参阅http://badlywired.com/2018/01/getting-post-meta-via-wordpress-rest-api/
的代码工作插件版本对象类型需要“发布”到自定义帖子类型名称
请参阅https://codex.wordpress.org/Function_Reference/register_meta
第一个参数是object_type - 有效的对象类型是由wordpress预定义的,CPT是一种帖子