Как получить произвольные мета-данные записи через REST API

23 мая 2016 г., 05:58:16
Просмотры: 31.5K
Голосов: 11

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

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

API ниже выдает мне все листинги со стандартным ответом.

http://localhost/sports/wp-json/wp/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' );
    }
}

Используя код выше, я могу добавить "phone" в REST ответ, но я всегда получаю phone = false в ответе. Он не показывает корректные данные из таблицы wp_postmeta.

Я использовал следующие ссылки для справки:

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

Детали плагинов: 1. WP Job Manager 2. rest-api

Любая помощь будет очень полезна.

6
Комментарии

Где вы видите "false"? Вы проверяли, что на самом деле передается по "проводу" с помощью инструментов сети в браузере?

Mark Kaplun Mark Kaplun
23 мая 2016 г. 06:32:29

Привет, я получаю ответ в формате JSON.

Hari Soni Hari Soni
23 мая 2016 г. 06:33:31

Я использую плагин Postman в Chrome для обращения к сервису. Я не использую никакой аутентификации. Это простой API-запрос без данных в теле запроса.

Hari Soni Hari Soni
23 мая 2016 г. 06:52:00

Тогда как вы узнаёте, что действительно вызываете нужный пост? Вы вообще доходите до этого колбэка?

Mark Kaplun Mark Kaplun
23 мая 2016 г. 06:56:12

Я новичок в PHP и WordPress. Долгое время работал с JAVA. Не могли бы вы подсказать, как проверить, вызывается ли моя функция? Я пытался вывести объект поста, но не могу увидеть значение...

Hari Soni Hari Soni
23 мая 2016 г. 07:38:45

Грубый, но мой любимый способ - использовать var_dump для переменной и die после этого. Более продвинутые инструменты вроде phpstorm, вероятно, позволяют ставить точки останова. Возможно, в eclipse тоже есть такая возможность.

Mark Kaplun Mark Kaplun
23 мая 2016 г. 08:27:16
Показать остальные 1 комментариев
Все ответы на вопрос 5
2
20

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

Используя этот же фильтр, вы также можете удалять поля/данные из ответа и выполнять любые манипуляции с данными.

23 мая 2016 г. 09:59:04
Комментарии

+1, так как это, вероятно, лучше, чем пытаться получать каждую информацию отдельными запросами, как, кажется, делает автор вопроса.

Mark Kaplun Mark Kaplun
23 мая 2016 г. 19:50:06

Это решение идеально сработало для меня

Asif Asif
23 сент. 2017 г. 21:40:17
0

$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 или что-то другое без префикса в виде подчёркивания. Потому что _ часто используется для приватных мета-ключей. Попробуйте добавить произвольное поле с мета-ключом, начинающимся с _, напрямую к вашему посту, и вы поймёте, что я имею в виду.

23 мая 2016 г. 09:23:39
0

Просто добавьте эти методы в файл function.php

add_action( 'rest_api_init', 'create_api_posts_meta_field' );

function create_api_posts_meta_field() {

 // register_rest_field ( 'тип-записи', 'название-поля-для-возврата', массив-колбэков-и-схем() )
 register_rest_field( 'tour', 'metaval', array(
 'get_callback' => 'get_post_meta_for_api',
 'schema' => null,
 )
 );
}

function get_post_meta_for_api( $object ) {
 // получаем ID из массива объекта записи
 $post_id = $object['id'];

 // возвращаем метаданные записи
 return get_post_meta( $post_id );
}
14 нояб. 2017 г. 10:43:10
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'),

                // Вам следует реализовать лучшую авторизацию, иначе этот endpoint будет открыт
                'permission_callback'   => function(){return TRUE;}
            )
        );
    }

    public function returnMetaData(){
        if (!(isset($_REQUEST['post-id']))){
            return "ОШИБКА: Не указан ID поста";
        }
        $postID = $_REQUEST['post-id'];
        $meta = get_post_meta($postID);
        $meta = json_encode($meta);
        return $meta;
    }
}

$MetaDetaFetcher = New MetaDataFetcher;
$MetaDetaFetcher->enableAPIroute();
3 дек. 2019 г. 21:48:07
0

Я протестировал и использовал то, что кажется мне более простым способом: после регистрации пользовательского типа записи вы также можете зарегистрировать пользовательские мета-поля и сделать их доступными в REST API.

Смотрите register_meta()

register_post_type( 'job_listing', $args ); // в $args вы можете сделать тип записи доступным в REST API
register_meta(
    'post', '_phone', [
    'object_subtype' => 'job_listing',
        'show_in_rest' => true
    ]
   );
29 мая 2020 г. 13:02:24