Сегодня будет завершающая статья из цикла кастомных Endpoint`ов и доступа к ним по АПИ ключу. В качестве примера, рассмотрим ситуацию когда нам нужно удалить данные из БД по ID поста с предварительной проверкой данных.
Код примера ниже:
<?php add_action('rest_api_init', function() { /** * Delete */ register_rest_route('app/v1', 'delete', [ 'methods' => WP_REST_Server::DELETABLE, 'permission_callback' => function(WP_REST_Request $Request) { if($Request -> get_param('key') != '123qwe') { return new WP_Error('key', 'API KEY is wrong', [ 'status' => 400 ]); } return true; }, 'callback' => function(WP_REST_Request $Request) { $Post = get_post( $Request -> get_param('post_id') ); if(is_a($Post, 'WP_Post')) { return wp_delete_post($Post -> ID); } return false; }, 'args' => [ 'key' => [ 'description' => 'API KEY', 'type'=> 'string', 'required' => true, ], 'post_id' => [ 'description' => 'Post ID', 'type'=> 'integer', 'required' => true, ], ] ]); });
В качестве запроса, можете использовать следующий URL - “адрес.сайта/wp-json/app/v1/delete?key=123qwe&post_id=59”. При этом, метод запроса в ф-и “register_rest_route”, должен быть “DELETE” (или используйте константу WP_REST_Server::DELETABLE).
Оба параметра key и post_id являются обязательными:
'args' => [ 'key' => [ 'description' => 'API KEY', 'type'=> 'string', 'required' => true, ], 'post_id' => [ 'description' => 'Post ID', 'type'=> 'integer', 'required' => true, ], ]
Об этом, нам “говорят” ключи required равные TRUE.
В примере с удалением данных поста, я решил обойтись проверкой лишь одного API KEY:
'permission_callback' => function(WP_REST_Request $Request) { if($Request -> get_param('key') != '123qwe') { return new WP_Error('key', 'API KEY is wrong', [ 'status' => 400 ]); } return true; },
Т.к. проверку на наличие поста в БД мы выполним перед удалением данных, проверив есть ли пост с указанным ID в нашей базе, и если есть, удалим его:
'callback' => function(WP_REST_Request $Request) { $Post = get_post( $Request -> get_param('post_id') ); if(is_a($Post, 'WP_Post')) { return wp_delete_post($Post -> ID); } return false; },
После удаления WP функция wp_delete_post вернет данные удаленного поста в виде объекта, а мы вернем его в качестве ответа в виде JSON объекта:
{ "ID": 57, "post_author": "0", "post_date": "2020-12-12 16:01:58", "post_date_gmt": "2020-12-12 13:01:58", "post_content": "Апельсин — самая распространённая цитрусовая культура во всех тропических и субтропических областях мира", "post_title": "Апельсин", "post_excerpt": "", "post_status": "publish", "comment_status": "closed", "ping_status": "closed", "post_password": "", "post_name": "apelsin", "to_ping": "", "pinged": "", "post_modified": "2020-12-12 16:01:58", "post_modified_gmt": "2020-12-12 13:01:58", "post_content_filtered": "", "post_parent": 0, "guid": "адрес.сайта/fruit/apelsin/", "menu_order": 0, "post_type": "fruit", "post_mime_type": "", "comment_count": "0", "filter": "raw" }
На этом все, хотя тема REST API в WordPress еще до конца не раскрыта.