Продовжуємо наш цикл статей на тему API у WordPress. Сьогодні розглянемо загальні техніки взаємодії з 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>';
а саме:
- код відповіді
- повідомлення
- кількість отриманих записів
Як згадувалося в попередній статті, ми можемо використовувати фільтри в запитах. Наприклад, отримати дані за певними ID постів:
$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” (хоча на момент написання статті він не оновлювався майже рік, незважаючи на 30K+ завантажень). У своїй практиці я також використовував “Application Passwords” — більш простий варіант.
У поточних прикладах ми використовуватимемо плагін “JSON Basic Authentication”, який доступний на GitHub. Це найпростіший, але менш безпечний спосіб авторизації через API за допомогою HTTP Basic Authentication.
Цей плагін потрібно встановити на сайт, на якому будуть створюватися записи через REST API. Тобто, нам потрібно два сайти: один — приймає запити і створює записи, другий — надсилає запити.
Наступний PHP-код дозволяє надіслати REST-запит для створення поста:
$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
Код редагування запису через 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' можна вказати нові значення — WordPress їх оновить.
Видалення постів через 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-об'єкт із даними видаленого запису.
