Як отримати спеціальний мета-повідомлення за допомогою API REST


9

Я намагаюся створити API REST для мого веб-сайту Wordpress, який використовується для переліку об'єктів за допомогою плагіну Wordpress Manager.

Я зареєстрував свій власний пост, таксономії в \ plugins \ rest-api \ plugin.php.

нижче API дає мені всі списки з типовою відповіддю.

http: // localhost / sports / wp-json / wp / v2 / списки вакансій /

Я хотів додати пост-мета у відповідь 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, але я завжди отримую телефон = false у відповідь. Це не відображає правильних даних із таблиці wp_postmeta.

Я дотримувався нижче згаданих посилань для довідок.

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

Підключіть деталі. 1. WP Job manager 2. rest-api

Будь-яка допомога буде дуже корисною.


де ти бачиш "помилкового"? Ви перевірили, що насправді відбувається на "дроті" за допомогою мережевих інструментів браузера?
Марк Каплун

Привіт, я отримую JSON як відповідь.
Харі Соні

Я використовую хромового листоноша з плагіном, щоб потрапити на службу. Я не використовую ніякої аутентифікації. Це простий запит API без будь-яких даних в тілі запиту.
Харі Соні

то як ти знаєш, що ти насправді викликаєш правильний пост? Ви навіть потрапляєте до цього зворотного дзвінка ?.
Марк Каплун

Я новачок у PHP та wordpress. Я працюю з JAVA тривалий час. Скажіть, будь ласка, мені, як я можу перевірити, чи викликається моя функція чи ні? Я спробував надрукувати об'єкт публікації, але не зміг побачити значення ..
Харі Соні

Відповіді:


6

$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або щось інше без підкреслення префіксу. Тому що _часто використовується з приватними мета-ключами. Спробуйте додати в своє повідомлення спеціальне поле, яке містить мета-ключ із _префіксом, ви побачите, що я мав на увазі.


16

API WP має 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, оскільки це, мабуть, кращий спосіб, ніж намагатися отримувати кожну інформацію в різних запитах, як це здається в ОП.
Марк Каплун

Це рішення спрацювало для мене ідеально
Асіф

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

Ось приклад ООП:

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();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.