Як в WordPress читати, створювати, редагувати та видаляти дані постів за REST API

Як в WordPress читати, створювати, редагувати та видаляти дані постів за REST API

Продовжуємо наш цикл статей на тему 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-об'єкт із даними видаленого запису.

Пости на схожі теми

З вашим WordPress сайтом проблеми? потрібний додатковий функціонал? нестандартний плагін чи згорнути нову сторінку?
Тоді напишіть мені через форму зворотного зв'язку, і я намагатимусь вам допомогти.

Напишіть коментар

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *