Изменение URL для AJAX-запросов в WordPress без перезагрузки страницы

Работа с AJAX в WordPress часто требует не просто отправки и получения данных, но и обновления URL в адресной строке браузера без полной перезагрузки страницы. Это полезно для улучшения UX и SEO, особенно при создании одностраничных приложений или динамических фильтров контента. В этой статье мы подробно разберём, как реализовать изменение URL с помощью JavaScript History API и одновременно корректно обработать AJAX-запросы на стороне WordPress.

Почему важно менять URL при AJAX-запросах

Когда вы загружаете данные через AJAX, URL страницы не меняется, что может запутать пользователя и усложнить навигацию. Если пользователь обновит страницу, он потеряет контекст текущего состояния приложения. Изменение URL позволяет:

  • Отражать текущее состояние в адресной строке;
  • Обеспечить возможность делиться ссылками с нужным состоянием;
  • Поддерживать работу кнопок назад/вперёд в браузере;
  • Улучшить SEO при правильной настройке серверной части.

Все это позитивно влияет на удобство и функционал сайта.

Использование History API для изменения URL без перезагрузки

JavaScript предоставляет для этого методы history.pushState() и history.replaceState(). Они позволяют изменить URL и состояние истории браузера без полной загрузки страницы.

Пример базового использования в WordPress:

function wptem_change_url(newUrl) {
    if (history.pushState) {
        history.pushState(null, null, newUrl);
    } else {
        // fallback для старых браузеров
        window.location.href = newUrl;
    }
}

Здесь newUrl — это строка с новым адресом, который мы хотим отобразить в браузере.

Этот подход можно интегрировать с AJAX-функциями, чтобы при успешном ответе сервера обновлять URL.

Пример AJAX-запроса в WordPress с изменением URL

Рассмотрим пример, когда у нас есть фильтр новостей по категориям. При выборе категории мы отправляем AJAX-запрос, подгружаем записи и меняем URL.

1. JavaScript (jQuery):

jQuery(document).ready(function($) {
    $('.filter-category').on('click', function(e) {
        e.preventDefault();
        var category = $(this).data('category');
        $.ajax({
            url: wptem_ajax_obj.ajax_url,
            type: 'POST',
            data: {
                action: 'wptem_filter_posts',
                category: category
            },
            success: function(response) {
                $('#posts-container').html(response);
                var newUrl = '/category/' + category;
                wptem_change_url(newUrl);
            }
        });
    });

    function wptem_change_url(newUrl) {
        if (history.pushState) {
            history.pushState(null, null, newUrl);
        } else {
            window.location.href = newUrl;
        }
    }

    // Обработка кнопок назад/вперёд
    window.onpopstate = function(event) {
        location.reload(); // Перезагрузить страницу или выполнить AJAX с нужными данными
    };
});

2. PHP (functions.php или плагин):

add_action('wp_enqueue_scripts', 'wptem_enqueue_scripts');
function wptem_enqueue_scripts() {
    wp_enqueue_script('jquery');
    wp_localize_script('jquery', 'wptem_ajax_obj', array(
        'ajax_url' => admin_url('admin-ajax.php'),
    ));
}

add_action('wp_ajax_wptem_filter_posts', 'wptem_filter_posts_callback');
add_action('wp_ajax_nopriv_wptem_filter_posts', 'wptem_filter_posts_callback');
function wptem_filter_posts_callback() {
    $category = sanitize_text_field($_POST['category']);
    $query = new WP_Query(array(
        'category_name' => $category,
        'posts_per_page' => 10
    ));
    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            echo '<h2>' . get_the_title() . '</h2>';
            echo '<div>' . get_the_excerpt() . '</div>';
        }
    } else {
        echo '<p>Записей не найдено</p>';
    }
    wp_die();
}

Обработка URL при прямом переходе и SEO

Чтобы корректно обрабатывать адреса вида /category/slug при прямом переходе, необходимо настроить правила перезаписи (rewrite rules) в WordPress. Это позволит показывать нужный контент без ошибок 404.

Пример добавления правила:

add_action('init', 'wptem_add_rewrite_rules');
function wptem_add_rewrite_rules() {
    add_rewrite_rule('^category/([^/]*)/?$', 'index.php?category_name=$matches[1]', 'top');
}

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

Таким образом, при вводе адреса https://example.com/category/news загрузятся записи категории news.

Советы и рекомендации по реализации

1. Управление состоянием истории браузера

Рекомендуется использовать pushState для добавления новых состояний и replaceState для замены текущего, когда это необходимо. Также важно обрабатывать событие popstate для поддержки кнопок назад/вперёд.

2. Безопасность и валидация данных

Всегда фильтруйте и проверяйте данные, приходящие с клиента. В примере выше используется sanitize_text_field для категории.

3. Кэширование и производительность

Если сайт большой, подумайте о кэшировании результатов AJAX и использовании transient API для снижения нагрузки.

Использование плагинов для упрощения работы с AJAX и URL

Если вы хотите использовать готовые решения, обратите внимание на плагины, которые помогают управлять AJAX-запросами и состоянием URL, например:

  • Clearfy Pro — оптимизация и улучшение работы сайта, в том числе улучшение AJAX-запросов.
  • WPRemark — расширенные комментарии с поддержкой AJAX и динамического обновления URL.

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

WooCommerce: автоматическое удаление неактивных корзин и заказов
29.04.2026
Разрешение проблем с хостингом WordPress и использование хуков для оптимизации
07.12.2025
Как динамически изменять заголовки страниц в WordPress
18.12.2025
Оптимизация кэша и кеширование в WordPress: лучшие практики и инструменты
08.11.2025
Как создать автоматический плагин обновления данных в WordPress
15.12.2025