Приветствую!
На момент выхода этой заметки, релиза версии 16.7.0 плагина еще не было и то, что заметка о версии вышла раньше - неслучайно. В этой версии было решено обратить внимание на оптимизацию кода формирующего отправку и прием данных при ajax-запросах, а так как эти запросы пронизывают весь плагин и все базовые дополнения, то изменений в коде получилось слишком много, чтобы торопиться с выпуском обновления.
Кратко обрисую новые подходы, которые стали доступны при работе с ajax на стороне плагина и его дополнений.
Немного была оптимизирована стандартная регистрация callback-функции, теперь вместо:
add_action('wp_ajax_my_function','my_function'); add_action('wp_ajax_nopriv_my_function', 'my_function');
можно записать
rcl_ajax_action('my_function',true);
где второй аргумент "true" разрешает ajax-запрос к указанной функции гостям сайта, по-умолчанию - false.
Самое интересно происходит на стороне javascript, здесь для регистрации ajax-запроса появилась новая функция rcl_ajax(), она призвана заменить собой использование стандартного вызова jQuery.ajax(), упростив синтаксис и взяв на себя обработку возвращаемых данных.
Общий порядок работы с функцией выглядит так:
rcl_ajax({ data: { //указываем отправляемые данные action: 'my_function', val1: val1, val2: val2, val3: val3 }, success: function(result){ //обрабатываем ответ } });
Вместо объекта в data можно передать и строку, тогда запись будет выглядеть так:
rcl_ajax({ data: 'action=my_function&val1='+val1+'&val2='+val2+'&val3='+val3, success: function(result){ //обрабатываем result } });
Из приведенного кода можно увидеть, что мы в data, как обычно, подготовили и указали данные для отправки в php-функцию 'my_function' и принимаем ответ в success для обработки. Таким образом, мы опустили необходимость указывать остальные параметры ajax-запроса, в том числе и url до файла admin-ajax.php, все это берет на себя функция rcl_ajax() и указывает в фоновом режиме. Также эта функция, кроме указанных в data данных, добавляет значение nonce, которое мы можем проверить на стороне php, вызвав функцию rcl_verify_ajax_nonce(), обеспечив тем самым относительную безопасность запроса.
Кроме того, использование функции rcl_ajax() содержит встроенный обработчик ответов, который может взять на себя обработку некоторых стандартных ответов из php callback-функции и вывести на экран результат этой обработки. Из этого вытекает важный нюанс: использование success внутри функции rcl_ajax() не обязательно. В связи с этим стоит упомянуть о некоторых важных правилах использования этой функции в своем коде:
- для обработки в success ожидается только объект
- некоторые свойства принимаемого объекта обрабатываются автоматически до срабатывания пользовательского success
- result.error выводит уведомление с текстом ошибки и прекращает работу success
- result.success и result.warning выводят уведомление с указанным текстом
Проще говоря, мы можем написать такой ajax-запрос, который не будет требовать написания своего обработчика ответа, на себя эту роль возьмет встроенный обработчик. Рассмотрим рабочий пример.
Зарегистрируем на стороне PHP функцию
rcl_ajax_action('my_callback_function',true); function my_callback_function(){ //проверим безопасность запроса rcl_verify_ajax_nonce(); global $user_ID; if(!$user_ID){ wp_send_json(array('error'=>__('Гостям вход воспрещен!'))); } wp_send_json(array('success'=>__('Добро пожаловать!'))); }
Так как наша callback-функция возвращает лишь error и success, то они будут автоматически обработаны встроенным обработчиком на стороне JS, необходимости в их ручной обработке нет, поэтому указание success можно опустить. В результате, на стороне JS получим следующую запись:
rcl_ajax({ data: { action: 'my_callback_function' } });
Получилось очень просто и понятно. Все ответы из указанной callback-функции возьмет на себя встроенный обработчик и будет выводить стандартные уведомления от плагина WP-Recall.
На такой механизм работы были переведены все ajax-запросы внутри плагина и его базовых дополнений.
Эта версия также позволила немного доработать порядок использования JS-хуков, описанного ранее в статье. Теперь в хуки можно передавать неограниченное количество параметров и принимать их для обработки в указанные функции. Например:
//регистрируем хук и указываем данные для передачи rcl_do_action('rcl_any_action', var1, var2, var3); //вешаем на хук функцию rcl_add_action('rcl_any_action', 'rcl_action_callback'); function rcl_action_callback(var1, var2, var3){ //принимаем данные //обратываем полученные данные }
Аналогично расширились возможности функции rcl_apply_filters().
Кстати, внутри функции rcl_ajax() при успешной отработке success, автоматически регистрируется хук с именем соотвествующем наименованию callback-функции, т.е. значению параметра action, который передается в data, хук передает полученный объект result. Это можно иметь ввиду и использовать для расширения поведения уже существующих ajax-вызовов через свой код.
Также не могу не сообщить о значительной доработке вывода дополнений на странице репозитория WP-Recall в административной части сайта. Теперь там допускается поиск нужного дополнения по метке, автору или слову, а также сортировка дополнений не только по обновлению, но и по популярности. Найти нужное дополнение стало гораздо проще.
Вот такие полезности добавляет новая версия плагина.
В связи с тем, что в коде плагина и его базовых дополнений было сделано много изменений, новая версия пока предлагается только с нашего GitHub-репозитория для ознакомления и тестирования.
+Плюсую! Очень удобное нововведение для тех кто пишет живые (ajax) допы к плагину. Столько дублирований из своих js файлов выкинем - ведь писать урл - не надо, одноразовый (nonce) ключ тоже не надо, указывать тип передачи (post) и тип данных (json) - тоже не нужно.
А к чему подобное приведет?
- Во первых меньший вес js файлов - а это скорость загрузки сайта.
- Во вторых - новичку придти в мир ajax-а будет совсем легко - не надо заботится о всяких дополнительных данных. Тут же теперь все просто - по клику (к примеру) получил параметры, передал их в rcl_ajax и там же указал имя php обработчика.
далее в пхп обработчиком поймал сравнил nonce и вернул в js. А там уже вывел куда надо - пара строчек кода. Вообще суперлегко получается.
Идея просто супер! Я в восторге
Как раз подходил к "пункту своего тодо" изучение этого всего дела.))
Спасибо.
Вот, вот)
Не, так дело не пойдет, больше получаса тыкаю по всему включенному у меня в админке, сайте от плагина и ни одной ошибки даже в логах )
Наверно логи сломались 😈
тыкай сильней - недотыкиваешь))
Так не бывает чтобы багов не было. Ведь как-то находят их. Мы наверно не умеем 😉
Ну как предположение - нам надо самую дорогую премиум тему активировать - чтоб в ней свистелок-перделок было тьма. И активировать полсотни вукомерцов, жутьпаков и прочих монстров. Может тогда найдем?
Всем добрый день!
Протестировал обнову, также пока не нашёл ни багов ни ошибок, замысел просто супер. Даже сайт как то по шустрей стал работать.
Раз все так хорошо, то заливаю версию на этот сайт, погоняю сутки в боевом режиме, если все будет хорошо по-прежнему, то завтра обновление.
Здравствуйте! Подскажите, почему при отправке rcl_ajax запроса, admin_ajax.php может выдавать 0 в ответ? (action указан правильно, вообще тот же пример, только имя другое у функции)
Здравствуйте.
Подобные вопросы решаем на форуме поддержки https://codeseller.ru/forum/ - создавайте тему в ветке кастомизаций и показывайте что делаете.