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