wp_old_slug_redirect()
Функция ядра, которая перенаправляет пользователя со старых ссылок записи на актуальную.
Функция работает только с плоскими (не древовидными) типами записей.
Функция срабатывает на хуке template_redirect:
add_action( 'template_redirect', 'wp_old_slug_redirect' );
Эту функцию не нужно использовать где-либо, она используется в ядре автоматически.
Чтобы показать как работает функция рассмотрим пример:
Допустим у нас была запись с заголовком "Привет" и ссылкой example.com/привет
. Мы изменили ярлык (slug) записи и ссылка стала example.com/privet
. При этом во время изменения ярлыка WP автоматически сохранил старый ярлык в метаполе _wp_old_slug
- туда записалось %d0%bf%d1%80%d0%b8%d0%b2%d0%b5%d1%82
— слово "привет" обработанное urlencode().
Теперь, если зайти на старый адрес example.com/привет
, то прежде, чем показать пользователю 404 ошибку, WP вызывает wp_old_slug_redirect(), которая с помощью функций _find_post_by_old_slug() или _find_post_by_old_date() пытается найти ID записи, у которой раньше был запрашиваемый в URL ярлык или дата (поиск по метаполю _wp_old_slug
или _wp_old_date
). Если запись удаётся найти, то функция перенаправляет по новому адресу с 301 ответом сервера.
Поиск по дате нужен, когда в ЧПУ используется дата. В этом случае при изменении даты записи, старая дата записывается в метаполе _wp_old_date
.
У записи может быть сколько угодно старых ярлыков.
Хуки из функции
Возвращает
null
. Ничего (null).
Использование
wp_old_slug_redirect();
Примеры
#1 Отключим проверку и редирект со старых слагов
По умолчанию при посещении каждого отдельного не древовидного поста WP делает запрос в БД и проверяет все метаполя (_wp_old_slug) всех записей, нет ли там ярлыка от текущего запроса. Если такое метаполе найдено, то текущий запрос считается старым URL записи, поэтому делается редирект на новый URL записи.
Если вдруг вам такое поведение не нужно, то можно отключить эту проверку и редирект через фильтр:
remove_action( 'template_redirect', 'wp_old_slug_redirect' );
Какой делается запрос смотрите в функции _find_post_by_old_slug().
Список изменений
С версии 2.1.0 | Введена. |