ฉันตั้งใจที่จะ จำกัด คำกริยา RESTUL ต่อประเภทโพสต์ที่กำหนดเอง ตัวอย่างเช่นเนื่องจากโพสต์ประเภทคำศัพท์ที่กำหนดเองฉันอยากจะบอกว่า:
เมทริกซ์การอนุญาต
+-------+---+----------+
|index | X | GET |
|show | O | GET |
|create | X | POST |
|update | X | PATCH/PUT|
|delete | X | DELETE |
+-------+---+----------+
ดูเหมือนว่า V2 จะไม่ให้ระดับการควบคุมนั้น ฉันผ่านแหล่งที่มาและจากสิ่งที่ฉันเห็นไม่มีตะขอ / ตัวกรองใด ๆ ให้แตะเพื่อเปลี่ยนการอนุญาต
โซลูชันปัจจุบันของฉันมีดังต่อไปนี้ มันประนีประนอมของชั้นเรียนที่คุณสามารถโหลดในเมทริกซ์ของประเภทโพสต์ที่กำหนดเองกับการกระทำที่ได้รับอนุญาต สิ่งนี้สามารถเรียกได้ในrest_prepare_vocabulary
ตัวกรองทำลายการตอบสนองหากสิทธิ์ไม่เข้าแถว
ปัญหา
ฉันไม่รู้สึกว่านี่เป็นทางออกที่สมเหตุสมผล หมายความว่าสิทธิ์ได้รับการแก้ไขในสองจุด (หนึ่งในแกนเนื่องจากยังคงใช้อยู่) และในตัวกรองของฉัน
จะเป็นการดีที่มันจะอยู่ในระดับการกำหนดค่ากล่าวคือกำหนดประเภทโพสต์ที่กำหนดเอง
ในคำอื่น ๆ ฉันชอบที่จะผ่านในกฎ (ตามสายของexclude_from_search
, publicly_queryable
ฯลฯ ) มากกว่าการดำเนินการแบบสอบถามโพสต์ "บุคคลที่ไม่สำคัญ"
โซลูชันปัจจุบัน (ใช้งานได้ แต่ไม่ต้องการ)
Access.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]);
}
}
functions.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;
};
\App
และ การเข้าถึงเป็นจริง\App\Services\Access
Access
ในขอบเขตทั่วโลก? คุณต้องการที่อื่นไหม? ในกรณีที่คุณตอบคำถามด้วยใช่คุณอาจต้องการแนบกับตัวกรองแทน