Как в 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 сайтом проблемы? нужен дополнительный функционал? нестандартный плагин или сверстать новую страницу?
Тогда напишите мне через форму обратной связи, и я постараюсь вам помочь.

Оставить комментарий

Ваш адрес email не будет опубликован.