Вопрос или проблема
WordPress, похоже, переписывает URL-адреса, отображая страницы под неправильным URL.
Пример. У меня есть страница под названием “Эмоция” с слагом /emotion/
На фронтэнде она должна отображаться по следующему URL:
example.com/learning/domains/emotion/
То есть, в разделе страниц сайта определены отношения родитель/дочерний элемент, как показано в этом URL. К сожалению, WordPress показывает эту страницу любому, независимо от того, какой URL вы вводите.
Примеры;
- example.com/search/emotion/
- example.com/this-parent-doesnt-exist/emotion/
- example.com/learning/concepts/emotion/
Ни один из этих URL не является реальным. Я ожидаю увидеть страницу 404.
Я уже провел исследование и попробовал два приведенных ниже варианта. Первый работал в версиях WP до v6. Теперь ни один из них не работает.
-
remove_filter(‘template_redirect’, ‘redirect_canonical’);
-
add_filter( ‘redirect_canonical’, ‘disable_redirect_canonical’, 10, 2 );
function disable_redirect_canonical( $redirect_url ) {
return false;
}
Как мне отключить это правило переписывания?
После проведенного исследования я нашел ответ, хотя с небольшим ограничением… он показывает страницу только с завершающим слешем. Это, возможно, технически правильное отображение URL, поэтому я справлюсь с этим.
Я нашел решение, зарытое в этом похожем вопросе
Отключить автоматическое завершение URL в WordPress
ПРАВИЛЬНОЕ решение от Дэвида Вильхубера – странно, что оно не является проголосованным как правильное. Возможно, решение с голосами работало для более старых версий WordPress, но больше не работает с WP v6.x.
Чтобы отключить каноническое перенаправление WordPress (на ближайший подходящий URL) и заставить отображать страницу 404… добавьте следующий код в файл functions.php вашей дочерней темы.
// Отключить каноническое перенаправление WordPress на ближайший подходящий URL и заставить отображать страницу 404
// ---------------------------------
add_filter( 'redirect_canonical', function( $redirect_url ) {
$url="http".((isset($_SERVER['HTTPS'])&&$_SERVER['HTTPS']!=='off')?'s':'').'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
if( $redirect_url !== $url ) {
global $wp_query;
$wp_query->set_404();
status_header( 404 );
nocache_headers();
}
return false;
});
Ответ или решение
Для решения вашей проблемы с перенаправлением канонических URL в WordPress и показом страницы 404 вместо ближайшего совпадающего URL, вам необходимо внести изменения в файл functions.php вашей дочерней темы. Данная задача может быть актуальна, если вы хотите предотвратить автоматическое переопределение URL и обеспечить корректное отображение ошибок 404 для несуществующих страниц.
Шаги для реализации решения:
-
Доступ к файлу functions.php:
- Перейдите в админ-панель WordPress.
- В разделе "Внешний вид" выберите "Редактор тем".
- Найдите файл
functions.php
в правом меню и откройте его.
-
Добавление кода:
- Вставьте следующий код в конец файла
functions.php
. Убедитесь, что вы не вставляете его внутрь уже существующей функции.
- Вставьте следующий код в конец файла
// Отключение канонического перенаправления WordPress и принудительное отображение страницы 404
add_filter( 'redirect_canonical', function( $redirect_url ) {
$url = "http" . ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 's' : '') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
if ( $redirect_url !== $url ) {
global $wp_query;
$wp_query->set_404();
status_header( 404 );
nocache_headers();
}
return false;
});
Объяснение кода:
-
Фильтр
redirect_canonical
:- Этот фильтр позволяет вам модифицировать поведение канонических URL.
-
Определение текущего URL:
- Код формирует текущий URL с учетом протокола (HTTP или HTTPS) и добавляет хост и URI.
-
Проверка перенаправления:
- Если сгенерированный канонический URL не совпадает с текущим запрашиваемым URL, то происходит установка статуса 404.
-
Установка заголовка 404:
status_header(404)
информирует браузер и поисковые системы о том, что страница не найдена.
-
Очистка кэша заголовков:
nocache_headers()
сообщает браузеру не кэшировать страницу.
Рекомендации:
- Резервное копирование: Перед внесением изменений в
functions.php
, рекомендуется создать резервную копию файла, чтобы избежать ошибок, которые могут вызвать перебои в работе сайта. - Тестирование: После добавления кода убедитесь, что вы протестировали несколько несуществующих URL и убедились, что они корректно возвращают страницу 404.
Заключение:
Используя предоставленный код, вы сможете отключить нежелательное поведение переадресации WordPress и обеспечить правильное отображение страницы 404 для несуществующих URL. Это улучшит структуру вашего сайта и повысит пользовательский опыт. Не забывайте следить за обновлениями WordPress и тестировать ваш сайт после каждого обновления, чтобы убедиться, что код по-прежнему работает должным образом.