WordPress как на ладони
wordpress jino

wp_redirect() WP 1.5.1

Перенаправляет (редиректит) на указанный УРЛ, можно указать статус редиректа (301, 302...).

Для правильной работы функции нужно указывать полный УРЛ:

http://www.example.com/blog/post_name
ftp://ftp.example.com/users/h/harriet/www/

После функции нужно обрывать работу скрипта функцией exit() или die().

В WordPress есть аналогичная функция для редиректа: wp_safe_redirect(). Отличается тем, что проверяет переданный адрес и сравнивает его со списком разрешенных хостов, если хост не найден, то перенаправления не происходит. «Белым» списком можно управлять с помощью фильтра allowed_redirect_hosts.

Другими словами, wp_safe_redirect() рекомендуется использовать всегда, особенно когда $url передается пользователем, а wp_redirect() нужно использовать когда мы намеренно хотим перенаправить пользователя на любой другой сайт, как правило тут $url жестко прописывается в коде, а не передается от пользователя.

// мы точно не знаем указан URL на наш сайт или нет и нам нужно избежать неожиданных редиректов.
wp_safe_redirect( $url );

// мы намеренно перенаправляем на другой сайт, URL прописываем жестко.
wp_redirect( 'https://example.com/some/page' );

wp_redirect() вызовет PHP ошибку, если использовать функцию после того, как заголовки (header) были отправлены. Т.е. если мы вызовем функцию в файле темы, отвечающем за вывод контента, то функция работать не будет. В таких случаях, в виде некой альтернативы, можно использовать редирект на javascript: document.location.href = 'http://site.ru';

Это функция типа pluggable — её можно заменить из плагина. Это значит, что она будет работать только после подключения всех плагинов, до этого момента функция еще не определена... Поэтому нельзя вызывать эту и зависящие от нее функции прямо из кода плагина. Их нужно вызывать через хук plugins_loaded или позднее, например хук init.

Замена (переопределение) — в плагине можно создать функцию с таким же названием, тогда она заменит текущую фукнцию.

Используется в: wp_safe_redirect().
Хуки из функции:

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

wp_redirect( $location, $status );
exit;
$location(строка) (обязательный)
УРЛ страницы на которую нужно перенаправить.
По умолчанию: нет
$status(число)

Статус код перенаправления (код состояния HTTP):

  • 300 — Multiple Choices (Множество выборов);
  • 301 — Moved Permanently (Перемещено окончательно);
  • 302 — Found (Найдено);
  • 303 — See Other (Смотреть другое);
  • 304 — Not Modified (Не изменялось);
  • 305 — Use Proxy (Использовать прокси);
  • 306 — (зарезервировано);
  • 307 — Temporary Redirect (Временное перенаправление).

Статус 302 означает временное изменение адреса. Если роботу нужно указать, что страница перемещена навсегда, используйте статус — 301. Полный список статусов смотрите здесь.

По умолчанию: 302

Примеры

#1. Внутренний редирект

Пример перенаправления на главную страницу блога:

wp_redirect( home_url() ); 
exit;

#2. Внешний редирект

Редирект может быть и внешним. В примере, мы установили статус код редиректа в 301, что означает что данная страница (страница с которой мы перенаправляем) перемещена навсегда:

wp_redirect( 'http://www.example.com', 301 ); 
exit;

#3. Редирект через хук template_redirect

Этот пример показывает как в WordPress перенаправить пользователя на другую страницу, с возможностью проверить на какой странице сайта он находится сейчас. Т.е. в момент редиректа WP уже определил отображаемую страницу.

Для примера, допустим, нам нужно перенаправить пользователя, если он посетил страницу с ID 10:

add_action( 'template_redirect', function() {
	if( is_page(10) ){
		wp_redirect( 'http://example.org/path/to/subscribe', 301 );
		exit;
	}
} );

Код wp redirect: wp-includes/pluggable.php VER 4.9.1

<?php
function wp_redirect($location, $status = 302) {
	global $is_IIS;

	/**
	 * Filters the redirect location.
	 *
	 * @since 2.1.0
	 *
	 * @param string $location The path to redirect to.
	 * @param int    $status   Status code to use.
	 */
	$location = apply_filters( 'wp_redirect', $location, $status );

	/**
	 * Filters the redirect status code.
	 *
	 * @since 2.3.0
	 *
	 * @param int    $status   Status code to use.
	 * @param string $location The path to redirect to.
	 */
	$status = apply_filters( 'wp_redirect_status', $status, $location );

	if ( ! $location )
		return false;

	$location = wp_sanitize_redirect($location);

	if ( !$is_IIS && PHP_SAPI != 'cgi-fcgi' )
		status_header($status); // This causes problems on IIS and some FastCGI setups

	header("Location: $location", true, $status);

	return true;
}

Cвязанные функции

Из метки: Вспомогательные

Еще из раздела: Без рубрики

wp_redirect 29 комментариев
Полезные 5 Вопросы 2 Все
  • Александр cайт: garmonia-s.com

    После всех редиректов надо гугл-ботом проверить страницу, чтоб не получилась переадресация бесконеная.

    Ответить3 месяца назад #
  • Здравствуйте, не до конца понятно как сделать редирект например с страницы http://example.org/old/ на страницу http://example.org/new/ - можете показать пример?

    Ответитьмесяц назад #
    • Kama4697

      В файле, который отвечает за вывод страницы http://example.org/old/ используешь такой код:

      wp_redirect( 'http://example.org/new', 301 ); 
      exit;
      Ответить29 дней назад #
  • Привет, коллеги!
    Столкнулся с проблемой:

    Так работает:
    wp_redirect(home_url() . '/ru/401-unauthorized-ru' . '?mv_var=' . $current_url);
    А так не работает:
    wp_redirect(home_url() . '/ru/401-unauthorized-ru' . '?mv_var=' . $current_url, 401); / т.е. я всего лишь добавил код ошибки - 401 и редирект перестал работать /

    Функцию редиректа вызываю через хук
    add_action( 'template_redirect', ... );

    Так что с заголовками проблем быть не должно..
    Кто знает, в чем может быть проблема?

    Тут на форуме упоминалось (vovasik), что с кодом 404 тоже не работает

    Ответить2 дня назад #

Здравствуйте, !

Ваш комментарий