К основному контенту

Использование AJAX в админке WordPress

Раньше я пользовался CMS Joomla! и совсем недавно решил попробовать WordPress. мое мнение - Небо и Земля! Для WordPress оказалось писать легче, чем для Joomla!
В свете последних разработок хочу поделиться опытом использования AJAX. Все довольно удобно и просто. Для отправки запроса средствами AJAX с помощью WordPress нужно знать 2 вещи:
  1. Адрес запроса /wp-admin/admin-ajax.php
  2. Обязательный параметр action

Идея

У нас есть электронный счет на оплату и у него есть кнопка подтверждения, что он оплачен. Для этого нужно просто отправить запрос с идентификатором счета.
С технической стороны - это кнопка submit для формы. Кнопка будет вставлять идентификатор счета в скрытое поле. На событие onsubmit формы будет отрабатывать наш JavaScript и отправлять AJAX запрос.

Step-by-step

Шаг 1. Создание JS файла

Создадим файл JS, который будет отправлять AJAX запрос. Путь к файлу, относительно папки плагина: /assets/js/orders.js

jQuery(document).ready(function() {
    // Каждой кнопке SUBMIT навесим событие
    jQuery('.wplspms-order-submit').click(function() {
 
        // Узнаем код счета из атрибута order-code нажатой кнопки
        var code = jQuery(this).attr('order-code');
 
        // Положим полученный код в скрытое поле формы
        jQuery('#wplspms-order-code').val(code);
    });
 
    // Переопределим событие SUBMIT у формы
    jQuery('#order-form').submit(function() {
 
        // Узнаем значение кода счета
        var code = jQuery('#wplspms-order-code').val();
 
        // Параметры запроса
        data = {
            action: 'wplspms_confirm_order',
            code: code
        };
 
        // Отправка POST запроса через AJAX
        jQuery.post(ajaxurl, data, function(response) {
 
            // Результат запишем вместо ячейки с кнопкой
            jQuery('#' + code).html(response);
        });
 
        // Вернем FALSE что бы не отработал непосредственно SUBMIT формы
        return false;
    });
});

Что тут интересно? Интересна переменная data и ajaxurl. В переменной data есть параметр action. В качестве его значения указано имя функции, которое будет обрабатывать отправленный запрос. Параметр code - это идентификатор нашего счета.
Не маловажная переменная ajaxurl. Она предопределена в самом WordPress и содержит URL адрес, на который следует отправлять AJAX запрос, т.е. ее значение равно /wp-admin/admin-ajax.php.
Что не интересно - это jQuery. Мой скрипт почему-то упорно отказывается понимать знак доллара($), по этому пришлось его избегать.

Шаг 2. Добавление скрипта на страницу

Об этом так же особо заботиться не нужно. Разработчики WordPress максимально облегчили этот процесс. Нужно указать лишь одну строчку кода:


wp_enqueue_script('wplspms_orders', WPLSPMS_PLUGIN_URL . '/assets/js/orders.js', array('jquery'));

Пара слов: первый параметр - это имя подключаемого скрипта(оно потребуется, если от него зависят другие скрипты); второй - это путь к JS файлу (WPLSPMS_PLUGIN_URL - это константа, которая содержит базовый путь к плагину); третий - это зависимости. Наш скрипт зависит от jquery.

Шаг 3. Добавляем обработчик

При помощи функции add_action добавляем событие в WordPress

add_action('wp_ajax_wplspms_confirm_order', array(&$this, 'ajax_confirm_order'));

Здесь всего 2 параметра, но. считаю. что их стоит объяснить. Первый параметр - это обработчик AJAX запроса. Значение этого параметра составное и имеет определенную структуру. Событие AJAX запроса для админки должно начинаться на wp_ajax_. Вторая часть названия - это значение параметра action, которое мы передаем в POST запросе.
Второй параметр - непосредственно имя функции, которая будет обрабатывать этот запрос. Поскольку я использую объектно ориентированное программирование (ООП), то передается массив, первый элемент которого - указатель на класс, а второй - на имя функции. Другими словами это действие объявляется в конструкторе класса (отсюда &$this) и обрабатывать запрос будет функция ajax_confirm_order этого класса.

public function ajax_confirm_order()
{
 if (isset($_POST['code']) && !empty($_POST['code']))
 {
  $o = new wplspms_orders();
  $res = $o->Confirm($_POST['code']);
  if ($res === false)
  {
   _e('Error', 'wplspms');
  }
  else
  {
   echo $res;
  }
  die();
 }
}

Тут нужно учесть 2 вещи: функция должна быть обязательно public, если используется ООП; второе - после выполнения функция должна умирать (die()).

В заключении скажу. что пользоваться "таким AJAX" очень и очень удобно. Спасибо разработчикам!

Комментарии

Популярные сообщения из этого блога

Прямые ссылки на файлы Google диска

В предыдущей статье я рассказал, как подключить свой JavaScript файл к блогу BLOGSPOT . Но для того, что бы их подключить нужны прямые ссылки на файл, а Google диск при предоставлении общего доступа к файлу выдает ссылку на предварительный просмотр, которая никак напрямую не ссылается на файл. Для Google диска прямая ссылка на файл - это ссылка на скачивание. Ниже описаны два способа создания ссылки на скачивание на примере файла prism.js.

События для ведения таблиц

Как и всегда, в пылу проекта внезапно родилась Z табличка. Главный нюанс был в том, что она должна была хранить пароли для авторизации на стороннем сервере. Естественно, никто не хотел хранить пароли в открытом виде, а двустороннее шифрование SAP не умеет без сторонних пакетов и надстроек. Далее, все как обычно - придумали алгоритм, сделали табличку. Дело осталось за малым - нужно шифровать пароли, которые вводит пользователь. Делать отдельную программу нет смысла, поскольку ее функционал мало чем будет отличаться от сгенерированного. Вот здесь на помощь приходят события! С их помощью можно, наверное, все. По крайней мере, я не нашел чего-либо, что нельзя сделать с данными через события.

OOP ALV GRID с HTML шапкой

В этой статье хочу постараться подробно описать и привести пример, как можно создать ALV отчет с таблицей на весь экран и с HTML шапкой вверху. Я не буду описывать начальный этап, где пишется селекционный экран или делается выборка данных. Будем считать, что основа у нас есть и нам нужно просто вывести данные. Главной изюминкой является то, что нужно вывести ALV GRID на экран без использования каких-либо дополнительных элементов на экране. Step-By-Step Шаг 1. Создание окна Создаем самое простое окно с номером 100. На него не нужно кидать никаких контейнеров. Оно нам нужно только для модулей PAI и PBO и вывода на него ALV GRID.