wp_redirectхук-фильтрWP 2.1.0

Позволяет изменить адрес перенаправления (редиректа), который передается в функцию (указывается для функции) wp_redirect().

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

add_filter( 'wp_redirect', 'wp_kama_redirect_filter', 10, 2 );

/**
 * Function for `wp_redirect` filter-hook.
 * 
 * @param string $location The path or URL to redirect to.
 * @param int    $status   The HTTP response status code to use.
 *
 * @return string
 */
function wp_kama_redirect_filter( $location, $status ){

	// filter...
	return $location;
}
$location(строка)
Путь или URL для перенаправления.
$status(число)
Статус код перенаправления (код состояния HTTP).

Примеры

0

#1 Как отследить, где происходит перенаправление

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

Ниже показано как без труда вылавливать редиректы.

При включенном дебаге, используем код:

add_filter( 'wp_redirect', 'wp_redirect_print_debug_backtrace' );

function wp_redirect_print_debug_backtrace( $location ) {

	error_log( print_r( debug_backtrace( true ), true ) );

	// или
	/*
	ob_start();
	debug_print_backtrace();
	$log = ob_get_clean();
	error_log( $log );
	*/

	return $location;
}

Ознакомьтесь с возможностями функции debug_backtrace, чтобы изменить полноту предоставляемых данных.

Также можно использовать функцию debug_print_backtrace(), но она сразу выводит данные на экран, поэтому их надо «буферить», чтобы передать в error_log().

Теперь попробуем, например, посетить страницу example.com/login/, с которой движок перенаправит нас на страницу example.com/wp-login.php. В логе мы получим следующую информацию:

Array
(
	[0] => Array
		(
			[file] => F:\server\www\wp-test.ru\wp-includes\class-wp-hook.php
			[line] => 289
			[function] => wp_redirect_print_debug_backtrace
			[args] => Array
				(
					[0] => https://wp-test.ru/wp-login.php
				)

		)

	[1] => Array
		(
			[file] => F:\server\www\wp-test.ru\wp-includes\plugin.php
			[line] => 206
			[function] => apply_filters
			[class] => WP_Hook
			[type] => ->
			[args] => Array
				(
					[0] => https://wp-test.ru/wp-login.php
					[1] => Array
						(
							[0] => https://wp-test.ru/wp-login.php
							[1] => 302
						)

				)

		)

	[2] => Array
		(
			[file] => F:\server\www\wp-test.ru\wp-includes\pluggable.php
			[line] => 1257
			[function] => apply_filters
			[args] => Array
				(
					[0] => wp_redirect
					[1] => https://wp-test.ru/wp-login.php
					[2] => 302
				)

		)

	[3] => Array
		(
			[file] => F:\server\www\wp-test.ru\wp-includes\canonical.php
			[line] => 971
			[function] => wp_redirect
			[args] => Array
				(
					[0] => https://wp-test.ru/wp-login.php
				)

		)

	[4] => Array
		(
			[file] => F:\server\www\wp-test.ru\wp-includes\class-wp-hook.php
			[line] => 287
			[function] => wp_redirect_admin_locations
			[args] => Array
				(
					[0] =>
				)

		)

	[5] => Array
		(
			[file] => F:\server\www\wp-test.ru\wp-includes\class-wp-hook.php
			[line] => 311
			[function] => apply_filters
			[class] => WP_Hook
			[type] => ->
			[args] => Array
				(
					[0] =>
					[1] => Array
						(
							[0] =>
						)

				)

		)

	[6] => Array
		(
			[file] => F:\server\www\wp-test.ru\wp-includes\plugin.php
			[line] => 478
			[function] => do_action
			[class] => WP_Hook
			[type] => ->
			[args] => Array
				(
					[0] => Array
						(
							[0] =>
						)

				)

		)

	[7] => Array
		(
			[file] => F:\server\www\wp-test.ru\wp-includes\template-loader.php
			[line] => 13
			[function] => do_action
			[args] => Array
				(
					[0] => template_redirect
				)

		)

	[8] => Array
		(
			[file] => F:\server\www\wp-test.ru\wp-blog-header.php
			[line] => 19
			[args] => Array
				(
					[0] => F:\server\www\wp-test.ru\wp-includes\template-loader.php
				)

			[function] => require_once
		)

	[9] => Array
		(
			[file] => F:\server\www\wp-test.ru\index.php
			[line] => 17
			[args] => Array
				(
					[0] => F:\server\www\wp-test.ru\wp-blog-header.php
				)

			[function] => require
		)

)

Благодаря этой отладочной информации, мы определили, что за перенаправление ответствен хук:

add_action( 'template_redirect', 'wp_redirect_admin_locations', 1000 );

Он навешивается в файле default-filters.php и запускает функцию wp_redirect_admin_locations(), которая и создает само перенаправление.

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

С версии 2.1.0 Введена.

Где вызывается хук

wp_redirect()
wp_redirect
wp-includes/pluggable.php 1396
$location = apply_filters( 'wp_redirect', $location, $status );

Где используется хук в WordPress

wp-includes/class-wp-customize-manager.php 1938
add_filter( 'wp_redirect', array( $this, 'add_state_query_params' ) );