Como obtener la Metadata en WP REST API V2

En estos días estuve realizando algo de programación Web con PHP e integración de WordPress a través de REST API para el sitio https://www.elhobbiton.com, el cual es un hostal para el que le trabajo.

El problema surgió cuando uno de los requerimientos era mostrar en el sitio que no esta basado en WordPress si no con una aplicación en F3 (FatFree Framework), los Post de una categoría determinada de “Eventos”.

Pues todo iba bien, instalar el plugin WP REST API V2, obtener la lista de Posts a través de:

/wp-json/wp/v2/posts?filter[category_name]=Eventos

Y la usamos con una solicitud AJAX de tipo GET con dataType JSON:


$.ajax({
	type : "GET",
	url : 'https://url_del_wordpress/wp-json/wp/v2/posts?filter[category_name]=Eventos',
	dataType : 'json',
	error : function() {
		alert('Unable to load posts.');
	},
	success : function(data) {
		data.forEach(function(post) {
			$.ajax({
				type : "GET",
				url : post._links["wp:featuredmedia"][0].href,
				dataType: 'json',
				success : function(image) {
					$('#addtimeline').append('<h1>post.title.rendered</h1><img src="image.source_url">');
				}
			});
		});
	}
});

No explicaré mucho de lo que el código de jQuery anterior hace, pero en resumen lo que hace es solicitar mediante el REST API todos los posts pertenecientes a la categoría de “Eventos”, una vez obtenida la lista, itera en ella y debido a que en el JSON obtenido no viene la URL a la imagen destacada, es necesario obtenerla a través del recurso de media, por lo que hacemos un segundo jquery para obtener la URL a la imagen destacada.

Todo parecía bien hasta ahí, automáticamente hacia el trabajo, pero resulto que en cada Post necesitaba meter metadatos para agregar información relevante al post que necesitaba extraer de manera fácil desde el REST API.

Lamentablemente el REST API no obtiene los meta de cada post, únicamente el POST, por lo que hay que agregar a la respuesta en JSON cada metadato que queremos que aparezca en los post, para lo que debemos poner el siguiente código:

add_action( 'rest_api_init', 'slug_register_eventos' );
function slug_register_eventos() {
    register_rest_field( 'post',
        'mes',
        array(
            'get_callback'    => 'slug_get_eventos_meta',
            'update_callback' => null,
            'schema'          => null,
        )
    );
    register_rest_field( 'post',
        'dias',
        array(
            'get_callback'    => 'slug_get_eventos_meta',
            'update_callback' => null,
            'schema'          => null,
        )
    );
}

function slug_get_eventos_meta( $object, $field_name, $request ) {
    return get_post_meta( $object[ 'id' ], $field_name, true );
}

Donde cada llamada a register_rest_field es una metadato que deseamos incluir en la respuesta JSON.

Y con eso terminamos.

Saludos

Leave a Reply

Your email address will not be published. Required fields are marked *