Funkcja przekierowania wewnątrz krótkiego kodu

14

Rozwijam bezpłatną wtyczkę do połączenia zewnętrznego systemu wsparcia z WordPress, aby móc uwierzytelniać użytkowników na WordPress.

W tym celu, obecnie z systemu zewnętrznego, użytkownik jest wysyłany na stronę logowania WordPress z tym na końcu

?action=freshdesk-remote-login

Moja wtyczka sprawdza następnie, czy użytkownik jest zalogowany do WP, jeśli nie, wyświetla formularz logowania i po udanym logowaniu przekierowuje go z powrotem do strony trzeciej.

Przekierowanie odbywa się za pomocą czegoś takiego: wp_redirect( $sso_url );

Teraz działa to dobrze, ale planuję zaoferować krótki kod, który można dodać do strony wybranej przez użytkownika. Teraz, gdy użytkownik przejdzie na tę stronę, jeśli jest zalogowany, powinien zostać przekierowany do strony trzeciej, jeśli nie, to na stronę logowania.

Czy istnieje sposób, w jaki możesz zasugerować wp_redirect do pracy w obrębie krótkiego kodu?

Harish Chouhan
źródło

Odpowiedzi:

21

Jak wyjaśnia @Rarst, skróty zwykle działają zbyt późno, aby można było przekierować z jednego z nich. Zwykle działają na the_contenthaku, który jest dobrze po przesłaniu zawartości do przeglądarki. Jeśli musisz przekierować na podstawie obecności krótkiego kodu, musisz sprawdzić ten krótki kod, zanim jakakolwiek zawartość opuści serwer.

function pre_process_shortcode() {
  if (!is_singular()) return;
  global $post;
  if (!empty($post->post_content)) {
    $regex = get_shortcode_regex();
    preg_match_all('/'.$regex.'/',$post->post_content,$matches);
    if (!empty($matches[2]) && in_array('yourshortcodeslug',$matches[2]) && is_user_logged_in()) {
      // redirect to third party site
    } else {
      // login form or redirect to login page
    }
  }
}
add_action('template_redirect','pre_process_shortcode',1);

To jest „dowód koncepcji”. Konkretne warunki, których potrzebujesz, będą prawdopodobnie różne. Zauważ, że jest to dość „ciężki” proces przetwarzania. Upewniłbym się, że działa tylko tam, gdzie jest to absolutnie konieczne.

s_ha_dum
źródło
Dzięki za tonę. To jest po prostu idealne i dokładnie to, czego szukałem.
Harish Chouhan
Witaj, Dodałem kilka sprawdzeń, aby upewnić się, że ten kod działa tylko na określonej stronie, jednak zauważyłem, że umieszczenie wp_redirect wewnątrz shortcode również działa dobrze. Próbowałem z javascript, a także z wp_redirect( $sso_url );i to po prostu działało.
Harish Chouhan,
1
wp_redirectnie działa w krótkim kodzie w normalnych warunkach. Właśnie sprawdziłem. Jeśli działa dla Ciebie, Twój motyw lub wtyczka działa podobnie do tego, co zasugerowałem, aby działało.
s_ha_dum
Tak masz rację. Przepraszam za marnowanie czasu. Miałem wiele wystąpień twojego kodu. Wróciłem do używania powyższego kodu :)
Harish Chouhan,
5

wp_redirect()wykonuje przekierowanie za pośrednictwem nagłówków HTTP, więc technicznie nie będzie (a przynajmniej nie powinno) działać po uruchomieniu wyjścia strony. Więc nie możesz po prostu użyć tej funkcji w skrócie.

Co nie znaczy, że nie można go używać do sterowania krótkim kodem. Możesz sprawdzić warunki dopasowania (jeśli strona i strona zawiera krótki kod) przed rozpoczęciem drukowania (gdzieś wokół template_redirectzaczepu) i wtedy przekierować.

Inną opcją byłoby wyjście warunkowo JavaScript, który będzie przekierowywać po załadowaniu strony.

Rarst
źródło
Cześć Znalazłem to: `function pippin_login_form_shortcode ($ atts, $ content = null) {extract (shortcode_atts (array ('redirect' => ''), $ atts)); if (! is_user_logged_in ()) {if ($ redirect) {$ redirect_url = $ redirect; } else {$ redirect_url = get_permalink (); } $ form = wp_login_form (array ('echo' => false, 'redirect' => $ redirect_url)); } return $ form; } add_shortcode ('loginform', 'pippin_login_form_shortcode'); `` Wygląda na to, że wp_redirect jest umieszczony w krótkim kodzie.
Harish Chouhan
Link do strony to pippinsplugins.com/wordpress-login-form-short-code
Harish Chouhan
@HarishChouhan, gdzie widzisz wp_redirect()ten kod?
Rarst
Cześć, przepraszam, masz rację. W przykładowym kodzie po prostu zapisuje adres URL, a nie przekierowuje. Czy zatem według ciebie przekierowanie oparte na JavaScript wydaje się być moją jedyną opcją?
Harish Chouhan