Посмотрим в данном гайде как сделать обработку ajax запроса на WordPress.
WP предоставляет два hook-а для подключения PHP обработчика к ajax запросу. Это wp_ajax_ACTION и wp_ajax_nopriv_ACTION. Оба они работают абсолютно одинаково. Отличие заключается в том, что первый хук срабатывает только для залогиненных пользователей, а второй — только для анонимов.
Если вам нужно, чтобы ajax выполнился в обоих случаях одинаково, то цепляйте их к одному обработчику:
1 2 |
add_action( 'wp_ajax_myaction', 'my_action' ); add_action( 'wp_ajax_nopriv_myaction', 'my_action' ); |
Часть имени зацепки «ACTION» — это ваш ключ, который вы передаёте в ajax-запросе в обязательном параметре ‘action’.
WP AJAX cо стороны фронт-энд
Приёмником запроса должен быть скрипт /wp-admin/admin-ajax.php.
Для примера, подключим отправку ajax к кнопке:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<button type="submit" class="button" id="button-sample">Пример кнопки</button> <script type="text/javascript" > (function ($) { $(document).ready(function($) { $('#button-sample').on('click', function(e) { var data = { 'action': 'your_action_name', /* и другие полезные параметры */ }; $.post('/wp-admin/admin-ajax.php', data, function(response) { console.log(response); }); }); }); })(jQuery); </script> |
PHP вернет данные с сервера скрипту через объект response.
WP AJAX со стороны бек-энд
Здесь нам нужно объявить и реализовать обработчик.
1 2 3 4 5 6 7 8 9 10 11 |
add_action( 'wp_ajax_your_action_name', 'my_ajax_action' ); add_action( 'wp_ajax_nopriv_your_action_name', 'my_ajax_action' ); function my_ajax_action() { // здесь какие то полезные операции :) // вычисляем ответ сервера $result = ... ; // но заканчивается обработка типично вот так: wp_send_json_success($result); wp_die(0); } |
Структура ответа сервера
Осталось взглянуть, что возвращается на сторону клиента в переменной response.
При успешном завершении вы получите:
1 2 3 4 |
{ "success": true, //успешно "data": '....' //данные, те, что вы передали в $result на сервере } |
Вы можете также выполнить ответ сервера с помощью функции
1 |
wp_send_json_error($result); |
и получить:
1 2 3 4 |
{ "success": false, "data": '....' //данные, те, что вы передали в $result на сервере } |
Если произошла какая либо ошибка, то response будет равен 0 или -1. Ноль WP возвращает, если нет соответствующего указанному action обработчика, а «-1» — в случае прочих ошибок.
Дополнительные замечания
Ссылку на скрипт admin-ajax.php более правильно генерировать вот так:
1 |
admin_url( 'admin-ajax.php' ); |
Если вызов ajax обрабатывается функцией некоторого класса, то инициализация обработчика внутри класса может выглядеть вот так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
if (!class_exists('MyClass')) { class MyClass { public function __construct() { add_action('wp_ajax_myaction', array($this, '_ajax_action')); } public _ajax_action() { ... wp_send_json_success($result); wp_die(0); } } $myclass_obj = new MyClass(); |