Как включить поля META в Wordpress API Post? - PullRequest
3 голосов
/ 05 июня 2019

Я использую 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

API Wordpress Rest - Пользовательские поля

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

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

Ответы [ 2 ]

0 голосов
/ 08 июня 2019

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

Обратите внимание, что для мета-полей, зарегистрированных для пользовательских типов сообщений, сообщение Тип должен иметь поддержку пользовательских полей. В противном случае мета-поля будут не отображаются в REST API. https://developer.wordpress.org/rest-api/extending-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.

enter image description here

Теперь, если вы хотите создать экспериментальный тип сообщения. Используйте JSON Linter для проверки вашего 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
}

enter image description here

WordPress не позволяет вам создавать ресурсы напрямую. Вам необходимо подтвердить ваш запрос REST. Я использую Basic Auth для аутентификации 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)
0 голосов
/ 08 июня 2019

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

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

Для справки см. Ссылка

...