Как отключить каноническое перенаправление WordPress на ближайший соответствующий URL и заставить отображаться страницу 404?

Вопрос или проблема

WordPress, похоже, переписывает URL-адреса, отображая страницы под неправильным URL.

Пример. У меня есть страница под названием “Эмоция” с слагом /emotion/

На фронтэнде она должна отображаться по следующему URL:
example.com/learning/domains/emotion/

То есть, в разделе страниц сайта определены отношения родитель/дочерний элемент, как показано в этом URL. К сожалению, WordPress показывает эту страницу любому, независимо от того, какой URL вы вводите.

Примеры;

  1. example.com/search/emotion/
  2. example.com/this-parent-doesnt-exist/emotion/
  3. example.com/learning/concepts/emotion/

Ни один из этих URL не является реальным. Я ожидаю увидеть страницу 404.

Я уже провел исследование и попробовал два приведенных ниже варианта. Первый работал в версиях WP до v6. Теперь ни один из них не работает.

  1. remove_filter(‘template_redirect’, ‘redirect_canonical’);

  2. 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 для несуществующих страниц.

Шаги для реализации решения:

  1. Доступ к файлу functions.php:

    • Перейдите в админ-панель WordPress.
    • В разделе "Внешний вид" выберите "Редактор тем".
    • Найдите файл functions.php в правом меню и откройте его.
  2. Добавление кода:

    • Вставьте следующий код в конец файла 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 и тестировать ваш сайт после каждого обновления, чтобы убедиться, что код по-прежнему работает должным образом.

Оцените материал
Добавить комментарий

Капча загружается...