Funzione di reindirizzamento all'interno di un codice funzione


14

Sto sviluppando un plug-in gratuito per la connessione di un sistema di supporto esterno a WordPress per poter autenticare gli utenti su WordPress.

Per questo, attualmente dal sistema esterno, l'utente viene inviato alla pagina di accesso di WordPress con questo alla fine

?action=freshdesk-remote-login

Il mio plug-in verifica quindi se l'utente ha effettuato l'accesso a WP, in caso contrario mostra il modulo di accesso e, dopo aver effettuato correttamente l'accesso, li reindirizza al sito di terze parti.

Il reindirizzamento viene eseguito utilizzando qualcosa del genere: wp_redirect( $sso_url );

Ora funziona bene, ma ho intenzione di offrire uno shortcode che potrebbe essere aggiunto a una pagina scelta dall'utente. Ora una volta che un utente accede a questa pagina, se ha effettuato l'accesso, dovrebbe essere inoltrato al sito di terze parti, in caso contrario, quindi alla pagina di accesso.

C'è un modo per suggerire a wp_redirect di lavorare all'interno di uno shortcode?

Risposte:


21

Come spiega @Rarst, gli shortcode normalmente funzionano troppo tardi per poter reindirizzare dall'interno. Di solito vengono eseguiti correttamente, il the_contentche è positivo dopo l'invio del contenuto al browser. Se è necessario reindirizzare in base alla presenza di uno shortcode, è necessario verificare tale shortcode prima che qualsiasi contenuto lasci il server.

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

Questa è "prova del concetto". Le condizioni particolari necessarie saranno probabilmente diverse. Si noti che è un po '"pesante" di elaborazione. Mi assicurerei che funzioni solo dove assolutamente necessario.


Grazie mille. Questo è semplicemente perfetto ed esattamente quello che stavo cercando.
Harish Chouhan,

Ciao, ho aggiunto alcuni controlli per assicurarmi che questo codice venga eseguito solo su una pagina specifica, tuttavia ho notato che anche l'inserimento di wp_redirect all'interno di uno shortcode funziona correttamente. Ho provato con JavaScript e anche con wp_redirect( $sso_url );e ha funzionato.
Harish Chouhan,

1
wp_redirectnon funziona con uno shortcode in condizioni normali. Ho appena controllato. Se funziona per te, il tuo tema o un plugin sta facendo qualcosa di molto simile a quello che ho suggerito per farlo funzionare.
s_ha_dum,

Si hai ragione. Mi dispiace perdere tempo. Ho avuto più istanze del tuo codice. Sono tornato a usare il tuo codice sopra :)
Harish Chouhan,

5

wp_redirect()esegue il reindirizzamento tramite le intestazioni HTTP, quindi tecnicamente non funzionerà (o almeno non dovrebbe) dopo l'avvio dell'output della pagina. Quindi non puoi semplicemente usare questa funzione in shortcode.

Ciò non significa tuttavia che non è possibile utilizzare lo shortcode per controllarlo. È possibile verificare le condizioni di adattamento (se la pagina e la pagina contiene shortcode) prima che inizi l'output (da qualche parte attorno template_redirectall'hook) ed eseguire quindi il reindirizzamento.

Un'altra opzione sarebbe quella di generare JavaScript in modo condizionale che eseguirà il reindirizzamento dopo il caricamento della pagina.


Ciao ho trovato questo: `funzione 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)); } restituisce $ form; } add_shortcode ('loginform', 'pippin_login_form_shortcode'); `Qui sembra che wp_redirect sia inserito in un shortcode.
Harish Chouhan,


@HarishChouhan dove vedi wp_redirect()quel codice?
Rarst

Ciao, mi dispiace che tu abbia ragione. Nel codice di esempio salva solo l'URL e non reindirizza effettivamente. Quindi, di conseguenza, il reindirizzamento basato su JavaScript sembra essere la mia unica opzione?
Harish Chouhan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.