В процессе разработки сайтов на WordPress иногда возникает задача изменить URL текущей страницы без использования перенаправлений (редиректов). Например, вы хотите динамически изменить отображаемый адрес страницы для SEO или UX задач, не меняя при этом фактический URL и не вызывая дополнительного HTTP-запроса.
Почему стандартное перенаправление не всегда подходит
Обычно изменение URL страницы происходит с помощью 301 или 302 редиректа, что приводит к дополнительному запросу и снижению производительности. Кроме того, постоянные перенаправления могут негативно сказаться на SEO и пользовательском опыте.
Задача — изменить URL в браузере, не перезагружая страницу и не вызывая перенаправления. Это возможно с помощью JavaScript и правильной настройки WordPress.
Методы изменения URL без перенаправления
1. Использование JavaScript History API
Современные браузеры поддерживают history.pushState() и history.replaceState(), позволяющие изменить URL в адресной строке без перезагрузки страницы.
Пример кода для WordPress:
function wpassist_change_url_js() {
if (is_page()) {
?>
<script>
document.addEventListener('DOMContentLoaded', function() {
var newUrl = window.location.protocol + '//' + window.location.host + '/novyj-url/';
history.replaceState(null, '', newUrl);
});
</script>
<?php
}
}
add_action('wp_footer', 'wpassist_change_url_js');В этом примере при загрузке страницы URL в адресной строке меняется на /novyj-url/, но страница не перезагружается.
Важно: этот метод не меняет фактический адрес запроса на сервере, поэтому WordPress продолжит считать текущей страницу ту, которая была запрошена изначально.
2. Перезапись (Rewrite) URL на серверном уровне с поддержкой WordPress
Чтобы сервер тоже понимал новый URL, можно добавить правила перезаписи. Это позволит использовать новый адрес, но без перенаправления.
Добавим правило rewrite в WordPress:
function wpassist_add_rewrite_rule() {
add_rewrite_rule('^novyj-url/?$', 'index.php?pagename=staraya-stranica', 'top');
}
add_action('init', 'wpassist_add_rewrite_rule');После добавления правила нужно обновить постоянные ссылки, например, зайдя в настройки WordPress — Постоянные ссылки и просто сохранив их.
Теперь запрос к /novyj-url/ будет обрабатываться как запрос к /staraya-stranica/ без перенаправления.
Комбинирование JavaScript и rewrite для идеального результата
Для полной реализации изменения URL без перенаправления рекомендуем комбинировать серверную перезапись и изменение адресной строки через JavaScript. Таким образом, пользователь увидит новый URL, а сервер корректно обработает запрос.
Пример использования вместе:
- В functions.php добавляем rewrite правило, как показано выше.
- В footer добавляем JS с
history.replaceState()для замены адреса в браузере.
Практические рекомендации и возможные подводные камни
1. Обновление постоянных ссылок — после добавления rewrite правил обязательно обновите их из админки.
2. Совместимость с кешированием — при использовании кеш-плагинов проверьте, что кеш не мешает работе новых URL.
3. SEO — изменение URL без явных редиректов может привести к дублированию контента. Обязательно используйте canonical-теги или другие методы SEO-оптимизации.
4. Проверка на плагинах — некоторые плагины могут конфликтовать с нестандартными URL, протестируйте сайт.
Пример плагина для управления rewrite правилами
Если хотите более гибко управлять правилами, можно использовать плагин Clearfy Pro. Он позволяет настраивать оптимизации URL и перезаписи без правки кода.
Итоговое решение: простая функция для изменения URL текущей страницы
function wpassist_change_current_url() {
if (is_page('staraya-stranica')) {
// Добавляем JavaScript для изменения URL в браузере
?>
<script>
document.addEventListener('DOMContentLoaded', function() {
var newUrl = window.location.protocol + '//' + window.location.host + '/novyj-url/';
history.replaceState(null, '', newUrl);
});
</script>
<?php
}
}
add_action('wp_footer', 'wpassist_change_current_url');
function wpassist_add_rewrite_rule() {
add_rewrite_rule('^novyj-url/?$', 'index.php?pagename=staraya-stranica', 'top');
}
add_action('init', 'wpassist_add_rewrite_rule');Это пример базового решения, которое можно адаптировать под свои задачи.