Funzione di reindirizzamento all'interno di uno Shortcode
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?

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.

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

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.

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.

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.

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.

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

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

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.
