繁体   English   中英

使用\\ register_meta()使用REST API检索post meta

[英]Retrieving post meta with REST API using \register_meta()

WordPress Codex建议了两种在响应中添加帖子元的方法 我正在尝试使用register_meta()实现这一目标,因为这对我来说似乎是正确的方法。

问题

尽管show_in_rest设置为true,但当我使用register_meta()时,响应中的meta字段仍为空。

解决方案

感谢Allan Fuller ,他指出$ object_type参数( register_meta()函数中的第一个参数应该是post而不是post类型。 新代码参考注释部分也提到了这一点)。


解决方案之前的说明

这是我的做法:

步骤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字段仍然为空。 但是,如果我使用第二种方法,也建议在Codex( register_rest_field() )的同一init钩子中:

\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'=> ['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)在他的博客文章中所建议的那样,我试图将\\ register_meta()放入rest_api_init钩子中,但它对响应中的meta没有影响。

如果要使用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是发布的类型

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM