WordPress как на ладони
Мощный и не дорогой хостинг от Fornex.com

wp_old_slug_redirect() WP 2.1.0

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

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

Функция срабатывает на хуке template_redirect:

add_action( 'template_redirect', 'wp_old_slug_redirect' );

Эту функцию не нужно использовать где-либо, она используется в ядре автоматически.

Чтобы показать как работает функция рассмотрим пример:

Допустим у нас была запись с заголовком "Привет" и ссылкой site.ru/привет. Мы изменили ярлык (slug) записи и ссылка стала site.ru/privet. При этом во время изменения ярлыка WP автоматически сохранил старый ярлык в метаполе _wp_old_slug - туда записалось %d0%bf%d1%80%d0%b8%d0%b2%d0%b5%d1%82 — слово "привет" обработанное urlencode().

Теперь, если зайти на старый адрес site.ru/привет, то прежде, чем показать пользователю 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).

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

wp_old_slug_redirect();

Код wp_old_slug_redirect: wp-includes/query.php VER 5.0.1

<?php
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 3081youtube.com/c/wpplus
Создатель YouTube канала wp-plus, на котором делюсь своим опытом. Активный пользователь wp-kama.ru. WordPress-разработчик. Разработка сайтов и лендингов. Доработка существующих проектов. Сопровождение ресурсов.
Редакторы: Kama 7144
Комментариев нет
    Здравствуйте, !     Войти . Зарегистрироваться