webentwicklung-frage-antwort-db.com.de

WP REST API V2 - Benutzerdaten zur Antwort hinzufügen

Ich versuche, den Vor- und Nachnamen des Benutzers in der Antwort wp-json/wp/v2/users/1 zu ermitteln. All diese Details fehlen, seit ich zu Version 2 gewechselt bin.

Ich habe versucht:

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

das Feld wird jedoch nicht zur Antwort hinzugefügt. Bitte helfen Sie!

1
adriand

Lösung A - Benutzerantwort vorbereiten

Sie können die Antwort für einen Benutzer filtern, um alle gewünschten Eigenschaften mit rest_prepare_user einzuschließen.

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

Lösung B - Schema aktualisieren

Eine andere Möglichkeit besteht darin, nicht nur das Restfeld zu registrieren sondern den Kontext so zu aktualisieren, dass er für vorhandene versteckte Objekte öffentlich sichtbar ist.

/**
 * 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' );

Zusatzinformation

Die ursprüngliche Antwort wurde unmittelbar vor dem Aufruf des Filters erstellt. Wie Sie in prepare_item_for_response() sehen, wird $schema['properties'] vor dem Hinzufügen von first_name oder last_name überprüft.

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

Unter get_item_schema () können Sie sehen, wie dieses Schema erstellt wurde - es lohnt sich, den fehlenden 'embed', 'view' zu notieren, weshalb diese nicht ohne Authentifizierung und unter eindeutigeren Bedingungen gerendert werden. .

$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',
            ),
        ),

Referenz

1
jgraup