WordPress как на ладони
WordPress Meetup #4. Встречаемся в Москве 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 ошибку (Output already started. Headers not sent.), если использовать функцию после того, как заголовки (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.7

<?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вязанные функции

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

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

30 комментов
Полезные 6 Вопросы 3 Все
  • Привет, коллеги!
    Столкнулся с проблемой:

    Так работает:
    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 тоже не работает

  • Максим

    Интересный случай, делал обработку формы через admin-post.php и уже в обработчике в зависимости от условий делал редирект или назад на страничку формы в админке с уведомлением о проблеме или перебрасывал на нужную страничку, так вот, редирект сразу при выполнении не сработал, код продолжил выполняться далее, то есть у меня была проверка

    if (ошибка){
    wp_redirect(урл)
    }
    //если ошибки нету то выполняем дальше

    и у меня при истином значении ошибки wp_redirect отрабатывал (но не отправлял данные в браузер) и шло выполнение кода после условия, что как бы не правильно. Нужного поведения добился поставив после wp_redirect exit, теперь в случае ошибки код дальше не выполнялся. Мне интересно это разве правильное поведение? По идее я сразу должен был отправить браузеру редирект, а не тянуть до завершения скрипта, это я к тому что разве такое поведение wp_redirect нормальное?

    • Kama5407

      В описании же везде указано что нужно обрывать скрипт - юзать exit. Правильное поведение, почему нет... Правда не очень понятно почему exit в саму функцию не сунули под соответствующий параметр. В 99% случаев нужно использовать exit. О-очень редко бывает нужно, еще что-то делать после установки заголовков, которые ставит wp_redirect()...

  • Есть мета поле с данными post id, как можно сделать редирект на запись по этому id??

    Ответить4 месяца назад #
Здравствуйте, !     Войти . Зарегистрироваться