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_date() намагається знайти ID запису, у якої раніше був запитаний пошук по метаполі _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();

Приклади

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.0.2

function wp_old_slug_redirect() {
	if ( is_404() && '' !== get_query_var( 'name' ) ) {
		// Guess the current post typ 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 nottempt 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 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;
	}
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *