Як за REST API WordPress завантажити зображення в медіа менеджер

Як за REST API WordPress завантажити зображення в медіа менеджер

Вітаю. У сьогоднішній статті ми розглянемо завантаження зображень до медіа-менеджера WordPress за допомогою API, використовуючи його core-функції.
Сьогодні ми трохи ускладнимо собі завдання — використаємо крон. Адже наш код повинен виконуватись за розкладом з періодичністю в 10 секунд.
Почнемо. Спершу створимо власний інтервал для крона. Для цього у WordPress існує спеціальний фільтр “cron_schedules”:

add_filter('cron_schedules', function ($schedules)
{
	$schedules['10sec'] = [
		'interval' => 10,
		'display'  => __('Every 10 sec'),
	];
	return $schedules;
});

У нашому випадку ми додаємо до змінної “$schedules” ще один масив, ключем якого буде наш інтервал. В ньому: “interval” — тривалість у секундах, “display” — назва інтервалу.

У прикладі нижче:

add_action('wp', function(){
	if(!wp_next_scheduled('rest_api_media'))
	{
		wp_schedule_event( time(), '10sec', 'rest_api_media');
	}
});

Ми викликаємо створений нами пізніше хук із періодичністю 10 секунд.
Функція WordPress “wp_next_scheduled('rest_api_media')” перевіряє, чи настав час виклику вказаного хука. Якщо так — викликаємо його за допомогою “wp_schedule_event” і встановлюємо мітку часу.

Основний код, що відповідає за upload зображень через API на наш або сторонній WordPress сайт:

add_action('rest_api_media', function ()
{
	$username = 'admin';
	$password = 'qweqwe';
	$headers = [
		'Authorization' => 'Basic ' . base64_encode($username . ':' . $password),
	];

	
	$url = мой-сайт/wp-json/wp/v2/media/';
	$file = __DIR__ . '/data/book.jpg';
	$headers['Content-Disposition'] = 'attachment; filename="' . basename($file) . '"';
	$response = wp_remote_post($url, [
		'headers' => $headers,
		'body' => file_get_contents($file)
	]);


	$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;
});

Завантаження зображень через API — це, на мою думку, одна з найскладніших частин роботи з REST API. Інформації з цього приводу в мережі дуже мало, а та що є — мені не допомогла.

Розглянемо код детальніше. На початку ми налаштовуємо заголовки для авторизації. Це важливо — без них ми не зможемо нічого надіслати.

Тут:

$url = мой-сайт/wp-json/wp/v2/media/';
$file = __DIR__ . '/data/book.jpg';
$headers['Content-Disposition'] = 'attachment; filename="' . basename($file) . '"';
$response = wp_remote_post($url, [
	'headers' => $headers,
	'body' => file_get_contents($file)
]);

Ми вказуємо URL сайту, на який буде завантажено файл.

У змінній “$file” — повний шлях до файлу.

Заголовок, що вказує назву завантажуваного файлу:

$headers['Content-Disposition'] = 'attachment; filename="' . basename($file) . '"';

Далі, за допомогою функції “wp_remote_post”, ми надсилаємо вміст файлу, записавши його до масиву “body”:

$response = wp_remote_post($url, [
	'headers' => $headers,
	'body' => file_get_contents($file)
]);

У відповідь REST API сайту поверне докладну інформацію про завантажений файл. Її можна переглянути за допомогою відлагоджувального коду нижче:

$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>";

Ось і все — завантаження зображення завершено.

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

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

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

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