Урок 4. Работа с Ajax в плагине автокомплита постов

Урок 4. Работа с Ajax в плагине автокомплита постов

Продолжим разработку нашего плагина автокомплита постов. Сегодня разберем функционал Ajax в движке WordPress. А именно — что, как и где подключать, как протестировать работу без реализованного фронтенда, и какие собственно запросы для этого нужно отправлять на сервер.

Перейдем к кодированию. Открываем наш пока что единственный рабочий файл проекта - «/wp-content/plugins/wp-post-autocomplete/wp-post-autocomplete.php». Помещаем курсор в конструктор класса «WpPostAutocomplete», и добавляем следующий код:

add_action('wp_ajax_autocomplete', array($this, 'ajax_autocomplete'));
add_action('wp_ajax_nopriv_autocomplete', array($this, 'ajax_autocomplete'));

В коде выше, используя ф-ю WP «add_action» добавили свой хук для обработки Аякс запросов. При этом важно, что бы теги/ключи хуков начинались на:
wp_ajax_ - для авторизированных пользователей сайта
wp_ajax_nopriv_ - для не авторизированных пользователей
И были уникальны для всего движка WP, что бы не перекрывали/перезаписывали хуки других плагинов, или не были сами перекрыты.

А далее, должен идти экшин (т. е. действие) которые мы отправляем POST/GET запросом с фронтенда или другого места в наш WordPress движок. В нашем случае, теги будут выглядеть таким образом:

add_action('wp_ajax_{autocomplete}');
add_action('wp_ajax_nopriv_{autocomplete}');

Где «{autocomplete}», это значение параметра «action», установленное через WP функцию «wp_localize_script» (см. предыдущий урок)

Вторым параметром в нашем хуке (add_action), идет функция/метод которая будет обрабатывать Ajax запрос. Реализация метода «ajax_autocomplete» приведена ниже:

public function ajax_autocomplete()
{
	try
	{
		$Posts = get_posts([
			'posts_per_page' => 10,
			's' => esc_sql(filter_input(INPUT_POST, 'text', FILTER_SANITIZE_STRING)),
		]);

		$array = [];
		foreach($Posts as $Post)
		{
			$array[] = [
				'title' => $Post -> post_title,
				'link' => get_permalink($Post -> ID),
			];
		}

		wp_send_json_success($array);			
	}
	catch (Exception $ex)
	{
		wp_send_json_error(array(
			'message' => 'Не удалось обработать запрос',
		));
	}
}

Детальнее о коде выше. Получаем текст искомого содержимого:

filter_input(INPUT_POST, 'text', FILTER_SANITIZE_STRING)

Используя функцию ядра вордпресса get_posts, получаем искомые посты с ограничением в 10 записей. При этом, выполняем поиск как по заголовку так и по контенту записей:

$Posts = get_posts([
	'posts_per_page' => 10,
	's' => esc_sql(filter_input(INPUT_POST, 'text', FILTER_SANITIZE_STRING)),
]);

Формируем массив данных для отправки в front-end:

$array = [];
foreach($Posts as $Post)
{
	$array[] = [
		'title' => $Post -> post_title,
		'link' => get_permalink($Post -> ID),
	];
}

И отправляем их:

wp_send_json_success($array);

А вот в случае возникновения исключения, отправляем пользователю ошибку:

wp_send_json_error(array(
	'message' => 'Не удалось обработать запрос',
));

Обратите внимание, мы можем немного усовершенствовать наш код, отправляя дополнительное уведомление если искомые записи найдены не были. Но т. к. наш плагин достаточно примитивен это мы реализовывать не будет.

Тестирование

Если бы мы сперва реализовали фронтенд, то для тестирования мы бы использовали форму с отправкой аякс запроса и консоль браузера. Но т. к. данный функционал будет рассмотрен в следующем уроке. Мы будем использовать консоль и утилиту CRUL. Если последняя не установлена на вашем компьютере, то установите ее. А для тестирования используйте следующие команды:

curl -d "action=autocomplete&text=это" -X POST http://wordpress.l/wp-admin/admin-ajax.php

или

curl -d "action=autocomplete&text=это" -X POST http://wordpress.l/wp-admin/admin-ajax.php | json_pp

Первая команда от второй отличается наличием «json_pp», это доп. утилита позволяющая красиво отобразить ответ.



Где «http://wordpress.l/», это адрес сайта на который делается запрос.

На этом все. А код урока, можно найти в нашем репозитории по этой ссылке.

Урок 4. Работа с Ajax в плагине автокомплита постов
Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *