wake-up-neo.net

Empfohlene Methode zum Entfernen WP REST API gab Daten für benutzerdefinierten Beitrag zurück

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.

1
Courtney

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:

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

HINWEIS: WP_REST_Posts_Controller selbst erweitert WP_REST_Controller .

Festlegen des 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.

Schema

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