Как изменить URL AJAX-запросов в WordPress без плагинов

AJAX-запросы в WordPress по умолчанию обрабатываются через файл admin-ajax.php, расположенный по адресу /wp-admin/admin-ajax.php. Это удобный механизм, но у него есть недостатки с точки зрения безопасности и производительности. В данной статье мы подробно разберём, как изменить URL AJAX-запросов в WordPress без использования плагинов, чтобы повысить безопасность сайта и сделать архитектуру запросов более гибкой.

Почему стоит менять стандартный URL AJAX-запросов в WordPress

По умолчанию все AJAX-запросы в WordPress идут через admin-ajax.php. Это создает несколько проблем:

  • Безопасность: Злоумышленники знают стандартный URL, через который можно пытаться выполнять атаки.
  • Производительность: Файл admin-ajax.php грузит всю среду админки, даже если запрос идет с фронтенда.
  • SEO и чистота URL: Для REST API и других современных подходов хочется иметь более чистые и кастомные URL.

Из-за этого часто возникает задача изменить URL обработчика AJAX на свой собственный, а также изменить логику обработки таких запросов.

Как работает стандартный AJAX в WordPress

Чтобы понимать, как менять URL, разберём типичный пример стандартного AJAX-запроса в WordPress:

jQuery.post(ajaxurl, {
    action: 'wphide_my_action',
    data: someData
}, function(response) {
    console.log(response);
});

Здесь ajaxurl обычно определяется в wp_localize_script и указывает на /wp-admin/admin-ajax.php. На сервере WordPress обрабатывает запрос по хуку wp_ajax_wphide_my_action (для авторизованных) и wp_ajax_nopriv_wphide_my_action (для гостей).

Создание собственного обработчика AJAX с кастомным URL

Чтобы изменить URL, нам нужно сделать несколько шагов:

  1. Зарегистрировать новый endpoint (конечную точку) для AJAX-запросов.
  2. Перенаправить запросы с этого endpoint на нашу функцию-обработчик.
  3. Изменить JavaScript, чтобы он отправлял AJAX-запросы на новый URL.

Регистрация нового endpoint через rewrite rules

Добавим в functions.php или в свой плагин следующий код, который добавит правило переадресации:

function wphide_add_ajax_rewrite_rule() {
    add_rewrite_rule('^custom-ajax-endpoint/?$', 'index.php?custom_ajax=1', 'top');
}
add_action('init', 'wphide_add_ajax_rewrite_rule');

Регистрация нового query var

function wphide_add_query_vars($vars) {
    $vars[] = 'custom_ajax';
    return $vars;
}
add_filter('query_vars', 'wphide_add_query_vars');

Обработка запроса на новом endpoint

function wphide_custom_ajax_handler() {
    global $wp_query;
    if (isset($wp_query->query_vars['custom_ajax'])) {
        // Проверяем nonce, если нужно
        // Выполняем логику
        $response = array('success' => true, 'message' => 'Ответ от кастомного AJAX');
        wp_send_json($response);
        exit;
    }
}
add_action('template_redirect', 'wphide_custom_ajax_handler');

Обновление JavaScript для запроса на новый URL

В скрипте заменяем стандартный ajaxurl на новый URL:

jQuery.post('/custom-ajax-endpoint', {
    data: someData
}, function(response) {
    console.log(response);
});

Проверка и очистка правил перезаписи

После добавления правил перезаписи обязательно нужно перейти в Настройки > Постоянные ссылки в админке и просто сохранить настройки, чтобы обновить правила .htaccess.

Обеспечение безопасности кастомного AJAX

При создании собственного AJAX-обработчика важно обеспечить безопасность:

  • Используйте check_ajax_referer или wp_verify_nonce для проверки nonce.
  • Проверяйте права пользователя, если запрос требует авторизации.
  • Фильтруйте и валидируйте входящие данные.

Пример с проверкой nonce и авторизацией

function wphide_custom_ajax_handler() {
    global $wp_query;
    if (isset($wp_query->query_vars['custom_ajax'])) {
        if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'wphide_custom_nonce')) {
            wp_send_json_error('Неверный nonce');
            exit;
        }

        if (!is_user_logged_in()) {
            wp_send_json_error('Требуется авторизация');
            exit;
        }

        // Обработка данных
        $response = array('success' => true, 'message' => 'Данные успешно обработаны');
        wp_send_json_success($response);
        exit;
    }
}
add_action('template_redirect', 'wphide_custom_ajax_handler');

Использование плагина Clearfy для управления AJAX

Если вы хотите более простое решение без кода, советуем посмотреть плагин Clearfy. Он позволяет управлять многими аспектами безопасности и оптимизации, в том числе AJAX-запросами.

Итоги и рекомендации

Изменение стандартного URL AJAX-запросов в WordPress — полезный прием для повышения безопасности и гибкости проекта. Реализовать это можно с помощью переопределения rewrite rules, регистрации новых query var и обработки запросов через template_redirect. Обязательно используйте nonce и проверки прав доступа, чтобы избежать уязвимостей. Для быстрого старта можно использовать готовые решения из набора WPSHOP.

⭐⭐⭐⭐⭐