Продолжаем разбирать тему самостоятельно созданных Ендпоинтов в WordPress. Сегодня мы научимся обновлять данные в БД посредством API WP.
Полный код примера сегодняшнего урока:
<?php add_action('rest_api_init', function() { /** * Update */ register_rest_route('app/v1', 'update', [ 'methods' => WP_REST_Server::EDITABLE, 'permission_callback' => function(WP_REST_Request $Request) { if($Request -> get_param('key') != '123qwe') { return new WP_Error('key', 'API KEY is wrong', [ 'status' => 400 ]); } $Post = get_post( $Request -> get_param('post_id') ); return is_a($Post, 'WP_Post'); }, 'callback' => function(WP_REST_Request $Request) { $post_id = wp_update_post([ 'ID' => $Request -> get_param('post_id'), 'post_title' => wp_strip_all_tags( $Request -> get_param('post_title') ), 'post_content' => $Request -> get_param('post_content'), ]); return get_post( $post_id ); }, 'args' => [ 'key' => [ 'description' => 'API KEY', 'type'=> 'string', 'required' => true, ], 'post_id' => [ 'description' => 'Post ID', 'type'=> 'integer', 'required' => true, ], 'post_title' => [ 'description' => 'Post title', 'type'=> 'string', 'required' => true, ], 'post_content' => [ 'description' => 'Post content', 'type'=> 'string', 'required' => true, ], ] ]); });
В качестве теста, можете использовать следующий URL - “адрес.сайта/wp-json/app/v1/update?key=123qwe&post_id=59&post_title=Морковь&post_content=Морковь посевная — двулетнее растение, овощная культура, подвид вида морковь дикая.”. В запросе, не забудьте сменить домен “адрес.сайта” на ваш. В качестве по можно использовать “Postman”, CURL PHP или любой другой удобный вам способ.
Что касательно кода. В отличие от создания данных по АПИ, в текущем примере, нам нужно дополнительно передавать ID поста который мы хотим обновить. В нашем примере это параметр “post_id”, который является обязательным к заполнению:
'args' => [ 'key' => [ 'description' => 'API KEY', 'type'=> 'string', 'required' => true, ], 'post_id' => [ 'description' => 'Post ID', 'type'=> 'integer', 'required' => true, ], 'post_title' => [ 'description' => 'Post title', 'type'=> 'string', 'required' => true, ], 'post_content' => [ 'description' => 'Post content', 'type'=> 'string', 'required' => true, ], ]
в функции “register_rest_route” не забываем указывать метод запроса “POST”, ”PUT” или “PATCH”. Или WP константу WP_REST_Server::EDITABLE.
Так же, немного усложнилась проверка входных параметров:
'permission_callback' => function(WP_REST_Request $Request) { if($Request -> get_param('key') != '123qwe') { return new WP_Error('key', 'API KEY is wrong', [ 'status' => 400 ]); } $Post = get_post( $Request -> get_param('post_id') ); return is_a($Post, 'WP_Post'); },
Кромер проверки ключа, мы также проверяем наличие в БД записи, посредством функции “is_a” (т.е. если переменная $Post это объект типа WP_Post то возвращаем TRUE и продолжаем выполнение нашего API запроса. В противном случае, ф-я вернёт FALSE и прервет выполнение кода).
Основная логика приложения сосредоточена в калбэке:
'callback' => function(WP_REST_Request $Request) { $post_id = wp_update_post([ 'ID' => $Request -> get_param('post_id'), 'post_title' => wp_strip_all_tags( $Request -> get_param('post_title') ), 'post_content' => $Request -> get_param('post_content'), ]); return get_post( $post_id ); },
В нем, используя WP функцию “wp_update_post” обновляем данные поста согласно входным параметрам, и возвращаем JSON объект в качестве ответа.