Obteniendo metadatos de usuario desde la API REST de WP

14 jun 2017, 22:53:49
Vistas: 14.5K
Votos: 8

Estoy trabajando en un proyecto utilizando la API REST de WordPress junto con VueJS y Axios (para las llamadas AJAX para obtener/enviar datos al sitio). Sin embargo, necesito acceder a los metadatos de un usuario, como 'collapsed_widgets', desde la API REST, pero los datos que recibo en la respuesta GET son:

"meta": [],

Esto ocurre para TODOS los usuarios, lo cual es extraño porque debería haber datos ahí.

¿Existe alguna forma de obtener los metadatos de los usuarios?

1
Comentarios

Solo para tu información. Creo que esto fue ELIMINADO de la API ya que podrías estar exponiendo información sensible si los campos meta del usuario se muestran automáticamente. Ojalá hubiera una forma sencilla de crear una lista blanca de meta_fields, sin tener que pasar por el problema de crear un callback para cada campo que quieras agregar.

Armstrongest Armstrongest
7 dic 2017 03:04:29
Todas las respuestas a la pregunta 2
3

Mira register_rest_field() para registrar meta con la API REST.

    add_action( 'rest_api_init', 'adding_user_meta_rest' );

    function adding_user_meta_rest() {
       register_rest_field( 'user',
                            'collapsed_widgets',
                             array(
                               'get_callback'      => 'user_meta_callback',
                               'update_callback'   => null,
                               'schema'            => null,
                                )
                          );
    }

Y luego coloca tu parte de get_user_meta en el callback.

   function user_meta_callback( $user, $field_name, $request) {
       return get_user_meta( $user[ 'id' ], $field_name, true );
   }

La clase WP_REST_Meta_Fields también puede proporcionar información más útil.


Actualización según el comentario del OP sobre el registro de rutas personalizadas

Un ejemplo parcial rápido y sencillo. Ensamblado a partir de algunas cosas que tengo frente a mí, pero no es un ejemplo funcional.

Puede ayudar mientras lees la documentación. Sigue la conexión entre el primer register_rest_route, su método GET callback, my_get_callback, abajo, y el uso del método callback de la clase WP_Rest_Request. Debería ayudar a entender los pasos. La documentación que mencioné en los comentarios entrará en otros argumentos, parámetros, etc., y por supuesto, el tema de permissions_callback.

Espero que ayude.

        class My_Extend_Rest extends WP_REST_Controller {
            public function __construct() {
                add_action( 'rest_api_init', array( $this, 'register_routes' ) );
            }//end __construct

            public function register_routes() {
                $version = '1';
                $namespace = 'my-fancy-namespace/v' . $version; 
                $base = 'my-route-base';

    // entonces, sitio.com/wp-json/my-fancy-namespace/v2/my-route-base/

                register_rest_route( $namespace, '/'. $base, array(
                    array(
                        'methods'  => 'GET',
                        'callback' => array( $this, 'my_get_callback' ),
                        'permission_callback' => array( $this, 'key_permissions_check' ),
                        ),
                    array(
                        'methods'  => 'POST',
                        'callback' => array( $this, 'my_post_callback' ),
                        'permission_callback' => array( $this, 'key_permissions_check' ),
                        ),)
                );

                $base2 = 'my-second-base';
    // entonces, sitio.com/wp-json/my-fancy-namespace/v2/my-second-base/

                register_rest_route( $namespace, '/'. $base2, array(
                    array(
                        'methods'  => 'GET',
                        'callback' => array( $this, 'my_get_callback_two' ),
                        'permission_callback' => array( $this, 'key_permissions_check' ),
                        ),
                    array(
                        'methods'  => 'POST',
                        'callback' => array( $this, 'my_post_callback_two' ),
                        'permission_callback' => array( $this, 'key_permissions_check' ),
                        ),)
                );

        }//register_routes

       public function key_permissions_check() {
          //hacer comprobaciones de permisos
       }

       public function my_get_callback( WP_REST_Request $request ) {

            //hacer cosas con $request 
           //ver los métodos mencionados en el comentario
15 jun 2017 01:45:41
Comentarios

¡Ok, excelente! Esto era lo que necesitaba pero después de algunas pruebas y reflexión, ya que necesito poder enviar datos de vuelta a la API para actualizar, creo que lo que necesitaré hacer ahora es registrar 3 rutas personalizadas. Una para 'collapsed_widgets', una para 'selected_categories' y una para 'quick_links'.

¿Tienes algún ejemplo de esas rutas mientras trabajo en ellas? :)

Zach Tackett Zach Tackett
15 jun 2017 18:33:52

Normalmente extiendo la clase WP_Rest_Controller, así que échale un vistazo seguro. Y luego revisa la clase WP_Rest_Request y sus muchos métodos.

hwl hwl
15 jun 2017 18:55:24

He añadido un bloque de código que tiene algunos ejemplos para contextualizar el registro de rutas personalizadas. ¡Espero que ayude!

hwl hwl
15 jun 2017 19:30:42
0

Puedes usar register_meta para registrar el meta y hacerlo accesible en la REST API:

\register_meta(
    'user', // Tipo de objeto (usuario)
    'collapsed_widgets', // Nombre del campo meta
    [
        'show_in_rest' => true, // Mostrar en REST API
        'single' => true, // Meta único (no un array)
        'type' => 'array', // Tipo de dato (array)
    ]
);

De esta manera también puedes actualizar el campo meta a través de la REST API.

27 ago 2023 12:01:39