Введение
На ajax запросах строится любое нормальное web приложение. Не использовать ajax запросы – моветон, ибо рано или поздно бесконечные перезагрузки страницы начинают бесить. А иногда без использования ajax-запроса просто невозможно выполнить задачу.
Написал для себя небольшой код, помогающий строить запросы WordPress максимально легко. Возможно поможет это поможет кому-то еще.
Пойдем по порядку PHP -> HTML -> JS -> CSS.
PHP обработчик
Для выполнения нужна верси php 7.0+;
Для начала напишем php функцию для обработки нашего запроса. Вот ее общий вид:
Будем использовать массив $actions, что бы положить в него сразу список функций – ajax обработичков, если нам потребуются дополнительные.
$actions = [ 'ajax_get_clients' ]; foreach ($actions as $action) { add_action('wp_ajax_' . $action, $action, 10, 1); add_action('wp_ajax_nopriv_' . $action, $action, 10, 1); } /** * AJAX handler * @return void */ function ajax_get_clients(){ $nonce = $_REQUEST['nonce'] ?? null; $data = $_REQUEST['data'] ?? null; if(!wp_verify_nonce($nonce, 'ajax')){ trigger_error('verify failed'); wp_send_json_error(); } // do something $result = true || false; if($result){ wp_send_json_success($result); } wp_send_json_error($result); }
Суть работы функции в том что нам поступает запрос, данные мы берем из глобальной переменной
$_REQUEST
или $_POST, $_GET если мы точно значем тип запроса.
Проверяем, что запрос пришел с нашего сервера, через wp_verify_nonce и отправляем ответ в JSON виде, с помощью специальной функции из ядра wp.
HTML
В этом блоке нам надо вывести кнопку, по которой будет отправляться запрос на сервер. Вывести ее можно в любом месте. Но для проверки мы выведем ее в Dashboard(Консоль администратора) WP.
Для этого нам снова потребуется создать виджет через PHP код.
add_action('wp_dashboard_setup', function () { if (!current_user_can('manage_options')) { return; } wp_add_dashboard_widget( 'ajax', __('AJAX', 'wp'), function () { ?> <button type="button" class="ajax button button-primary" data-action="ajax_get_clients" data-nonce="<?= wp_create_nonce('ajax') ?>"> Кнопка AJAX </button> <? } ); });
Создаем виджет через специальный экшен, проверяем права пользователя и выводим виджет с содержимым через неименованную функцию.
В содержимом выводится только кнопка. В ее data параметры пишем код серверной верификации и название экшена – ajax обработчика в php.
JS скрипт
Скрипт можно вывести отдельно, как положено через хук.
Но я предпочитаю по колхозному, сразу после кнопки в разрыв php кода.
Суть js простая, мы отслеживаем клик по кнопке с классом ‘ajax’ после этого добавляем класс ‘loading’
и выполняем запрос на сервер в PHP обработчик, который мы написали выше.
jQuery(document).ready(function ($) { $('.ajax').on('click', function (event) { // 1. прерываем возможный переход event.preventDefault(); let $this = $(this).removeClass('success').removeClass('error').addClass('loading'); // 2. Добавляем индифктаор загрузки // 3. Отправляем ajax-запрос на сайт. В параметр data можем еще что-то положить. $.ajax({ type: 'POST', url: '/admin-ajax.php', data: { 'action': $(this).data('action'), 'data': {}, // данные, которые нужно передать 'nonce': $(this).data('nonce') }, success: function (response) { console.log('ajax', response); if (response.success) { $this.removeClass('loading').addClass('success'); } else { $this.removeClass('loading').addClass('error'); } }, }); }); });
Стоит отметить, что в данном примере не прописан вариант сценария с некорректным ответом самого сервера, предполагается, что сервер отдаст 200 ответ.
CSS оформление
@keyframes spin { 0% { transform: rotate(0deg); } 100% { -webkit-transform: rotate(-360deg); -ms-transform: rotate(-360deg); transform: rotate(-360deg); } } .ajax::before { font-family: dashicons; display: inline-block; vertical-align: middle; transition: 0.5s; background-size: contain; font-size: 18px; line-height: 1; margin-right: 2px; } .ajax.loading::before { content: "\f113"; -webkit-animation: spin 3s linear infinite; animation: spin 3s linear infinite; } .ajax.error::before { content: "\f335"; } .ajax.success::before { content: "\f147"; }
Добавим индикацию загрузки для красоты.
Если объединить все это в PHP класс и применить ООП
Получится что-то вроде этого, универсальный клас для добавления AJAX функций в WP.