¿Cómo incluir campos META en WordPress API Post?

5 minutos de lectura

avatar de usuario
Pedro Foti

Estoy usando WordPress versión 5.2.1, lo que significa que no estoy usando un complemento para la API de WP. Tengo un código de trabajo que crea una nueva publicación (usando un tipo de publicación personalizada) en mi sitio WP, todo bien allí. El problema es que he creado campos personalizados usando ACF, pero no aparecen en la publicación recién creada. El siguiente es un ejemplo de lo que estoy enviando a WP a través de: /wp-json/wp/v2/experience.

Nota: experience es mi tipo de publicación personalizada.

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

Esto crea una publicación, pero los campos dentro de meta son completamente ignorados. Mi objetivo es tener los campos que especifico en meta ser incluido en mi publicación recién creada.

Probé las soluciones enumeradas en las siguientes URL y nada funcionó.

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

WordPress Rest API – Campos personalizados

https://jeffreyeverhart.com/2017/06/14/agregando-campos-personalizados-wordpress-json-api/

¿Qué me estoy perdiendo?

  • ¿Ha visto que los campos se ignoran en el tablero (ACF no muestra ningún campo personalizado), o también verificó la tabla wp_postmeta? Puede ser que ACF tenga problemas para mostrarlo en lugar de que la API de WP almacene los valores meta.

    – Siavas

    8 de junio de 2019 a las 0:43


avatar de usuario
Sagar Bahadur Tamang

En primer lugar, debe configurar el 'show_in_rest' propiedad a true y ‘supports‘ la propiedad debe incluir 'custom-fields' cuando estás registrando un nuevo tipo de publicación. Debe admitir ‘campos personalizados’ si desea incluir los metacampos.

Tenga en cuenta que para los metacampos registrados en tipos de publicaciones personalizadas, el tipo de publicación debe admitir campos personalizados. De lo contrario, los metacampos no aparecerán en la API REST. 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' );

Ahora, debe registrar los metacampos usando el 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
    ));

}

Nota: Los metacampos deben ser únicos. Prefije sus campos en ACF para hacerlo único.

JSON no usa comillas simples para envolver una cadena. Utiliza comillas dobles. Estás enviando un JSON no válido.

ingrese la descripción de la imagen aquí

Ahora, si desea crear un tipo de publicación de experiencia. Use un linter JSON para validar su json. https://jsonlint.com/

Haz una solicitud POST a http://paathsala-plugin.test/wp-json/wp/v2/experiencecon los campos

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

ingrese la descripción de la imagen aquí

WordPress no le permite crear recursos directamente. Debe autenticar su solicitud REST. Estoy usando la autenticación básica para autenticar la API REST de WordPress. Necesitas instalar un complemento. Cómpralo desde aquí: https://github.com/WP-API/Basic-Auth

He probado el siguiente código de 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)

  • Estoy usando CPTUI y aunque antes no tenía supports -> custom-fields, lo he agregado. Sin embargo, después de agregar eso, recibo el siguiente error al realizar una solicitud (después de haber copiado el código de registro que publicaste). {'code': 'rest_invalid_param', 'message': 'Invalid parameter(s): meta', 'data': {'status': 400, 'params': {'meta': 'Invalid parameter.'}}}

    – Pedro Foti

    8 jun 2019 a las 20:38

  • Re: JSON no válido, estoy usando la biblioteca de solicitudes de Python, por lo que se está formateando correctamente. Tiene un formato diferente cuando se imprime en la consola.

    – Pedro Foti

    8 jun 2019 a las 20:38

  • @PeterFoti He actualizado la respuesta con el código python en funcionamiento. Échale un vistazo.

    – Sagar Bahadur Tamang

    9 de junio de 2019 a las 1:32

  • @SagarBahadurTamang Cuando hago esto, aparece este error: { "code": "rest_cannot_update", "message": "Sorry, you are not allowed to edit the email custom field.", "data": { "key": "email", "status": 403 } }

    – Amjad

    9 sep 2020 a las 17:20


  • era un problema de rol. El inicio de sesión se estableció en un suscriptor.

    – Amjad

    11 de septiembre de 2020 a las 11:36

@Peter Foti, ¿puede probar la siguiente función para agregar valor meta en su API?

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

Para referencia ver esto Enlace

¿Ha sido útil esta solución?