Добавить метаполя сообщений через WP API v2

Я пытаюсь поиграть с WP API v2 и вставить сообщения от Postman.

Если я отправлю этот необработанный запрос, он создаст сообщение:

{
  "title": "Test Title",
  "content": "Test Content",
}

Однако я также пытаюсь добавить к этому несколько значений настраиваемых полей, и мне кажется, что я не могу заставить их работать. Этот запрос создает сообщение, но не добавляет никаких мета-полей:

{
  "title": "Test Title",
  "content": "Test Content",
  "meta": {
    "foo": "bar",
    "foo2": "bar2"
  }
}

Как выполнить POST мета-поля foo и foo2 со значениями bar и bar2 через конечную точку API https://my-site.com/wp-json/wp/v2/posts?

Изменить: также кажется, что настраиваемые поля не извлекаются изначально в запросах GET. Я поместил этот код в плагин mu:

add_filter( 'rest_prepare_post', 'xhynk_api_post_meta', 10, 3 );
function xhynk_api_post_meta( $data, $post, $context ){
    $meta = get_post_custom( $post->ID );

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

    return $data;
}

Что, по крайней мере, позволяет мне просматривать его в запросе GET. Однако я все еще не могу отправить его в POST через Postman. Даже добавление "status": "publish" приведет к публикации нового сообщения вместо черновика, как по умолчанию. Существуют ли какие-либо перехватчики или фильтры, которые я могу использовать в запросах API POST, чтобы убедиться, что добавлены настраиваемые поля?


person Xhynk    schedule 25.10.2017    source источник


Ответы (1)


для обработки метаданных при вставке и обновлении вы можете сделать это с помощью действия rest_insert_ + post type

add_action("rest_insert_page", function (\WP_Post $post, $request, $creating) {


    $metas = $request->get_param("meta");

    if (is_array($metas)) {

        foreach ($metas as $name => $value) {
            update_post_meta($post->ID, $name, $value);
        }

    }


}, 10, 3);
person mmm    schedule 26.10.2017
comment
Ты, мой друг, абсолютный спасатель жизни! Уже 2 дня выдергиваю на этом волосы! Однако могу ли я спросить, какова цель \WP_Post $post в объявлении функции? Я попытался сделать это со следующим, и это сработало: add_action( 'rest_insert_post', function( $post, $request, $creating ){ просто интересно, для чего этот кусок был в вашем ответе? - person Xhynk; 27.10.2017
comment
это объявление типа php.net/ - person mmm; 27.10.2017
comment
Спасибо, это очень помогает ‹3 - person Axel Paris; 23.06.2021