Содержимое
Продолжаем наш цикл статей по теме АПИ в ВП. Сегодня мы рассмотрим общие техники взаимодействия с API, которые можно будет использовать и как для кастомных пост-тайпов, так и категорий, и прочих терминов.
Чтение записей
Чтобы получить данные ендпоинта возвращающего список постов, нам нужно сделать запрос на адрес “http://мой-сайт/wp-json/wp/v2/posts/”. Данный запрос мы можем сделать несколькими способами:
- Используя стандартный набор функций WP для CRUL запросов (это по сути обертки над нативными ф-ми PHP curl). К таким ф-ям относятся “wp_remote_get”, “wp_remote_post”, “wp_remote_request”
- “curl_init” и остальны “curl_*” ее библиотеки
- “file_get_contents”, но только для GET запросов (самый простой и самый не гибкий вариант)
В наших примерах мы будем использовать wp remote функции. И для того чтобы получить список всех постов (с учетом пагинации) в JSON формате, нам нужно выполнить следующий код:
$url = 'http://мой-сайт/wp-json/wp/v2/posts/'; $response = wp_remote_get($url); $records = json_decode( wp_remote_retrieve_body($response), true ); echo '<strong>Code:</strong> ' . wp_remote_retrieve_response_code($response); echo '<br>'; echo '<strong>Message:</strong> ' . wp_remote_retrieve_response_message($response); echo '<br>'; echo '<strong>Records:</strong> ' . count($records); echo '<br>'; echo '<strong>Answer:</strong>'; echo"<pre>\$records = ";print_r($records);echo"</pre>"; die;
Фрагмент кода:
$response = wp_remote_get($url); $records = json_decode( wp_remote_retrieve_body($response), true );
обеспечивает запрос, и декодирование JSON данных в PHP массив.
Также мы отображаем дополнительную информацию по запросу:
echo '<strong>Code:</strong> ' . wp_remote_retrieve_response_code($response); echo '<br>'; echo '<strong>Message:</strong> ' . wp_remote_retrieve_response_message($response); echo '<br>'; echo '<strong>Records:</strong> ' . count($records); echo '<br>';
а именно:
- код ответа
- сообщение
- количество полученных постов
Как упоминалось в прошлой статье мы можем использовать фильтры в запросах. К примеру, мы можем получить данные определенных постов:
$response = wp_remote_get($url, [ 'body' => [ 'include' => [2579, 2570], ] ]);
Параметры для REST API запросов, практически идентичны параметрам get_posts() ф-и, но не всегда.
Фрагмент код:
$parameter_mappings = array( 'author' => 'author__in', 'author_exclude' => 'author__not_in', 'exclude' => 'post__not_in', 'include' => 'post__in', 'menu_order' => 'menu_order', 'offset' => 'offset', 'order' => 'order', 'orderby' => 'orderby', 'page' => 'paged', 'parent' => 'post_parent__in', 'parent_exclude' => 'post_parent__not_in', 'search' => 's', 'slug' => 'post_name__in', 'status' => 'post_status', );
где ключи - это API параметры, где их значения - это параметры объекта WP_Query.
Вы также можете получить данные поста по прямой ссылке, указав ID поста в URL, к примеру:
$url = 'http://мой-сайт/wp-json/wp/v2/posts/2579'; $response = wp_remote_get($url); $records = json_decode( wp_remote_retrieve_body($response), true ); echo"<pre>";print_r($records);echo"</pre>"; die;
Создание постов через REST API WordPress
Создание, редактирование и удаление постов, более серьезная операция чем чтение. И для ее выполнения нужны соответствующие права (административные, или права писателя). Т.е. грубо говоря, мы должны быть залогинены через API, и создавать данные от имени пользователя, с соответствующей ролью.
Одним из безопасных вариантов для авторизации посредством API в WordPress, будет использование плагина “JWT Authentication for WP REST API” (но на момент написании статьи, плагин обновлялся около года назад, а это не есть хорошо, хоть и загрузок +30т.), также в своей практике я использовал “Application Passwords”. Вариант рабочий, и намного проще в настройке чем первый.
Мы же, в текущих примерах будет использовать плагин “JSON Basic Authentication”, который можно найти на гитхабе. Это самый простой и менее надежный вариант авторизации по API посредством HTTP Basic аутентификации.
Данный плагин нам нужно установить на тот сайт, на котором будут создаваться посты посредством РЕСТ АПИ. Т.е. нам нужно будет два сайта. Один сайт на котором будут создаваться записи, второй сайт - который будет отправлять запросы.
Следующий PHP код, позволит отправить REST запрос на API для create post:
$url = 'http://мой-сайт/wp-json/wp/v2/posts/'; $username = 'admin'; $password = 'qweqwe'; $headers = [ 'Authorization' => 'Basic ' . base64_encode($username . ':' . $password), ]; $response = wp_remote_post($url, [ 'headers' => $headers, 'body' => [ 'title' => 'TEST TITLE #' . rand(0, 1000), 'content' => 'TEST CONTENT', 'status' => 'publish', ] ]); $records = json_decode(wp_remote_retrieve_body($response), true); echo"<pre>";print_r($records);echo"</pre>"; die;
Помимо отправки POST данных поста, нам также нужно будет отправить заголовок (header) с данными для аутонтификации (плагин “JSON Basic Authentication”, должен быть уже установлен). Данные поста, должны быть указаны в массиве “'body'”
Результатом ответа сервера, будет JSON объект только что созданного поста.
Редактирование постов через REST API WordPress
Код редактирования записи (update rest by api) ВП, практически идентичен созданию записи. Отличие лишь составляет URL на который отправляется запрос (см. первую строку):
$url = 'http://мой-сайт/wp-json/wp/v2/posts/2691'; $response = wp_remote_post($url, [ 'headers' => $headers, 'body' => [ 'title' => 'TEST TITLE (changed: '.date('Y-m-d H:i:s').')', ] ]); $records = json_decode(wp_remote_retrieve_body($response), true); echo"<pre>";print_r($records);echo"</pre>"; die;
URL должен заканчиваться на ID поста (в нашем случае это 2691), данные которого мы хотим обновить.
Данные в массиве “'body'”, мы можем указывать совершенно новые, WP их обновит.
Удаление постов через REST API WordPress
Удалить данные проще всего, для этого выполните запрос типа DELETE на URL с ID поста, по принципу редактирования поста:
$url = 'http://мой-сайт/wp-json/wp/v2/posts/2691'; $response = wp_remote_request($url, array( 'method' => 'DELETE', 'headers' => $headers, )); $records = json_decode(wp_remote_retrieve_body($response), true); echo"<pre>";print_r($records);echo"</pre>"; die;
Результатом ответа будут данные удаленного поста в JSON формате.