Загрузка...

AJAX в WordPress. Как создать?

ajax

Введение

На 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.

Добавить комментарий

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