Продолжим разработку нашего плагина автокомплита постов. Сегодня разберем функционал 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/», это адрес сайта на который делается запрос.
На этом все. А код урока, можно найти в нашем репозитории по этой ссылке.
Список всех уроков темы
- Урок 1. Как самому написать плагин для WordPress
- Урок 2. Разработка шорткода для плагина WP Post Autocomplete
- Урок 3. Подключение стилей и JS скриптов к плагину автокомлпита постов
- Урок 4. Работа с Ajax в плагине автокомплита постов
- Урок 5. Подключение jQuery Autocomplete к плагину автокомплита постов
- Урок 6. Вывод списка постов на страницу и пагинация