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.
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.
là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:
rest_controller_class
pour le type de publication personnalisé (CPT)Extend WP_REST_Controller
ou WP_REST_Posts_Controller
REMARQUE: WP_REST_Posts_Controller
lui-même s'étend WP_REST_Controller
.
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' );
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
.
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;
}