wp_safe_redirect()WP 2.3.0

Безопасное перенаправление. Перенаправляет с помощью wp_redirect() предварительно проверив хост на наличие в базе разрешенных хостов.

Прежде чем перенаправить на указанный хост, функция проверяет его и перенаправление произойдет только в том случае, если хост присутствует в базе разрешенных хостов (по умолчанию: домен сайта).

Если хост не разрешен, то пользователя перенаправит на http://example.com/wp-admin, вместо указанной ссылки. С помощью такого подхода можно оградить пользователей от попадания на небезопасный сайт.

Список разрешенных хостов может быть расширен плагинами, см. хук allowed_redirect_hosts.

По умолчанию в разрешенные хосты WP входит только текущий хост (домен) сайта.

Смотрите также: wp_validate_redirect() - функция которая проверяет URL для перенаправления.

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

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

Работает на основе: wp_redirect(), wp_sanitize_redirect(), wp_validate_redirect()
Хуки из функции

Возвращает

true|false. Ничего не возвращает.

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

wp_safe_redirect( $location, $status );

exit;
$location(строка) (обязательный)
URL перенаправления.
$status(число)
Статус перенаправления.
По умолчанию: 302
$x_redirect_by (строка|false) (WP 5.1)

Идентификатор того, кто сделал редирект. Позволяет плагинам указывать себя в редиректах.

Указанная тут строка будет добавлена в заголовок X-Redirect-By ответа редиректа. Пр: X-Redirect-By: WordPress.

По умолчанию: 'WordPress'

Примеры

0

#1 Безопасное перенаправление

Представим, что ссылку для перенаправления мы передаем функции wp_safe_redirect() и она меняется в зависимости от действий пользователя, т.е. может быть всегда разной. А нам нужно сделать так, чтобы перенаправление было только на внутренние страницы сайта. Нам поможет такой код:

if( isset( $_POST['location'] ) && $location = $_POST['location'] ){
	wp_safe_redirect( $location );
	exit;
}

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

С версии 2.3.0 Введена.
С версии 5.1.0 The return value from wp_redirect() is now passed on, and the $x_redirect_by parameter was added.

Код wp_safe_redirect() WP 6.7.1

function wp_safe_redirect( $location, $status = 302, $x_redirect_by = 'WordPress' ) {

	// Need to look at the URL the way it will end up in wp_redirect().
	$location = wp_sanitize_redirect( $location );

	/**
	 * Filters the redirect fallback URL for when the provided redirect is not safe (local).
	 *
	 * @since 4.3.0
	 *
	 * @param string $fallback_url The fallback URL to use by default.
	 * @param int    $status       The HTTP response status code to use.
	 */
	$fallback_url = apply_filters( 'wp_safe_redirect_fallback', admin_url(), $status );

	$location = wp_validate_redirect( $location, $fallback_url );

	return wp_redirect( $location, $status, $x_redirect_by );
}