За один запуск WordPress активирует не более одного хука wp_ajax_*
— в случае, когда обрабатывается AJAX-запрос. При обработке не-AJAX-запросов эти хуки не активируются. Поэтому, когда количество обработчиков AJAX велико, регистрировать их все сразу нет смысла.
В самом начале обработки запроса скрипт /wp-admin/admin-ajax.php
задаёт константу DOING_AJAX
как true
, а действие, которое должно быть обработано, находится в $_REQUEST['action']
. Этого достаточно, чтобы определить обработчик, который должен быть запущен. Если имена функций-обработчиков построены в виде "myplugin_ajax_{$action}"
, то регистрация нужного хука может выглядеть так:
|
if (defined('DOING_AJAX') && DOING_AJAX && !empty($_REQUEST['action'])) // выполняется AJAX-запрос add_action('plugins_loaded', 'myplugin_init_ajax'); function myplugin_init_ajax () { // определить обработчик по идентификатору действия // если подходящего обработчика нет, значит запрос принадлежит другому плагину // и его следует игнорировать; $action = $_REQUEST['action']; $fn = 'myplugin_ajax_' . $action; // определить имя функции if (!is_callable($fn)) // и проверить её существование return; // нет такого обработчика - проигнорировать запрос // зарегистрировать хук в соответствии с авторизованностью посетителя: $hook = is_user_logged_in() ? 'wp_ajax_' : 'wp_ajax_nopriv_'; add_action($hook . $action, $fn); } |
После этого для добавления нового обработчика AJAX потребуется просто определить функцию с соответствующим именем.