WordPress изменение URL в Ajax без перезагрузки страницы

В современных веб-проектах часто возникает необходимость динамически изменять содержимое страницы без её полной перезагрузки. Особенно это актуально для сайтов на WordPress, где хочется улучшить пользовательский опыт, обновляя контент через Ajax. Одной из важных задач при этом становится изменение URL в адресной строке браузера без перезагрузки страницы — чтобы пользователь мог делиться ссылкой на текущий динамический контент, а также для корректной работы истории браузера.

Почему важно менять URL без перезагрузки? Обновление адреса через History API

Традиционно при загрузке нового контента на страницу меняется URL, и это приводит к полной перезагрузке. Но с появлением History API в браузерах появилась возможность управлять историей и адресной строкой без перезагрузки. Это позволяет:

  • Обновлять адрес страницы под динамически загруженный контент;
  • Обеспечивать корректную навигацию кнопками назад/вперед браузера;
  • Делать ссылки на актуальное состояние страницы, даже если контент грузится через Ajax.

В WordPress, где часто используются ajax-запросы для фильтров, пагинации или динамического подгруза записей, применение History API — обязательный элемент для улучшения UX.

Основы работы с History API в WordPress

Для изменения URL без перезагрузки используется метод history.pushState() или history.replaceState(). Разница в том, что pushState добавляет новую запись в историю, а replaceState заменяет текущую.

Пример простого вызова в JS:

history.pushState(null, '', '/novyj-url');

Это изменит адрес в браузере на /novyj-url без перезагрузки страницы.

Практическая задача: динамическая фильтрация постов с изменением URL на WordPress

Рассмотрим практический пример. Есть архив постов с фильтром по категориям или меткам. При выборе фильтра хотим подгрузить посты через Ajax, а URL в адресной строке — изменить под выбранный фильтр без перезагрузки.

1. Создание Ajax-запроса в WordPress

Для начала подключим скрипт и локализуем параметры:

function wprus_enqueue_scripts() {
    wp_enqueue_script('wprus-filter', get_template_directory_uri() . '/js/filter.js', array('jquery'), '1.0', true);
    wp_localize_script('wprus-filter', 'wprus_ajax', array(
        'ajax_url' => admin_url('admin-ajax.php'),
        'home_url' => home_url(),
    ));
}
add_action('wp_enqueue_scripts', 'wprus_enqueue_scripts');

В файле filter.js создадим обработчик:

jQuery(document).ready(function($) {
    $('#filter-select').on('change', function() {
        var filterVal = $(this).val();
        $.ajax({
            url: wprus_ajax.ajax_url,
            type: 'POST',
            data: {
                action: 'wprus_filter_posts',
                filter: filterVal
            },
            success: function(response) {
                $('#posts-container').html(response);
                // Изменяем URL без перезагрузки
                var newUrl = wprus_ajax.home_url + '/filter/' + filterVal + '/';
                history.pushState(null, '', newUrl);
            },
            error: function() {
                alert('Ошибка загрузки постов.');
            }
        });
    });

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

2. Обработка Ajax-запроса в PHP

Далее добавим обработчик в functions.php:

function wprus_filter_posts_callback() {
    $filter = sanitize_text_field($_POST['filter']);
    $args = array(
        'post_type' => 'post',
        'posts_per_page' => 10,
    );

    if ($filter && $filter !== 'all') {
        $args['category_name'] = $filter;
    }

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            echo '<h2><a href="' . get_permalink() . '">' . get_the_title() . '</a></h2>';
            echo '<p>' . get_the_excerpt() . '</p>';
        }
    } else {
        echo '<p>Постов не найдено.</p>';
    }
    wp_die();
}
add_action('wp_ajax_wprus_filter_posts', 'wprus_filter_posts_callback');
add_action('wp_ajax_nopriv_wprus_filter_posts', 'wprus_filter_posts_callback');

Особенности и советы при изменении URL через Ajax в WordPress

Обработка состояния при обновлении страницы

Если пользователь обновит страницу после изменения URL через History API, сервер должен корректно обработать текущий адрес и вывести соответствующий контент. Для этого в WordPress нужно добавить поддержку ЧПУ для новых URL или обработать параметры в шаблоне.

Улучшение навигации: обработка события onpopstate

В примере выше при нажатии кнопок назад/вперед происходит простая перезагрузка страницы. Для более плавной навигации можно обрабатывать событие window.onpopstate и динамически подгружать контент через Ajax, исходя из текущего URL.

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

Если не хочется писать весь код с нуля, можно использовать плагины, расширяющие возможности Ajax и History API в WordPress. Например:

  • Ajax Load More — позволяет создавать бесконечную подгрузку и пагинацию с изменением URL;
  • WP Ajax Pagination — плагин для пагинации через Ajax с поддержкой History API;
  • FacetWP — мощный инструмент для фильтрации с динамическим обновлением URL.

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

Выводы и рекомендации

Изменение URL в WordPress без перезагрузки — важный прием для создания современных, быстрых и удобных сайтов. Использование History API совместно с Ajax-запросами позволяет динамично менять содержимое и адрес, сохраняя корректную историю браузера. Ключевые моменты:

  • Обязательно локализуйте скрипты и используйте wp_ajax для безопасности;
  • Обрабатывайте на сервере запросы с учетом новых параметров URL;
  • Продумывайте логику обработки кнопок назад и вперед для плавной навигации;
  • Используйте готовые плагины для ускорения разработки, если это приемлемо.

Такой подход улучшает UX и SEO сайта, позволяя пользователям легче ориентироваться и делиться актуальными ссылками.

Как добавить кастомный REST API endpoint в WordPress с примером кода
07.03.2026
Как устроить эффективный кэш в WordPress через Redis
15.02.2026
Как удалить загруженные файлы из медиатеки WordPress по ссылке
06.12.2025
WooCommerce: автоматическое удаление старых неоплаченных заказов
15.05.2026
WooCommerce: как автоматически отключить отзывы для определённых ролей пользователей
10.06.2026
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше