Intentando obtener un meta personalizado de publicación a través de la API JSON de Jetpack [cerrado]

4

Estoy usando el Jetpack para Wordpress para producir una API JSON para mi tipo de publicación personalizada Eventos , que funciona bien:

https://public-api.wordpress.com/rest/v1/sites/MYSITE/posts/?type=events&number=100

Sin embargo, este CPT también incluye bastantes campos Meta de post generados por Cajas y campos de Meta personalizados para wordpress . Estos campos incluyen cosas como:

  • _ecmb_supporting_bands
  • _ecmb_tickets_avail
  • _ecmb_event_agelim

Y, de forma predeterminada, estos campos no son devueltos por la API de JSON ... He intentado ejecutar consultas como:

https://public-api.wordpress.com/rest/v1/sites/MYSITE/posts/?type=events&number=100&meta_key='_ecmb_supporting_bands'

O sin comillas alrededor de la meta clave: https://public-api.wordpress.com/rest/v1/sites/MYSITE/posts/?type=events&number=100&meta_key=_ecmb_supporting_bands

Lamentablemente esto no funciona. ¿Alguien sabe cómo puedo devolver estos meta campos personalizados en mi respuesta JSON?

    
pregunta Jody Heavener 19.12.2013 - 19:27

2 respuestas

3

De la documentación:

De acuerdo con JetPack Documentos de la API JSON :

  

De forma predeterminada, todas las claves de metadatos están permitidas en la API, siempre que   No son claves protegidas. Cualquier clave de metadatos que comienza con _ es por   Protegido por defecto. Sin embargo, se puede acceder a las claves de metadatos protegidas   y editado por los usuarios con edit_post_meta (utilizado para editar y   viendo), las capacidades add_post_meta y delete_post_meta como   apropiado para cada operación. También hemos añadido un filtro.   rest_api_allowed_public_metadata que te permite específicamente   incluir en la lista blanca ciertas claves de metadatos a las que pueda acceder cualquier usuario, incluso si   esa clave está protegida.

por lo que el filtro rest_api_allowed_public_metadata es lo que está buscando.

Desde el código fuente:

Si verifica el código fuente del JetPack, encontrará esta parte:

    function is_metadata_public( $key ) {
            if ( empty( $key ) )
                    return false;

            // whitelist of post types that can be accessed
            if ( in_array( $key, apply_filters( 'rest_api_allowed_public_metadata', array() ) ) )
                    return true;

            return false;
    }

en el archivo class.json-api-endpoints.php .

También puede consultar la función allow_bbpress_public_metadata() aquí para ver cómo implementar este filtro rest_api_allowed_public_metadata .

Ejemplo:

Aquí hay un ejemplo similar para su caso:

/**
 * Whitelist protected meta keys
 *
 * @param array $allowed_meta_keys 
 * @return array $allowed_meta_keys 
 */
function custom_rest_api_allowed_public_metadata( $allowed_meta_keys )
{
    // only run for REST API requests
    if ( ! defined( 'REST_API_REQUEST' ) || ! REST_API_REQUEST )
        return $allowed_meta_keys;

    $allowed_meta_keys[] = '_ecmb_supporting_bands';
    $allowed_meta_keys[] = '_ecmb_tickets_avail';
    $allowed_meta_keys[] = '_ecmb_event_agelim';

    return $allowed_meta_keys;
}

add_filter( 'rest_api_allowed_public_metadata', 'custom_rest_api_allowed_public_metadata' );

con la salida JSON similar a esta:

"metadata":[{"id":"196711","key":"_ecmb_event_agelim","value":"18"},
            {"id":"196709","key":"_ecmb_supporting_bands","value":"The Rolling Stones"}, 
            {"id":"196710","key":"_ecmb_tickets_avail","value":"5500"}]
    
respondido por el birgire 03.01.2014 - 13:33
1

Además de la respuesta de @birgire, colocar el código del filtro en algún lugar puede ser complicado:

  • Si lo coloca debajo del archivo "functions.php" de su tema, una actualización del tema podría sobrescribir su código
  • Escribir un complemento para solo agregar un filtro es una gran cantidad de errores

Es por esto que lo que hice fue usar el siguiente complemento que le permite escribir sus acciones y filtros personalizados dentro del panel de administración de Wordpress sin tener que preocuparse por perderlo. enlace .

Tuve el mismo problema que tú y después de incluir el filtro ahora funciona como un encanto.

    
respondido por el Jose Antonio Escobar Garcia 22.06.2014 - 14:58

Lea otras preguntas en las etiquetas