Mit Rest V2 (WP4.7) wie schränkt man bestimmte RESTFUL-Verben ein?

Ich beabsichtige, bestimmte RESTUL-Verben auf jeden benutzerdefinierten Post-Typ zu beschränken. Zum Beispiel würde ich bei einem benutzerdefinierten Beitragstyp für Vokabeln sagen:

Berechtigungsmatrix

+-------+---+----------+ |index | X | GET | |show | O | GET | |create | X | POST | |update | X | PATCH/PUT| |delete | X | DELETE | +-------+---+----------+ 

Die V2 scheint diese Kontrollebene nicht zu bieten. Ich habe die Quelle durchsucht, und von dem, was ich sehen kann, gibt es keine Haken / Filter, um die Berechtigungen zu ändern.

Meine derzeitige Lösung ist die folgende. Es kompromittiert eine class, in der Sie eine Matrix von benutzerdefinierten Post-Typen gegen zulässige Aktionen laden können. Dies kann dann im rest_prepare_vocabulary Filter rest_prepare_vocabulary werden, wobei die Antwort zerstört wird, wenn die Berechtigungen nicht rest_prepare_vocabulary .

Problem

Ich habe nicht das Gefühl, dass dies eine vernünftige Lösung ist. Das bedeutet, dass Berechtigungen an zwei Stellen (einmal im core, da sie noch angewendet werden) und in meinen Filtern aufgetriggers werden.

Im Idealfall wäre es auf einer Konfigurationsebene, nämlich wo die benutzerdefinierten Post-Typen definiert sind.

Mit anderen Worten, ich würde es vorziehen, Regeln (im Sinne von “exclude_from_search”, “public_queryable” usw.) zu übergeben, anstatt eine Post-Abfrage “snip” auszuführen.

Aktuelle Lösung (funktioniert aber nicht wünschenswert)

Zugriff.php

 class Access { function __construct($permissions) { $this->permissions = $permissions; } protected function hasId($request) { return ! is_null($request->get_param('id')); } protected function resolveType($request) { $method = strtoupper($request->get_method()); if($method === 'GET' && $this->hasId($request)) { return 'show'; } else if($method === 'GET') { return 'index'; } else if($method === 'DELETE') { return 'delete'; } else if($method === 'POST') { return 'create'; } else if($method === 'PATCH') { return 'update'; } } function validate($type, $request) { return in_array($this->resolveType($request), $this->permissions[$type]); } } 

functionen.php

 // bootstrap the permissions for this particular // application // $access = new Access([ 'vocabulary' => ['show'], ]); add_filter('rest_prepare_vocabulary', 'validate_permissions', 30, 3); function validate_permissions($response, $post, $request) { global $access; // Give access->validate the type + request data // and it will figure out if this is allowed // if( ! $access->validate($post->post_type, $request)) { $response->set_data([]); $response->set_status(403); } return $response; }; 

Solutions Collecting From Web of "Mit Rest V2 (WP4.7) wie schränkt man bestimmte RESTFUL-Verben ein?"

Ich habe die Quelle durchsucht, und von dem, was ich sehen kann, gibt es keine Haken / Filter, um die Berechtigungen zu ändern.

Mein Verständnis ist, dass dies eine absichtliche Designentscheidung war.

Obwohl die REST-API so erstellt wurde, dass sie erweiterbar ist, wird es nicht empfohlen, Core-Endpunkte in der von Ihnen gewünschten Weise zu ändern.

In diesem Abschnitt des REST-API-Handbuchs sind einige wenige Informationen verfügbar, aber der core davon ist, dass mit zunehmendem Alter der API mehr Code (unabhängig davon, ob es sich um einen core oder eine Drittpartei handelt) davon abhängt, welche Aktionen verfügbar sind und einen Standard bereitstellen Antworten.

Stattdessen sollten Sie einen benutzerdefinierten Controller erstellen.

Für benutzerdefinierte Post-Typen kann ein benutzerdefinierter Controller angegeben werden, indem ein classnname im rest_controller_class Argument für register_post_type() .

Eine Übersicht darüber, wie benutzerdefinierte Controller funktionieren sollten, finden Sie im REST-API-Handbuch .

Wenn Sie einen benutzerdefinierten Controller erstellen, der die abstrakte WP_REST_Controller class für einen WP_REST_Controller , der Revisionen unterstützt, erweitert, wird automatisch eine Anzahl von WP_REST_Controller Revisionsendpunkten erstellt.

Wenn die class WP_REST_Controller nicht erweitert wird, wird die Methode register_routes() nicht aufgerufen, sodass Sie Ihre benutzerdefinierten Routen manuell registrieren müssen.