Empfohlene Methode zum Entfernen der WP-REST-API zurückgegebene Daten für benutzerdefinierten Post

Ich habe nach dem richtigen Weg gesucht, um die zurückgegebenen Antworten für einen benutzerdefinierten Beitragstyp zu ändern. Ich habe einen Weg gefunden, dies zu tun, aber die offizielle Dokumentation entmutigt diese Methode.

Ich persönlich denke nicht, dass es von Bedeutung wäre, da es ein benutzerdefinierter Post-Typ ist, dass nur der Teil der Anwendung, mit dem ich gebaut habe, mit ihm interagiert, aber ich würde es trotzdem gerne richtig machen.

WordPress schlägt vor, dass ein benutzerdefinierter Kontext erstellt wird, bevor die Daten aus der Antwort entfernt werden, aber ich kann keine Dokumentation finden, die zeigt, wie dies zu tun ist. Kann mir jemand in die richtige Richtung zeigen?

Ich weiß, dass sie diese Praxis stark ablehnen, aber ich bekomme über 20 Felder, die Arrays und Objekte enthalten, wenn ich nur 5/6 brauche. Ich bin sicher, dass es einen großen Unterschied in der Geschwindigkeit und Reaktionsfähigkeit der Anwendung machen wird.

Solutions Collecting From Web of "Empfohlene Methode zum Entfernen der WP-REST-API zurückgegebene Daten für benutzerdefinierten Post"

Während die Dokumente sagen :

Beachten Sie, dass die API Sie nicht daran hindern kann, die Antworten zu ändern, aber der Code ist so strukturiert, dass dies stark davon abgehalten wird. Intern wird die Feldregistrierung durch Filter gesteuert , und diese können verwendet werden, wenn Sie absolut keine andere Wahl haben.

In den meisten Fällen gibt es eine andere Wahl, nämlich benutzerdefinierte Endpunkte / Routen .

Sie können dem CPT sogar eine Ruhe-Controller-class zuweisen. Sie können also WP_Rest_Posts_Controller erweitern und benutzerdefinierte Endpunkte, ihre Routen , Parameter und die entsprechenden Callbacks so einstellen , dass sie mit allem, was Sie benötigen, reagieren.

Die Schritte sind:

  1. rest_controller_class für benutzerdefinierten rest_controller_class (CPT) rest_controller_class
  2. Extend WP_REST_Controller oder WP_REST_Posts_Controller
  3. Registrieren Sie Routen und definieren Sie Methoden
  4. Möglicherweise steuern Sie das Antwortformat mit Schema

Hinweis: WP_REST_Posts_Controller selbst erweitert WP_REST_Controller .

Argument rest_controller_class für CPT setzen:

1) Im Array $args während der Registrierung:

  $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) Um nach der Registrierung von CPT hinzuzufügen, verwenden Sie den Filter Hook: 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' ); 

Erweitern von WP_REST_Controller für benutzerdefinierte Endpunkt (e) / Route (s):

Ein schnelles Teilbeispiel als Ausgangspunkt (aus einer vorherigen Antwort )

  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 

Die WP_Rest_Request-class bietet mehrere Methoden zum Behandeln von $request .

Schema

Schauen Sie auch in Schema nach, um die Antworten zu erstellen .

Ich habe das prefix_get_comment() Beispiel unten auf dieser Seite hinzugefügt, da es ein einfaches Beispiel ist:

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