Którego haka należy użyć, aby dodać akcję zawierającą przekierowanie?

16

Chcę zbudować wtyczkę, która pobiera niektóre parametry adresu URL z ciągu zapytania, aby utworzyć nowy ciąg zapytania dla tej samej strony. Postępuję zgodnie z doskonałą książką Professional WordPress Plugin Development, ale nie jestem pewien, jakiego haka użyć do tego działania. Oto moja funkcja akcji:

add_action( 'init', 'tccl_redirect' );
function tccl_redirect() {
    header ( "Location: http://www.mysite.com/$mypage?$newparam=$newvalue" );
?>

Które haki nadają się do przekierowań nagłówka?

jnthnclrk
źródło
Czy naprawdę chcesz zmienić końcowy adres URL, czy tylko zmienne użyte w WP_Query?
scribu
Kod, który opublikowałeś, zasadniczo przekierowałby każdą stronę, czy tego właśnie chcesz? Na jakich warunkach powinno nastąpić to przekierowanie? UWAGA: Zresztą i tak mam +1 kaiser, template_redirectbyłbym również moją sugestią.
t31os
scribu, chcę zmienić końcowy adres URL i ciąg zapytania.
jnthnclrk
t31os, uprościłem swój kod dla pytania. Rzeczywistość zawiera więcej warunków.
jnthnclrk
Jaki był wynik? Zaznacz rozwiązanie pls.
kaiser

Odpowiedzi:

13

Podobnie jak odpowiedź KAISERA, template_redirecthaczyk jest rzeczywiście odpowiedni dla przekierowań.

Powinieneś także użyć wp_redirect()funkcji zamiast ustawiać nagłówek.

Rarst
źródło
Dzięki za sugestię, nie miałbym nic przeciwko wiedzeniu, dlaczego wp_redirect jest lepszy, tutaj: wordpress.stackexchange.com/questions/12944/…
jnthnclrk
17

Powiedziałbym template_redirect. Ale spójrz na Action Reference .

Przykład

Nie zapomnij exit()o przekierowaniu.

/**
 * This example redirects everything to the index.php page
 * You can do the same for the dashboard with admin_url( '/' );
 * Or simply base the redirect on conditionals like 
 * is_*() functions, current_user_can( 'capability' ), globals, get_current_screen()...
 * 
 * @return void
 */
function wpse12535_redirect_sample() {

    exit( wp_redirect( home_url( '/' ) ) );

}

add_action( 'template_redirect', 'wpse12535_redirect_sample' );
kajzer
źródło
8

Ale powiedziałbym, że ten przykład od kaisera nie działa, ponieważ po przekierowaniu ten hook szablon_redirect działa wielokrotnie, będziesz mieć niekończące się przekazywanie !

Lepiej jest sprawdzić, czy jesteś już na stronie głównej, w ten sposób:

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');

Działa dla mnie dobrze. Jakieś sugestie? Pozdrowienia!

Alex
źródło