Как включить поля META в сообщение Wordpress API?

Я использую Wordpress версии 5.2.1, что означает, что я не использую плагин для WP API. У меня есть рабочий код, который создает новый пост (с использованием настраиваемого типа сообщения) на моем сайте WP, все в порядке. Проблема в том, что я создал настраиваемые поля с помощью ACF, но они не отображаются во вновь созданном сообщении. Ниже приведен пример того, что я отправляю в WP через: /wp-json/wp/v2/experience.

Примечание. experience - это мой настраиваемый тип сообщения.

{'title': 'test', 'content': 'testing from python', 'status': 'draft', 'author': 1, 'meta': {'location': 'NYC', 'date': 'never', 'event_url': 'http://google.com'}, 'featured_media': 1221}

Это создает сообщение, но поля внутри meta полностью игнорируются. Моя цель состоит в том, чтобы поля, указанные в meta, были включены в мой недавно созданный пост.

Я пробовал решения, перечисленные по следующим URL-адресам, и ничего не помогло.

https://gist.github.com/rileypaulsen/9b4505cdd0ac88d5ef51

Wordpress Rest API - настраиваемые поля

https://jeffreyeverhart.com/2017/06/14/adding-custom-fields-wordpress-json-api/

Что мне не хватает?


person Peter Foti    schedule 05.06.2019    source источник
comment
Вы видели, что поля игнорируются на панели управления (ACF не показывает никаких настраиваемых полей), или вы также проверяли таблицу wp_postmeta? Возможно, у ACF есть проблемы с отображением, а не с WP API, хранящим мета-значения.   -  person Siavas    schedule 08.06.2019


Ответы (2)


Прежде всего, вам нужно установить для свойства 'show_in_rest' значение true, а свойство 'supports' должно включать 'custom-fields', когда вы регистрируете новый тип сообщения. Вам необходимо поддерживать «настраиваемые поля», если вы хотите включить мета-поля.

Обратите внимание, что для мета-полей, зарегистрированных в настраиваемых типах сообщений, тип сообщения должен иметь поддержку настраиваемых полей. В противном случае мета-поля не появятся в REST API. https://developer.wordpress.org/rest-api/exnding-the-rest-api/modifying-responses/

function cptui_register_my_cpts() {

    /**
     * Post Type: Experiences.
     */

    $labels = array(
        "name" => __( "Experiences", "twentynineteen" ),
        "singular_name" => __( "Experience", "twentynineteen" ),
    );

    $args = array(
        "label" => __( "Experiences", "twentynineteen" ),
        "labels" => $labels,
        "description" => "",
        "public" => true,
        "publicly_queryable" => true,
        "show_ui" => true,
        "delete_with_user" => false,
        "show_in_rest" => true,
        "rest_base" => "",
        "rest_controller_class" => "WP_REST_Posts_Controller",
        "has_archive" => false,
        "show_in_menu" => true,
        "show_in_nav_menus" => true,
        "exclude_from_search" => false,
        "capability_type" => "post",
        "map_meta_cap" => true,
        "hierarchical" => false,
        "rewrite" => array( "slug" => "experience", "with_front" => true ),
        "query_var" => true,
        "supports" => array( "title", "editor", "thumbnail", "custom-fields" ),
    );

    register_post_type( "experience", $args );
}

add_action( 'init', 'cptui_register_my_cpts' );

Теперь вам нужно зарегистрировать мета-поля, используя register_meta().

add_action( 'rest_api_init', 'register_experience_meta_fields');
function register_experience_meta_fields(){

    register_meta( 'post', 'location', array(
        'type' => 'string',
        'description' => 'event location',
        'single' => true,
        'show_in_rest' => true
    ));

    register_meta( 'post', 'date', array(
        'type' => 'string',
        'description' => 'event location',
        'single' => true,
        'show_in_rest' => true
    ));

    register_meta( 'post', 'event_url', array(
        'type' => 'string',
        'description' => 'event location',
        'single' => true,
        'show_in_rest' => true
    ));

}

Примечание: мета-поля должны быть уникальными. Префикс ваших полей в ACF, чтобы сделать его уникальным.

JSON не использует одинарные кавычки для переноса строки. Он использует двойные кавычки. Вы отправляете недействительный JSON.

введите описание изображения здесь

Теперь, если вы хотите создать тип сообщения Опыт. Используйте линтер JSON для проверки вашего json. https://jsonlint.com/

Сделайте POST-запрос к http://paathsala-plugin.test/wp-json/wp/v2/experience, с полями

{
    "title": "test",
    "content": "testingfrompython",
    "status": "draft",
    "author": 1,
    "meta": {
        "location": "NYC",
        "date": "never",
        "event_url": "http: //google.com"
    },
    "featured_media": 1221
}

введите описание изображения здесь

WordPress не позволяет создавать ресурсы напрямую. Вам необходимо подтвердить свой запрос REST. Я использую базовую аутентификацию для аутентификации WordPress REST API. Вам необходимо установить плагин. Возьмите его отсюда: https://github.com/WP-API/Basic-Auth

Я протестировал следующий код Python.

import base64
import json
import requests;

# Data to be send
data = {
    "title": "test",
    "content": "testingfrompython",
    "status": "draft",
    "author": 1,
    "meta": {
        "location": "NYC",
        "date": "never",
        "event_url": "http: //google.com"
    },
    "featured_media": 1221
}

# I am using basic auth plugin to for WP API authenticaiton
username = 'admin'
password = 'blood9807'

# Encode the username and password using base64
creds = base64.b64encode(username + ':' + password)

# Create headers to be send
headers = {
    'Authorization': 'Basic ' + creds,
    'Content-type': 'application/json', 
    'Accept': 'text/plain'
}

# Convert the python dictionary to JSON
data_json = json.dumps(data)

# Create a post
r = requests.post('http://paathsala-plugin.test/wp-json/wp/v2/experience', data = data_json, headers = headers )

print(r)
person Sagar Bahadur Tamang    schedule 08.06.2019
comment
Я использую CPTUI и, хотя раньше у меня не было supports -> custom-fields, я добавил его. Однако после добавления этого я получаю следующую ошибку при отправке запроса (после копирования опубликованного вами регистрационного кода). {'code': 'rest_invalid_param', 'message': 'Invalid parameter(s): meta', 'data': {'status': 400, 'params': {'meta': 'Invalid parameter.'}}} - person Peter Foti; 08.06.2019
comment
Re: Недействительный JSON, я использую библиотеку запросов Python, поэтому она правильно отформатирована. Он по-разному форматируется при выводе на консоль. - person Peter Foti; 08.06.2019
comment
@PeterFoti Я обновил ответ рабочим кодом Python. Проверить это. - person Sagar Bahadur Tamang; 09.06.2019
comment
@SagarBahadurTamang Когда я это делаю, я получаю такую ​​ошибку: { "code": "rest_cannot_update", "message": "Sorry, you are not allowed to edit the email custom field.", "data": { "key": "email", "status": 403 } } - person Amjad; 09.09.2020
comment
@Amjad Вы используете базовую аутентификацию для аутентификации? - person Sagar Bahadur Tamang; 10.09.2020
comment
это был ролевой вопрос. Логин был установлен на подписчика. - person Amjad; 11.09.2020

@Peter Foti, вы можете попробовать функцию ниже для добавления мета-значения в свой API.

add_post_meta( <value>, <name>, $meta_value ,true );

Для справки см. Эту ссылку < / а>

person Sujal Patel    schedule 08.06.2019