Как получить пользовательскую мета-запись с помощью REST API

9

Я пытаюсь создать REST API для моего веб-сайта WordPress, который используется для перечисления средств с помощью плагина WordPress Job Manager.

Я зарегистрировал свой собственный пост, таксономии в \ plugins \ rest-api \ plugin.php.

API ниже дает мне все списки с ответом по умолчанию.

HTTP: // локальный / спорт / сор-JSON / шр / v2 / joblisting /

Я хотел добавить пост мета в ответ JSON, используя приведенный ниже код.

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

Используя приведенный выше код, я могу добавить «телефон» в качестве ответа REST, но я всегда получаю телефон = ложь в ответ. Не отображаются правильные данные из таблицы wp_postmeta.

Я перешел по ссылкам ниже для справки.

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

Подключите детали. 1. WP Job Manager 2. Rest-API

Любая помощь будет действительно полезна.

Хари Сони
источник
где ты видишь "ложь"? Вы проверили, что на самом деле происходит "провод" с сетевыми инструментами браузера?
Марк Каплун
Привет я получаю в JSON в качестве ответа.
Хари Сони
Я использую Chrome Плагин Почтальон, чтобы поразить службу. Я не использую никакой аутентификации. Это простой запрос API без каких-либо данных в теле запроса.
Хари Сони
тогда откуда ты знаешь, что на самом деле запускаешь нужный пост? ты вообще добираешься до этого обратного вызова?
Марк Каплун
Я новичок в PHP и WordPress. Я работаю с JAVA в течение длительного времени. Не могли бы вы дать мне знать, как я могу проверить, вызывается ли моя функция или нет? Я пытался напечатать объект записи, но не смог увидеть значение ..
Хари Сони

Ответы:

5

$postв функции обратного вызова это массив, а не объект. Таким образом, вы не можете использовать $post->id. Измените его на $post['id']и оно должно работать:

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

Я рекомендую изменение _phoneк phone_numberили что - то еще без подчеркивания префикса. Потому _что часто используется с закрытыми мета-ключами. Попробуйте добавить настраиваемое поле, которое имеет мета-ключ с _префиксом, прямо к вашему сообщению, вы поймете, что я имел в виду.

SarahCoding
источник
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 );
}
Nuwan
источник
0

Вот пример ООП:

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();
Джон Ди
источник