Funzione di reindirizzamento all'interno di uno Shortcode

1 giu 2013, 15:09:22
Visualizzazioni: 19.8K
Voti: 15

Sto sviluppando un plugin gratuito per connettere 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 login di WordPress con questa aggiunta alla fine

?action=freshdesk-remote-login

Il mio plugin quindi verifica se l'utente ha effettuato l'accesso a WP, in caso contrario mostra il modulo di login e dopo il login avvenuto con successo, li reindirizza al sito di terze parti.

Il reindirizzamento viene effettuato usando qualcosa come questo: wp_redirect( $sso_url );

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

C'è un modo che potreste suggerire per far funzionare wp_redirect all'interno di uno shortcode?

0
Tutte le risposte alla domanda 4
4
23

Come spiega @Rarst, gli shortcode normalmente vengono eseguiti troppo tardi per poter effettuare un reindirizzamento dall'interno di uno di essi. Solitamente vengono eseguiti sull'hook the_content che avviene ben dopo che il contenuto è stato inviato al browser. Se hai bisogno di reindirizzare in base alla presenza di uno shortcode, devi verificare la presenza di quello 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()) {
      // reindirizza a un sito di terze parti
    } else {
      // form di login o reindirizzamento alla pagina di login
    }
  }
}
add_action('template_redirect','pre_process_shortcode',1);

Questo è un "proof of concept". Le condizioni specifiche di cui hai bisogno saranno probabilmente diverse. Nota che si tratta di un'elaborazione piuttosto "pesante". Mi assicurerei che venga eseguita solo quando strettamente necessario.

1 giu 2013 20:04:51
Commenti

Grazie mille. È proprio perfetto e esattamente quello che stavo cercando.

Harish Chouhan Harish Chouhan
2 giu 2013 17:52:34

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

Harish Chouhan Harish Chouhan
5 giu 2013 19:51:02

wp_redirect normalmente non funziona in uno shortcode. Ho appena verificato. Se funziona nel tuo caso, il tuo tema o un plugin stanno facendo qualcosa di simile a quello che ho suggerito per farlo funzionare.

s_ha_dum s_ha_dum
5 giu 2013 20:10:52

Sì hai ragione. Scusa per averti fatto perdere tempo. Avevo multiple istanze del tuo codice. Sono tornato a usare il codice sopra citato :)

Harish Chouhan Harish Chouhan
5 giu 2013 21:58:04
4

wp_redirect() esegue un reindirizzamento tramite intestazioni HTTP, quindi tecnicamente non funzionerà (o almeno non dovrebbe) dopo che l'output della pagina è iniziato. Quindi non puoi semplicemente usare questa funzione in uno shortcode.

Ciò però non significa che non puoi usare uno shortcode per controllarlo. Potresti verificare le condizioni appropriate (se è una pagina e la pagina contiene lo shortcode) prima che inizi l'output (da qualche parte intorno all'hook template_redirect) e quindi eseguire il reindirizzamento.

Un'altra opzione sarebbe quella di mostrare condizionalmente del JavaScript che eseguirà il reindirizzamento dopo il caricamento della pagina.

1 giu 2013 15:21:22
Commenti

Ciao, ho trovato questo:` 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');` Qui sembra che wp_redirect sia posizionato all'interno di uno shortcode.

Harish Chouhan Harish Chouhan
1 giu 2013 15:38:29

Il link è http://pippinsplugins.com/wordpress-login-form-short-code/

Harish Chouhan Harish Chouhan
1 giu 2013 15:39:58

@HarishChouhan dove vedi wp_redirect() in quel codice?

Rarst Rarst
1 giu 2013 15:43:21

Ciao, mi dispiace, hai ragione. Nel codice di esempio salva solo l'URL ma non effettua effettivamente il reindirizzamento. Quindi, secondo te, il reindirizzamento basato su JavaScript sembra essere la mia unica opzione?

Harish Chouhan Harish Chouhan
1 giu 2013 16:01:47
0

Soluzione JavaScript semplice:

Shortcode:

[js_logout]

functions.php:

add_shortcode('js_logout', 'js_logout');
function js_logout() {
    // reindirizza alla home
    $logout_url = html_entity_decode(wp_logout_url(home_url()));

    return '<p>' . __('Se non vieni reindirizzato automaticamente, clicca qui:') . ' <a href="' . $logout_url . '">Logout</a></p><script>window.location.href = "' . $logout_url . '";</script>';
}
18 mag 2021 13:17:44
0

Ecco una soluzione in una riga.

Aggiungi questo nel tuo file functions.php:

add_action( 'template_redirect', function () {
    ob_start();
} );

ob_start() avvia il buffer di output, quando le azioni template_redirect sono completate e nulla è stato inviato al browser. Ciò significa che wp_redirect() funziona da qualsiasi punto:

wp_redirect( $url );
exit;

compresi gli shortcode. Se lo script termina normalmente, senza un exit, il buffer viene automaticamente svuotato e l'intera pagina viene inviata in quel momento.

Un po' audace... ma a me sembra funzionare.

13 giu 2023 04:14:59