Публикация в группе: Кастомизация WP-Recall и Wordpress

Частенько приходится писать различные ajax запросы и раньше для каждого запроса приходилось писать регистрацию обработчика. А учитывая что на wordpress сайте может быть огромное кол-во плагинов / дополнений для recall - надо быть осторожным с именованием дабы избежать конфликтов, в результате это приводит к длинных названиям функций. Можно конечно придумывать различные уникальные префиксы - но со временем они так же становятся все длиннее.

В итоге сделал для себя простую заготовку - класс позволяющий обрабатывать все ajax запросы в одном месте. Таким образом можно использовать более понятный нейминг и не боятся за конфликты, ну и просто как показала практика - для меня это довольно удобно. Может кому-то так же подойдет такой подход.

В данном примере будет рассматривать отправку ajax запросов с помощью rcl_ajax, но это по сути будет просто более удобная запись стандартного метода jQuery.post()

 

Проблема

Допустим мы пишем плагин позволяющий создавать список задач (todo) и нам нужен следующий функционал, поддерживающий ajax:

  1. Получение формы создания todo
  2. Получение формы редактирования todo
  3. Сохранение нового todo в базу
  4. Обновление todo
  5. Удаление todo
  6. Выделение пунктов todo как выполненные

Решение 1

Один из вариантов как сделать обработчики всего этого - зарегистрировать 6 обработчиков:

...
add_action('wp_ajax_my_todo_plugin_new_todo_form_ajax', 'my_todo_plugin_new_todo_form_ajax');

function my_todo_plugin_new_todo_form_ajax(){

}
...

Именно такой подход мне и не нравится, приходится придумывать кучу имен и уникальный префикс который будет в имени каждой функции.

 

Решение 2

Регистрируем 1 обработчик для всех наших запросов

add_action('wp_ajax_my_todo_plugin_ajax', 'my_todo_plugin_ajax');

function my_todo_plugin_ajax(){

require_once 'class/My_Todo_Plugin_Ajax.php';

$ajax = new My_Todo_Plugin_Ajax();

$ajax->process();

}

 

Содержимое класса обработчика

 

class My_Todo_Plugin_Ajax {

public function __construct(){}

public function process(){

$method = isset($_POST['method']) ? $_POST['method'] : '';
$params = isset($_POST['params']) ? $_POST['params'] : [];

if(!method_exists($this, $method)) {

$this->error('Неизвестный метод');

}

$this->$method($params);
}

private function error($message = 'Ошибка'){

wp_send_json(['error' => $message]);

}

private function success($message = 'Успешно', $data = []){

wp_send_json(array_merge(['success' => $message], $data));

}

}

 

В итоге мы сможем вызывать нужные методы нашего обработчика передавая в post запросе поле method и параметры для него.

Например:

 

rcl_ajax({

data: {

action: 'my_todo_plugin_ajax',

method: 'new_todo_form',

params: {}

}

});

 

Вызовет в нашем обработчике метод new_todo_form и передаст ему параметры params

 

И если мы в будущем захотим добавить еще какую-то ajax возможность - достаточно будет добавить нужный метод в нашем классе-обработчике и все.

 

Плюсы:

Все обработчики в одном месте

Можно писать более простые и читаемые именования

Легко расширить

Минусы:

Все обработчики в одном месте. Если их будет много - это приведет к нечитабельности. Но с другой стороны можно разбить ajax запросы на какие-то группы и сделать несколько обработчиков.

 

Может есть какой-то еще более удобный способ, можете о нем написать, но для небольших плагинов мне кажется этот подход вполне разумным.

3

Автор публикации

не в сети 3 месяца

Preci

1 494
Telegram: https://t.me/preci_123
Комментарии: 497Публикации: 83Регистрация: 11-11-2014Продаж/Покупок: 0/0