web-dev-qa-db-fra.com

Méthode recommandée pour supprimer WP REST L'API a renvoyé des données pour un message personnalisé

Je cherchais le moyen approprié pour modifier les réponses renvoyées pour un type de publication personnalisé. J'ai trouvé un moyen de le faire mais la documentation officielle décourage cette méthode.

Personnellement, je ne pense pas que ce soit important, car c’est un type de publication personnalisé qui n’interagit qu’avec la partie de l’application que j’ai construite mais j’aimerais tout de même le faire correctement.

Wordpress suggère qu'un contexte personnalisé soit créé avant de supprimer les données de la réponse, mais je ne trouve aucune documentation qui montre comment procéder. Quelqu'un peut-il me diriger dans la bonne direction pour le faire.

Je sais qu’ils découragent vivement cette pratique, mais j’obtiens plus de 20 champs qui incluent des tableaux et des objets lorsque je n’en ai besoin que de 5/6 d’entre eux. Je suis sûr que cela fera une grande différence dans la rapidité et la réactivité de l'application.

1
Courtney

Alors que les docs indiquent :

Notez que l'API ne peut pas vous empêcher de modifier les réponses, mais le code est structuré de manière à décourager fortement cela. En interne, l'enregistrement des champs est alimenté par des filtres et ils peuvent être utilisés si vous n'avez absolument aucun autre choix.

ESTun autre choix dans la plupart des cas, à savoir: points de terminaison personnalisés/routes .

Vous pouvez même affecter une classe de contrôleur de repos au CPT. Vous pouvez donc étendre WP_Rest_Posts_Controller et définir des points de terminaison personnalisés, leurs itinéraires , des paramètres et les rappels correspondants pour répondre à tous vos besoins.

Les étapes impliquées sont:

  1. définir rest_controller_class pour le type de publication personnalisé (CPT)
  2. Extend WP_REST_Controller ou WP_REST_Posts_Controller
  3. Enregistrer des itinéraires et définir des méthodes
  4. Peut-être contrôler le format de réponse avec Schema

REMARQUE: WP_REST_Posts_Controller lui-même s'étend WP_REST_Controller .

Définition de l'argument rest_controller_class pour CPT:

1) Dans le tableau $args lors de l’enregistrement:

    $labels = array( ... );
    $args = array(
                'labels'                => $labels,
                ...
                ...
                'show_in_rest'          => true,
                'rest_base'             => 'my_rest_base',
              //'rest_controller_class' => 'WP_REST_Posts_Controller',
                'rest_controller_class' => 'My_CPT_Controller_Class'
              );
    register_post_type( 'my-post-type', $args );

2) Pour ajouter après l'enregistrement du CPT, utilisez le crochet de filtre: register_post_type_args

function add_rest_stuff( $args, $post_type ) {
    $custom_post_type = 'my-post-type';

    if ( $post_type !== $custom_post_type ) {
     return $args;
    }

    $args['show_in_rest'] = true;
    $args['rest_base'] = 'my_rest_base';
    $args['rest_controller_class'] = 'My_CPT_Controller_Class';

    return $args;
}
add_filter('register_post_type_args', 'make_it_public' ); 

Extension du WP_REST_Controller pour le ou les points de terminaison/itinéraires personnalisés:

Un exemple partiel rapide comme point de départ (à partir d'un réponse précédente )

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

    // so, site.com/wp-json/my-fancy-namespace/v1/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';
    // so, site.com/wp-json/my-fancy-namespace/v1/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() {
          //do permissions check stuff
       }

       public function my_get_callback( WP_REST_Request $request ) {

            //do stuff with $request 
           //see the methods mentioned below
        }//end 
    }//end class

La classe WP_Rest_Request fournit plusieurs méthodes pour traiter $request.

Schéma

Regardez aussi dans Schéma pour construire les réponses.

J'ai ajouté l'exemple prefix_get_comment() au bas de la page car il s'agit d'un exemple simple:

function prefix_register_my_comment_route() {
    register_rest_route( 'my-namespace/v1', '/comments', array(
        // Notice how we are registering multiple endpoints the 'schema' equates to an OPTIONS request.
        array(
            'methods'  => 'GET',
            'callback' => 'prefix_get_comment_sample',
        ),
        // Register our schema callback.
        'schema' => 'prefix_get_comment_schema',
    ) );
}
/**
 * Get our sample schema for comments.
 */
function prefix_get_comment_schema() {
    $schema = array(
        // This tells the spec of JSON Schema we are using which is draft 4.
        '$schema'              => 'http://json-schema.org/draft-04/schema#',
        // The title property marks the identity of the resource.
        'title'                => 'comment',
        'type'                 => 'object',
        // In JSON Schema you can specify object properties in the properties attribute.
        'properties'           => array(
            'id' => array(
                'description'  => esc_html__( 'Unique identifier for the object.', 'my-textdomain' ),
                'type'         => 'integer',
                'context'      => array( 'view', 'edit', 'embed' ),
                'readonly'     => true,
            ),
            'author' => array(
                'description'  => esc_html__( 'The id of the user object, if author was a user.', 'my-textdomain' ),
                'type'         => 'integer',
            ),
            'content' => array(
                'description'  => esc_html__( 'The content for the object.', 'my-textdomain' ),
                'type'         => 'string',
            ),
        ),
    );

    return $schema;
} 
0
hwl