WordPress как на ладони
rgbcode is looking for WordPress developers. eurobyte.ru - мощные сервера с Дата-центрами в Нидерландах и Москве. От 159 ₽/мес.

wp_old_slug_redirect()WP 2.1.0

Функция ядра, которая перенаправляет пользователя со старых ссылок записи на актуальную.

Функция работает только с плоскими (не древовидными) типами записей.

Функция срабатывает на хуке 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.

У записи может быть сколько угодно старых ярлыков.

Работает на основе: _find_post_by_old_slug(), _find_post_by_old_date()
1 раз — 0.000717 сек (медленно) | 50000 раз — 21.05 сек (медленно) | PHP 7.2.5, WP 4.9.8
Хуки из функции

Возвращает

null. Ничего (null).

Использование

wp_old_slug_redirect();

Примеры

0

#1 Отключим проверку и редирект со старых слагов

По умолчанию при посещении каждого отдельного не древовидного поста WP делает запрос в БД и проверяет все метаполя (_wp_old_slug) всех записей, нет ли там ярлыка от текущего запроса. Если такое метаполе найдено, то текущий запрос считается старым URL записи, поэтому делается редирект на новый URL записи.

Если вдруг вам такое поведение не нужно, то можно отключить эту проверку и редирект через фильтр:

remove_action( 'template_redirect', 'wp_old_slug_redirect' );

Какой делается запрос смотрите в функции _find_post_by_old_slug().

Список изменений

С версии 2.1.0 Введена.

Код wp_old_slug_redirect() WP 6.6.2

function wp_old_slug_redirect() {
	if ( is_404() && '' !== get_query_var( 'name' ) ) {
		// Guess the current post type based on the query vars.
		if ( get_query_var( 'post_type' ) ) {
			$post_type = get_query_var( 'post_type' );
		} elseif ( get_query_var( 'attachment' ) ) {
			$post_type = 'attachment';
		} elseif ( get_query_var( 'pagename' ) ) {
			$post_type = 'page';
		} else {
			$post_type = 'post';
		}

		if ( is_array( $post_type ) ) {
			if ( count( $post_type ) > 1 ) {
				return;
			}
			$post_type = reset( $post_type );
		}

		// Do not attempt redirect for hierarchical post types.
		if ( is_post_type_hierarchical( $post_type ) ) {
			return;
		}

		$id = _find_post_by_old_slug( $post_type );

		if ( ! $id ) {
			$id = _find_post_by_old_date( $post_type );
		}

		/**
		 * Filters the old slug redirect post ID.
		 *
		 * @since 4.9.3
		 *
		 * @param int $id The redirect post ID.
		 */
		$id = apply_filters( 'old_slug_redirect_post_id', $id );

		if ( ! $id ) {
			return;
		}

		$link = get_permalink( $id );

		if ( get_query_var( 'paged' ) > 1 ) {
			$link = user_trailingslashit( trailingslashit( $link ) . 'page/' . get_query_var( 'paged' ) );
		} elseif ( is_embed() ) {
			$link = user_trailingslashit( trailingslashit( $link ) . 'embed' );
		}

		/**
		 * Filters the old slug redirect URL.
		 *
		 * @since 4.4.0
		 *
		 * @param string $link The redirect URL.
		 */
		$link = apply_filters( 'old_slug_redirect_url', $link );

		if ( ! $link ) {
			return;
		}

		wp_redirect( $link, 301 ); // Permanent redirect.
		exit;
	}
}
campusboy 4852youtube.com/c/wpplus
Создатель YouTube канала wp-plus, на котором делюсь своим опытом. Активный пользователь wp-kama.ru. WordPress-разработчик. Разработка сайтов и лендингов. Доработка существующих проектов. Сопровождение ресурсов.
Редакторы: Kama 9744
2 комментария
    Войти