Ich habe nach der richtigen Methode 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 rät von dieser Methode ab.
Ich persönlich denke nicht, dass es wichtig wäre, da es sich um einen benutzerdefinierten Beitragstyp handelt, mit dem nur der Teil der Anwendung interagiert, den ich erstellt habe, aber ich würde es trotzdem gerne auf die richtige Weise tun.
Wordpress schlägt vor, dass ein benutzerdefinierter Kontext erstellt wird, bevor Daten aus der Antwort entfernt werden. Ich kann jedoch keine Dokumentation finden, die diesbezüglich Aufschluss gibt. Kann jemand mich in die richtige Richtung weisen, um dies zu tun.
Ich weiß, dass sie von dieser Praxis stark abraten, aber ich bekomme über 20 Felder, die Arrays und Objekte enthalten, wenn ich nur etwa 5/6 davon benötige. Ich bin sicher, es wird einen großen Unterschied in der Geschwindigkeit und Reaktionsfähigkeit der Anwendung machen.
Während der docs state :
Beachten Sie, dass die API Sie nicht daran hindern kann, Antworten zu ändern, der Code jedoch so strukturiert ist, dass dies dringend verhindert wird. Intern wird die Feldregistrierung von Filtern angetrieben und diese können verwendet werden, wenn Sie absolut keine andere Wahl haben.
es gibtISTeine andere Wahl für die meisten Fälle, nämlich: benutzerdefinierte Endpunkte/Routen .
Sie können dem CPT sogar eine Restcontrollerklasse zuweisen. Sie können also WP_Rest_Posts_Controller erweitern und benutzerdefinierte Endpunkte, ihre Routen , Parameter und die entsprechenden Rückrufe festlegen, um mit den gewünschten Informationen zu antworten.
Die damit verbundenen Schritte sind:
rest_controller_class
für benutzerdefinierten Beitragstyp (CPT) festlegenExtend WP_REST_Controller
oder WP_REST_Posts_Controller
HINWEIS: WP_REST_Posts_Controller
selbst erweitert WP_REST_Controller
.
rest_controller_class
-Arguments für CPT:1) In $args
array 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) Verwenden Sie zum Hinzufügen nach der Registrierung von CPT 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' );
WP_REST_Controller
für benutzerdefinierte Endpunkte/Routen erweitern:Ein kurzes Teilbeispiel als Ausgangspunkt (von 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 Klasse WP_Rest_Request bietet verschiedene Methoden für den Umgang mit $request
.
Schauen Sie sich auch Schema an, 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;
}