Продолжаем разбирать тему кастомных Ендпонитов с доступом к ним по API ключу. Сегодня рассмотрим пример сохранения данных в БД и проверки ключа перед сохранением.
Полный пример кода ниже:
<?php add_action('rest_api_init', function() { /** * Save */ register_rest_route('app/v1', 'post', [ 'methods' => WP_REST_Server::CREATABLE, '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_id = wp_insert_post([ 'post_type' => 'fruit', 'post_title' => wp_strip_all_tags( $Request -> get_param('post_title') ), 'post_content' => $Request -> get_param('post_content'), 'post_status' => 'publish', ]); return get_post( $post_id ); }, 'args' => [ 'key' => [ 'description' => 'API KEY', 'type'=> 'string', 'required' => true, ], 'post_title' => [ 'description' => 'Post title', 'type'=> 'string', 'required' => true, ], 'post_content' => [ 'description' => 'Post content', 'type'=> 'string', 'required' => true, ], ] ]); });
Для проверки работоспособности кода, используйте следующий запрос/ссылку - “адрес.сайта/wp-json/app/v1/post?key=123qwe&post_title=Апельсин&post_content=Апельсин — самая распространённая цитрусовая культура во всех тропических и субтропических областях мира”.
В качестве ПО я использую “Postman” (облегчает работу). Метод запроса - POST. Сам URL просто вставьте в строку запроса и кликните по кнопке “Send” справа от самого запроса (в светлой теме ПО, кнопка голубая). Предварительно, вставьте выше приведенный код в файл functions.php вашей темы, иначе работать не будет.
Давайте разобьем наш URL на части, где:
key - ключ запроса
post_title - название поста
post_content - содержимое поста
Все эти поля обязательные, т.к. мы указали во всех них ключ “required” равные TRUE:
'args' => [ 'key' => [ 'description' => 'API KEY', 'type'=> 'string', 'required' => true, ], 'post_title' => [ 'description' => 'Post title', 'type'=> 'string', 'required' => true, ], 'post_content' => [ 'description' => 'Post content', 'type'=> 'string', 'required' => true, ], ]
Как и в предыдущем примере (когда мы получали данные), проверка выполняется в колбэке “permission_callback”:
'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; },
в обычном условии IF мы сравниваем значение POST переменной KEY с ключом равным “123qwe”. Значение ключа, рекомендуется сохранять в БД или выносить в отдельный конфигурационный файл.
Сохранение данных в БД, осуществляется в функции под колбэком “callback”:
'callback' => function(WP_REST_Request $Request) { $post_id = wp_insert_post([ 'post_type' => 'fruit', 'post_title' => wp_strip_all_tags( $Request -> get_param('post_title') ), 'post_content' => $Request -> get_param('post_content'), 'post_status' => 'publish', ]); return get_post( $post_id ); },
Здесь все достаточно просто. Вызываем WP функцию “wp_insert_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" }
Как видите, все довольно просто.