如何使用REST API获取自定义帖子元


9

我正在尝试为我的wordpress网站创建一个REST API,该网站用于使用wordpress作业管理器插件进行设施列表。

我已经在\ plugins \ rest-api \ plugin.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_postmeta表的正确数据。

我已经按照下面提到的链接进行参考。

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

插入详细信息。1. WP工作经理2. rest-api

任何帮助都会非常有帮助。


您在哪里看到“假”?您是否已使用浏览器的网络工具检查了“线路”上的实际情况?
马克·卡普伦

嗨,我收到JSON作为回应。
哈里·索尼

我正在使用chrome插件邮递员打该服务。我没有使用任何身份验证。它是一个简单的API请求,请求主体中没有任何数据。
哈里·索尼

那么您怎么知道您实际上触发了正确的帖子?你甚至去那个回调?
马克·卡普伦

我是PHP和wordpress的新手。我在JAVA工作了很长时间。您能否让我知道如何检查我的函数是否被调用?我试图打印后的对象,但无法看到的价值..
哈日瑞里

Answers:


5

$post回调函数中是一个数组,而不是一个对象。所以你不能使用$post->id。将其更改为$post['id'],它应该可以工作:

function slug_get_phone_number($post, $field_name, $request)
{
    return get_post_meta($post['id'], '_phone', true);
}

我建议更改_phonephone_number不带下划线前缀的其他名称。因为_通常与私有元密钥一起使用。尝试在自定义字段中_直接添加带有带前缀的meta键的自定义字段,您将明白我的意思。


16

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 );

使用相同的过滤器,您还可以从响应中删除字段/数据,并对数据进行任何处理。


+1,因为这可能比尝试按OP似乎在不同请求中获取每个信息更好的方法。
马克·卡普伦

该解决方案对我而言非常有效
Asif

2

只需将此方法添加到function.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 );
}

0

这是一个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();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.