Як у WordPress через REST API зберегти дані в БД використовуючи свій Endpoint та API KEY

Як у WordPress через REST API зберегти дані в БД використовуючи свій Endpoint та API KEY

Продовжуємо розбирати тему кастомних ендпоінтів з доступом до них за API ключем. Сьогодні розглянемо приклад збереження даних у БД та перевірки ключа перед збереженням.

Повний приклад коду нижче:

<?php
add_action('rest_api_init', function()
{
	/**
	 * Save
	 */
	register_rest_route('app/v1', 'post', [
		'methods' => WP_REST_Server::CREATABLE,
		'permission_callback' => function(WP_REST_Request $Request)
		{
			if($Request -> get_param('key') != '123qwe')
			{
				return new WP_Error('key', 'API KEY is wrong', [
					'status' => 400
				]);
			}

			return true;
		},
		'callback' => function(WP_REST_Request $Request)
		{
			$post_id = wp_insert_post([
				'post_type' => 'fruit',
				'post_title' => wp_strip_all_tags( $Request -> get_param('post_title') ),
				'post_content' => $Request -> get_param('post_content'),
				'post_status' => 'publish',
			]);
			
			return get_post( $post_id );
		},
		'args' => [
			'key' => [
				'description' => 'API KEY',
				'type'=> 'string',
				'required' => true,
			],
			'post_title' => [
				'description' => 'Post title',
				'type'=> 'string',
				'required' => true,
			],
			'post_content' => [
				'description' => 'Post content',
				'type'=> 'string',
				'required' => true,
			],
		]
	]);
});

Щоб перевірити працездатність коду, використовуйте наступний запит/посилання — “адреса.сайту/wp-json/app/v1/post?key=123qwe&post_title=Апельсин&post_content=Апельсин — самая распространённая цитрусовая культура во всех тропических и субтропических областях мира”.
Як програмне забезпечення я використовую “Postman” (полегшує роботу). Метод запиту — POST. Сам URL просто вставте в рядок запиту та натисніть кнопку “Send” праворуч від запиту (у світлій темі — блакитна кнопка). Попередньо вставте вищенаведений код у файл functions.php вашої теми, інакше нічого працювати не буде.

Давайте розберемо наш URL на частини, де:
key — ключ запиту
post_title — назва запису
post_content — вміст запису

Усі ці поля є обов’язковими, оскільки ми вказали для кожного параметра ключ “required” зі значенням TRUE:

'args' => [
	'key' => [
		'description' => 'API KEY',
		'type'=> 'string',
		'required' => true,
	],
	'post_title' => [
		'description' => 'Post title',
		'type'=> 'string',
		'required' => true,
	],
	'post_content' => [
		'description' => 'Post content',
		'type'=> 'string',
		'required' => true,
	],
]

Як і в попередньому прикладі (де ми отримували дані), перевірка виконується в колбеку “permission_callback”:

'permission_callback' => function(WP_REST_Request $Request)
{
	if($Request -> get_param('key') != '123qwe')
	{
		return new WP_Error('key', 'API KEY is wrong', [
			'status' => 400
		]);
	}

	return true;
},

У звичайній умові IF ми порівнюємо значення POST змінної KEY з ключем “123qwe”. Значення ключа рекомендується зберігати в БД або винести в окремий конфігураційний файл.

Збереження даних у БД виконується у функції під ключем “callback”:

'callback' => function(WP_REST_Request $Request)
{
	$post_id = wp_insert_post([
		'post_type' => 'fruit',
		'post_title' => wp_strip_all_tags( $Request -> get_param('post_title') ),
		'post_content' => $Request -> get_param('post_content'),
		'post_status' => 'publish',
	]);
	
	return get_post( $post_id );
},

Тут усе досить просто. Викликаємо WP-функцію “wp_insert_post” для додавання запису в БД, передаючи масив з необхідними параметрами. Після цього отримуємо дані з БД та повертаємо їх назад. На виході отримаємо JSON-об’єкт з даними запису.
Виглядатиме це приблизно так:

{
    "ID": 57,
    "post_author": "0",
    "post_date": "2020-12-12 16:01:58",
    "post_date_gmt": "2020-12-12 13:01:58",
    "post_content": "Апельсин - найпоширеніша цитрусова культура у всіх тропічних і субтропічних областях світу",
    "post_title": "Апельсин",
    "post_excerpt": "",
    "post_status": "publish",
    "comment_status": "closed",
    "ping_status": "closed",
    "post_password": "",
    "post_name": "apelsin",
    "to_ping": "",
    "pinged": "",
    "post_modified": "2020-12-12 16:01:58",
    "post_modified_gmt": "2020-12-12 13:01:58",
    "post_content_filtered": "",
    "post_parent": 0,
    "guid": "адреса.сайту/fruit/apelsin/",
    "menu_order": 0,
    "post_type": "fruit",
    "post_mime_type": "",
    "comment_count": "0",
    "filter": "raw"
}

Як бачите — все досить просто.

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

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

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

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