Публикация в группе: Плагин WP-Recall - Личный кабинет на WordPress

Категории группы: Обновления

Приветствую!

На момент выхода этой заметки, релиза версии 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-репозитория для ознакомления и тестирования.

 

8

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

не в сети 8 часов

Андрей CS

12K
занят
Комментарии: 2729Публикации: 481Регистрация: 30-11--0001Продаж/Покупок: 0/0