Какой хук следует использовать для добавления действия с перенаправлением?
Я хочу создать плагин, который берет определенные параметры URL из строки запроса для создания новой строки запроса для той же страницы. Я следую отличной книге Professional WordPress Plugin Development, но я не уверен, какой хук использовать для этого действия. Вот моя функция действия:
add_action( 'init', 'tccl_redirect' );
function tccl_redirect() {
header ( "Location: http://www.mysite.com/$mypage?$newparam=$newvalue" );
?>
Какие хуки подходят для перенаправлений через header?

Я бы сказал template_redirect
. Но взгляните на Справочник действий.
Пример
Не забудьте использовать exit()
при редиректе.
/**
* Этот пример перенаправляет всё на страницу index.php
* Вы можете сделать то же самое для панели управления с помощью admin_url( '/' );
* Или просто основывать редирект на условиях, таких как
* функции is_*(), current_user_can( 'capability' ), глобальные переменные, get_current_screen()...
*
* @return void
*/
function wpse12535_redirect_sample() {
exit( wp_redirect( home_url( '/' ) ) );
}
add_action( 'template_redirect', 'wpse12535_redirect_sample' );

Как ответил kaiser, хук template_redirect
действительно подходит для редиректов.
Также вам следует использовать функцию wp_redirect()
вместо установки заголовков вручную.

Спасибо за предложение, было бы интересно узнать, почему wp_redirect предпочтительнее здесь: http://wordpress.stackexchange.com/questions/12944/why-is-wp-redirect-preferable-to-a-standard-php-header-redirect

Но я бы сказал, что этот пример от kaiser не будет работать, потому что после редиректа этот хук template_redirect срабатывает снова и снова, что приведёт к бесконечной переадресации!
Лучше проверить, находитесь ли вы уже на главной странице, например так:
function wpse12535_redirect_sample() {
$current_url = 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
$site_url = get_bloginfo('siteurl') . "/";
if($current_url != $site_url)
exit( wp_redirect( home_url( '/' ) ));
}
add_action( 'template_redirect', 'wpse12535_redirect_sample');
У меня работает отлично. Есть предложения? С уважением!
