Cómo obtener metaetiquetas personalizadas utilizando la API REST

9

Estoy tratando de crear una API REST para mi sitio web de WordPress que se utiliza para la inclusión de instalaciones utilizando el complemento de administrador de trabajo de WordPress.

He registrado mi publicación personalizada, taxonomías en \ plugins \ rest-api \ plugin.php.

debajo de API me da todos los listados con respuesta predeterminada.

http: // localhost / sports / wp-json / wp / v2 / joblisting /

Quería agregar meta meta en la respuesta JSON usando el siguiente código.

function slug_register_phone_number() {
            register_rest_field( 'job_listing',
                'phone',
            array(
                'get_callback' => 'slug_get_phone_number',
                'update_callback' => null,
                'schema' => null,
            )
        );
    }

    function slug_get_phone_number($post, $field_name, $request) {
        return get_post_meta($post->id, '_phone' );
    }
}

Usando el código anterior, puedo agregar "teléfono" como respuesta REST pero siempre obtengo phone = false en respuesta. No muestra los datos correctos de la tabla wp_postmeta.

He seguido los enlaces mencionados a continuación para referencia.

http://v2.wp-api.org/extending/modifying/

Enchufe los detalles. 1. WP Job manager 2. rest-api

Cualquier ayuda será realmente útil.

Hari Soni
fuente
¿Dónde ves lo "falso"? ¿Ha verificado lo que realmente está sucediendo en el "cable" con las herramientas de red del navegador?
Mark Kaplun
Hola, me estoy poniendo en JSON como respuesta.
Hari Soni
Estoy usando el complemento de cromo cartero para acceder al servicio. No estoy usando ningún tipo de autenticación. Es una simple solicitud de API sin ningún dato en el cuerpo de la solicitud.
Hari Soni
entonces, ¿cómo sabes que realmente disparas la publicación correcta? ¿Llegas a esa devolución de llamada?
Mark Kaplun
Soy nuevo en PHP y WordPress. Estoy trabajando con JAVA por mucho tiempo. ¿Podría decirme cómo puedo verificar si se llama a mi función o no? Traté de imprimir el objeto de publicación pero no pude ver el valor ..
Hari Soni

Respuestas:

5

$posten la función de devolución de llamada hay una matriz, no un objeto. Entonces no puedes usar $post->id. Cámbielo a $post['id']y debería funcionar:

function slug_get_phone_number($post, $field_name, $request)
{
    return get_post_meta($post['id'], '_phone', true);
}

Recomiendo cambiar _phonea phone_numberu otra cosa sin subrayar el prefijo. Porque a _menudo se usa con meta claves privadas. Intente agregar un campo personalizado que tenga metaclave con _prefijo directamente a su publicación, verá lo que quise decir.

SarahCoding
fuente
16

WP API tiene un rest_prepare_postfiltro (o rest_prepare_CPTsi está trabajando con publicaciones personalizadas) que puede usar para modificar la respuesta JSON. En tu caso lo será rest_prepare_joblisting.

function filter_joblisting_json( $data, $post, $context ) {
$phone = get_post_meta( $post->ID, '_phone', true );

if( $phone ) {
    $data->data['phone'] = $phone;
}

return $data;
}
add_filter( 'rest_prepare_joblisting', 'filter_joblisting_json', 10, 3 );

Usando el mismo filtro también puede eliminar campos / datos de la respuesta y hacer cualquier manipulación de los datos.

Boris Kuzmanov
fuente
+1, ya que probablemente sea una mejor manera que tratar de obtener cada información en diferentes solicitudes como parece hacer el OP.
Mark Kaplun
Esta solución funcionó perfectamente para mí
Asif
2

Simplemente agregue estos métodos a function.php

add_action( 'rest_api_init', 'create_api_posts_meta_field' );

function create_api_posts_meta_field() {

 // register_rest_field ( 'name-of-post-type', 'name-of-field-to-return', array-of-callbacks-and-schema() )
 register_rest_field( 'tour', 'metaval', array(
 'get_callback' => 'get_post_meta_for_api',
 'schema' => null,
 )
 );
}

function get_post_meta_for_api( $object ) {
 //get the id of the post object array
 $post_id = $object['id'];

 //return the post meta
 return get_post_meta( $post_id );
}
Nuwan
fuente
0

Aquí hay un ejemplo de OOP:

class MetaDataFetcher{

    public function enableAPIroute(){
        add_action ('rest_api_init', array($this, 'doRegisterRoutes'));
    }

    public function doRegisterRoutes(){
        register_rest_route(
            'yournamespace/vXX',
            'fetch-post-meta',
            array(
                'methods'               => array('GET','POST'),
                'callback'              => array($this, 'returnMetaData'),

                //You should have a better auth, or this endpoint will be exposed
                permission_callback'   => function(){return TRUE;}
        );
    }

    public function returnMetaData(){
        if (!(isset($_REQUEST['post-id']))){
            return "ERROR: No post ID";
        }
        $postID = $_REQUEST['post-id'];
        $meta = get_post_meta($postID);
        $meta = json_encode($meta);
        return $meta;
    }
}

$MetaDetaFetcher = New MetaDataFetcher;
$MetaDetaFetcher->enableAPIroute();
John Dee
fuente