如何使用REST API获取自定义发布元数据

时间:2016-05-23 作者:Hari Soni

我正在尝试为我的wordpress网站创建RESTAPI,该网站用于使用wordpress作业管理器插件列出设施。

我已经在\\插件\\ rest api \\插件中注册了我的自定义帖子《分类法》。php。

下面的API为我提供了所有带有默认响应的列表。

http://localhost/sports/wp-json/wp/v2/joblisting/

我想使用下面的代码在JSON响应中添加post-meta。

function slug_register_phone_number() {
            register_rest_field( \'job_listing\',
                \'phone\',
            array(
                \'get_callback\' => \'slug_get_phone_number\',
                \'update_callback\' => null,
                \'schema\' => null,
            )
        );
    }

    function slug_get_phone_number($post, $field_name, $request) {
        return get_post_meta($post->id, \'_phone\' );
    }
}
使用上述代码,我可以添加“phone”作为REST响应,但我总是得到phone=false的响应。它没有显示wp\\U Posteta表中的正确数据。

我已经遵循以下提到的链接以供参考。

http://v2.wp-api.org/extending/modifying/

插件详细信息。1、WP作业经理2。rest api

任何帮助都会非常有用。

5 个回复
最合适的回答,由SO网友:dan9vu 整理而成

$postcallback function 是数组,而不是对象。所以你不能使用$post->id. 将其更改为$post[\'id\'] 它应该会起作用:

function slug_get_phone_number($post, $field_name, $request)
{
    return get_post_meta($post[\'id\'], \'_phone\', true);
}
我建议更改_phonephone_number 或其他没有下划线前缀的内容。因为_ 通常与专用元密钥一起使用。尝试添加具有元键的自定义字段_ 直接在你的帖子前面加前缀,你就会明白我的意思了。

SO网友:Boris Kuzmanov

WP API具有rest_prepare_post 过滤器(或rest_prepare_CPT 如果您使用的是自定义贴子),则可以使用它修改JSON响应。在你的情况下rest_prepare_joblisting.

function filter_joblisting_json( $data, $post, $context ) {
$phone = get_post_meta( $post->ID, \'_phone\', true );

if( $phone ) {
    $data->data[\'phone\'] = $phone;
}

return $data;
}
add_filter( \'rest_prepare_joblisting\', \'filter_joblisting_json\', 10, 3 );
使用相同的过滤器,还可以从响应中删除字段/数据,并对数据进行任何操作。

SO网友:Nuwan

只需将此方法添加到函数中。php

add_action( \'rest_api_init\', \'create_api_posts_meta_field\' );

function create_api_posts_meta_field() {

 // register_rest_field ( \'name-of-post-type\', \'name-of-field-to-return\', array-of-callbacks-and-schema() )
 register_rest_field( \'tour\', \'metaval\', array(
 \'get_callback\' => \'get_post_meta_for_api\',
 \'schema\' => null,
 )
 );
}

function get_post_meta_for_api( $object ) {
 //get the id of the post object array
 $post_id = $object[\'id\'];

 //return the post meta
 return get_post_meta( $post_id );
}

SO网友:John Dee

下面是一个OOP示例:

class MetaDataFetcher{

    public function enableAPIroute(){
        add_action (\'rest_api_init\', array($this, \'doRegisterRoutes\'));
    }

    public function doRegisterRoutes(){
        register_rest_route(
            \'yournamespace/vXX\',
            \'fetch-post-meta\',
            array(
                \'methods\'               => array(\'GET\',\'POST\'),
                \'callback\'              => array($this, \'returnMetaData\'),

                //You should have a better auth, or this endpoint will be exposed
                permission_callback\'   => function(){return TRUE;}
        );
    }

    public function returnMetaData(){
        if (!(isset($_REQUEST[\'post-id\']))){
            return "ERROR: No post ID";
        }
        $postID = $_REQUEST[\'post-id\'];
        $meta = get_post_meta($postID);
        $meta = json_encode($meta);
        return $meta;
    }
}

$MetaDetaFetcher = New MetaDataFetcher;
$MetaDetaFetcher->enableAPIroute();

SO网友:Lyle Bennett

我测试并使用了一种对我来说似乎更简单的方法,在注册自定义post类型之后,还可以注册自定义meta并使其在RESTAPI中可用。

看见register_meta()

register_post_type( \'job_listing\', $args ); // in $args you can make the post type available in rest api
register_meta(
    \'post\', \'_phone\', [
    \'object_subtype\' => \'job_listing\',
        \'show_in_rest\' => true
    ]
   );