Частенько приходится писать различные ajax запросы и раньше для каждого запроса приходилось писать регистрацию обработчика. А учитывая что на wordpress сайте может быть огромное кол-во плагинов / дополнений для recall - надо быть осторожным с именованием дабы избежать конфликтов, в результате это приводит к длинных названиям функций. Можно конечно придумывать различные уникальные префиксы - но со временем они так же становятся все длиннее.
В итоге сделал для себя простую заготовку - класс позволяющий обрабатывать все ajax запросы в одном месте. Таким образом можно использовать более понятный нейминг и не боятся за конфликты, ну и просто как показала практика - для меня это довольно удобно. Может кому-то так же подойдет такой подход.
В данном примере будет рассматривать отправку ajax запросов с помощью rcl_ajax, но это по сути будет просто более удобная запись стандартного метода jQuery.post()
Проблема
Допустим мы пишем плагин позволяющий создавать список задач (todo) и нам нужен следующий функционал, поддерживающий ajax:
- Получение формы создания todo
- Получение формы редактирования todo
- Сохранение нового todo в базу
- Обновление todo
- Удаление todo
- Выделение пунктов 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 запросы на какие-то группы и сделать несколько обработчиков.
Может есть какой-то еще более удобный способ, можете о нем написать, но для небольших плагинов мне кажется этот подход вполне разумным.
Подсветка кода смотрю пропала и на pastebin сейчас запрет на создание паст, так что пока так. Но кода тут не много, думаю понятно все
Вполне себе жизнеспособный вариант оптимизации, спасибо!
Мне вообще нравится уходить от разрозненных кусков функционального кода и объединять их в логические блоки внутри класса, пусть даже и полностью статического.