当前位置: 首页 > 知识库问答 >
问题:

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

东门子昂
2023-03-14

WordPress Codex建议了两种将post meta添加到响应中的方法。我正在尝试使用register_meta()来实现这一点,因为它对我来说似乎是正确的方法。

问题:

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

溶液:

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

求解前的描述

我是如何做到这一点的:

步骤 1:从函数调用.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'],
                ]
            );

元字段在响应中仍然保持为空。但是,如果我在同一个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;
                },
            ) );
        } );

然后字段及其值出现在响应中。我错过了什么?

由于我使用的是自定义帖子类型,因此可能也值得查看这部分代码。如法典中所述,在注册时,我将“支持”设置为=

        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 没有影响。

共有1个答案

姬温文
2023-03-14

如果您想使用<code>register_meta 示例<>

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/

对象类型需要'post'到自定义post类型名称

看https://codex.wordpress.org/Function_Reference/register_meta

第一个参数是object_type-有效的对象类型是由wordpress预定义的,CPT是一种帖子

 类似资料:
  • 到目前为止,我只能与Jira建立连接,但我不知道如何获取特定字段。据我所知,JIRA API的SearchResult类可以解决这个问题,但我不知道如何将它集成到我现有的代码中。任何帮助都将不胜感激。 Java版本-8,操作系统-视窗10,日蚀-火星 /*使用的罐子:jersey-bundle-1.9。罐子(https://mvnrepository.com/artifact/com.sun.je

  • 我使用已签名的URL从使用Air的移动设备上传blob。 我有两个问题: 使用签名 URL 上传 Blob 时,我假设我不需要按照文档中所述包含所有标头。我是否认为我只需要对URL执行请求,并将编码到正文中的文件包含在正文中,设置为? http://msdn . Microsoft . com/en-us/library/windows azure/DD 179451 . aspx (Upload

  • 如何使用ArrayList检索Student类的单个属性,或者检查列表中是否存在“AAA ”?

  • 我正在使用使用Tweepy库的Python代码来检索特定主题标签的Twitter数据,但问题是我需要检索特定时期,例如,从2013年6月30日到2013年12月30日。我该怎么做?

  • 我一直在使用贝宝的IPN来处理交易。我想构建一个发票搜索工具,以便能够出于各种原因搜索旧的或当前的用户付款。我今天花了一些时间设置PayPalPHP REST API SDK来促进这一点,并做了以下工作。 > 我创建了一个ApiContext使用启动的OAuthTokenCredential。 我创建了一个搜索对象使用广泛的日期跨度,我100%肯定应该返回结果。 然后,我利用搜索对象和API上下文

  • 我试图用RESTAPI实现Spring Security性,并作为前端进行响应,因为这是我的第一个完整堆栈开发项目,我对如何实现正确的身份验证机制一无所知。 我已经搜索了很多,找到了关于Spring Security with Basic Auth的文章,但我无法弄清楚如何将该身份验证转换为其他api,然后通过会话/cookie进行管理。即使我得到的任何github引用都很旧,或者它们还没有完全迁