WP REST API V2 – добавление данных пользователя в ответ

Я пытаюсь получить имя и wp-json/wp/v2/users/1 ответе wp-json/wp/v2/users/1 , все эти детали отсутствуют, так как я переключился на v2.

Я пытался:

 function mm_wpapiv2_user_first_name($object, $field_name, $request) { return "Test"; } register_rest_field( 'user', 'first_name', array('get_callback' => 'mm_wpapiv2_user_first_name') ); 

но поле не добавляется к ответу. Пожалуйста помоги!

Решение A – Подготовьте ответ пользователя

Вы можете отфильтровать ответ для пользователя, чтобы включить любое свойство, которое вы хотите, с помощью rest_prepare_user .

 add_filter( 'rest_prepare_user', function( $response, $user, $request ) { $response->data[ 'first_name' ] = get_user_meta( $user->ID, 'first_name', true ); $response->data[ 'last_name' ] = get_user_meta( $user->ID, 'last_name', true ); return $response; }, 10, 3 ); 

Решение B – Схема обновления

Другой способ – не только использовать регистр в поле «Остальное», но и обновить контекст, который будет общедоступным для существующих скрытых элементов.

 /** * Return field data for User * * @param array $object * @param string $field_name * @param WP_REST_Request $request * * @return string */ function get_rest_api_field_data( $object, $field_name, $request ) { switch ( $field_name ) { case 'first_name' : return get_user_meta( $object[ 'id' ], 'first_name', true ); case 'last_name' : return get_user_meta( $object[ 'id' ], 'last_name', true ); } } /** * Register fields for User */ function add_custom_rest_fields_for_users() { // register the First Name of the User -- Visible to anyone register_rest_field( 'user', 'first_name', array ( 'get_callback' => 'get_rest_api_field_data', 'update_callback' => null, 'schema' => array ( 'description' => __( 'First name for the resource.' ), 'type' => 'string', 'context' => array ( 'embed', 'view', 'edit' ), // Adding `embed` and `view` 'arg_options' => array ( 'sanitize_callback' => 'sanitize_text_field', ), ), ) ); // register the Last Name of the User -- Visible to anyone register_rest_field( 'user', 'last_name', array ( 'get_callback' => 'get_rest_api_field_data', 'update_callback' => null, 'schema' => array ( 'description' => __( 'Last name for the resource.' ), 'type' => 'string', 'context' => array ( 'embed', 'view', 'edit' ), // Adding `embed` and `view` 'arg_options' => array ( 'sanitize_callback' => 'sanitize_text_field', ), ), ) ); } add_action( 'rest_api_init', 'add_custom_rest_fields_for_users' ); 

Дополнительная информация

Первоначальный ответ был создан непосредственно перед тем, как был вызван фильтр. Как вы видите в prepare_item_for_response() , $schema['properties'] проверяется перед добавлением first_name или last_name .

 if ( ! empty( $schema['properties']['first_name'] ) ) { $data['first_name'] = $user->first_name; } if ( ! empty( $schema['properties']['last_name'] ) ) { $data['last_name'] = $user->last_name; } 

В get_item_schema () вы можете увидеть, как была создана эта схема – стоит отметить отсутствующие 'embed', 'view' поэтому они не отображаются без аутентификации и в более уникальных условиях .

 $schema = array( '$schema' => 'http://json-schema.org/draft-04/schema#', 'title' => 'user', 'type' => 'object', 'properties' => array( 'id' => array( 'description' => __( 'Unique identifier for the resource.' ), 'type' => 'integer', 'context' => array( 'embed', 'view', 'edit' ), 'readonly' => true, ), 'username' => array( 'description' => __( 'Login name for the resource.' ), 'type' => 'string', 'context' => array( 'edit' ), 'required' => true, 'arg_options' => array( 'sanitize_callback' => 'sanitize_user', ), ), 'name' => array( 'description' => __( 'Display name for the resource.' ), 'type' => 'string', 'context' => array( 'embed', 'view', 'edit' ), 'arg_options' => array( 'sanitize_callback' => 'sanitize_text_field', ), ), 'first_name' => array( 'description' => __( 'First name for the resource.' ), 'type' => 'string', 'context' => array( 'edit' ), 'arg_options' => array( 'sanitize_callback' => 'sanitize_text_field', ), ), 'last_name' => array( 'description' => __( 'Last name for the resource.' ), 'type' => 'string', 'context' => array( 'edit' ), 'arg_options' => array( 'sanitize_callback' => 'sanitize_text_field', ), ), 

Справка