Работа с 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.
Использование подобных плагинов позволит сэкономить время и получить стабильный результат.