使用\ register_meta()

时间:2018-03-28 11:46:22

标签: php wordpress wordpress-rest-api

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 挂钩中,但它没有在回应中对元的影响。

1 个答案:

答案 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是一种帖子