Получение метаданных пользователя через WP REST API

14 июн. 2017 г., 22:53:49
Просмотры: 14.5K
Голосов: 8

Я работаю над проектом, использующим WordPress REST API и VueJS вместе с Axios (для AJAX запросов GET/POST данных на сайт). Однако мне нужно получить доступ к метаданным пользователя, таким как 'collapsed_widgets', через REST API, но данные, которые я получаю в ответе GET, выглядят так:

"meta": [],

Это происходит для ВСЕХ пользователей, что странно, потому что там должны быть данные.

Есть ли способ получить метаданные пользователей?

1
Комментарии

Просто к сведению. Думаю, это было УДАЛЕНО из API, так как можно случайно раскрыть конфиденциальные данные, если метаполя пользователя выводятся автоматически. Хотелось бы, чтобы был простой способ внести метаполя в белый список, без необходимости создавать отдельный callback для каждого поля, которое нужно добавить.

Armstrongest Armstrongest
7 дек. 2017 г. 03:04:29
Все ответы на вопрос 2
3

Ознакомьтесь с функцией register_rest_field() для регистрации мета-полей через REST API.

    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,
                                )
                          );
    }

Затем поместите ваш код с get_user_meta в колбэк-функцию.

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

Класс WP_REST_Meta_Fields также может предоставить полезную информацию.


Обновление по комментарию автора о регистрации пользовательских маршрутов

Быстрый и грубый частичный пример. Собран из некоторых наработок, но не является рабочим примером.

Может помочь при изучении документации. Обратите внимание на связь между первым вызовом register_rest_route, его методом GET с колбэком my_get_callback ниже и использованием класса WP_Rest_Request в методе колбэка. Это поможет понять последовательность шагов. В документации, упомянутой в комментариях, вы найдете информацию о других аргументах, параметрах и, конечно же, о проверке прав через permissions_callback.

Надеюсь, это поможет.

        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';

    // итоговый URL: site.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';
    // итоговый URL: site.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() {
          //проверка прав доступа
       }

       public function my_get_callback( WP_REST_Request $request ) {

            //работа с объектом $request 
           //см. методы, упомянутые в комментарии
15 июн. 2017 г. 01:45:41
Комментарии

Отлично! Именно это мне и нужно, но после некоторых тестов и размышлений, поскольку мне нужно иметь возможность отправлять данные обратно в API для обновления, я думаю, что теперь мне нужно зарегистрировать 3 пользовательских маршрута. Один для 'collapsed_widgets', один для 'selected_categories' и один для 'quick_links'.

У вас есть какие-нибудь примеры для них, пока я над ними работаю? :)

Zach Tackett Zach Tackett
15 июн. 2017 г. 18:33:52

Обычно я расширяю класс WP_Rest_Controller, так что обязательно посмотрите на него. А затем изучите класс WP_Rest_Request и его многочисленные методы.

hwl hwl
15 июн. 2017 г. 18:55:24

Я добавил блок кода с некоторыми примерами для контекста регистрации пользовательских маршрутов. Надеюсь, это поможет!

hwl hwl
15 июн. 2017 г. 19:30:42
0

Вы можете использовать register_meta для регистрации метаполя и сделать его доступным в REST API:

\register_meta(
    'user',
    'collapsed_widgets',
    [
        'show_in_rest' => true,
        'single' => true,
        'type' => 'array',
    ]
);

Таким образом вы также сможете обновлять метаполе через REST API.

27 авг. 2023 г. 12:01:39