Funcție de redirecționare în interiorul unui Shortcode
Dezvolt un plugin gratuit pentru conectarea unui sistem extern de suport la WordPress pentru a putea autentifica utilizatorii în WordPress.
Pentru aceasta, în prezent din sistemul extern, utilizatorul este trimis către pagina de autentificare WordPress cu următorul parametru la final:
?action=freshdesk-remote-login
Plugin-ul meu verifică apoi dacă utilizatorul este autentificat în WP, dacă nu, afișează formularul de autentificare și după autentificarea cu succes, îi redirecționează înapoi către site-ul terț.
Redirecționarea este realizată folosind ceva de genul: wp_redirect( $sso_url );
Acum acest lucru funcționează bine, dar intenționez să ofer un shortcode care ar putea fi adăugat la o pagină la alegerea utilizatorului. Acum, odată ce un utilizator accesează această pagină, dacă este autentificat, ar trebui să fie redirecționat către site-ul terț, dacă nu, atunci către pagina de autentificare.
Există vreo modalitate prin care ați putea sugera ca wp_redirect să funcționeze în interiorul unui shortcode?
După cum explică @Rarst, shortcode-urile rulează de obicei prea târziu pentru a putea face o redirecționare din interiorul unuia. Ele rulează de obicei pe hook-ul the_content
, care apare mult după ce conținutul a fost trimis către browser. Dacă trebuie să faci o redirecționare bazată pe prezența unui shortcode, trebuie să verifici existența acelui shortcode înainte ca orice conținut să părăsească serverul.
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()) {
// redirecționează către un site terț
} else {
// formular de login sau redirecționează către pagina de login
}
}
}
add_action('template_redirect','pre_process_shortcode',1);
Aceasta este o "dovadă a conceptului". Condițiile specifice de care ai nevoie vor fi probabil diferite. Reține că acesta este un proces destul de "greu". Așigură-te că rulează doar acolo unde este absolut necesar.

Mulțumesc enorm. Este exact ceea ce căutam și funcționează perfect.

Salut, am adăugat câteva verificări pentru a mă asigura că acest cod rulează doar pe o anumită pagină, dar am observat că plasarea wp_redirect în interiorul unui shortcode funcționează de asemenea bine. Am încercat cu javascript și de asemenea cu wp_redirect( $sso_url );
și a funcționat pur și simplu.

wp_redirect
nu funcționează într-un shortcode în condiții normale. Tocmai am verificat. Dacă funcționează la tine, tema ta sau un plugin fac ceva similar cu ceea ce am sugerat eu pentru a face să funcționeze.

wp_redirect()
realizează redirecționarea prin antete HTTP, deci din punct de vedere tehnic nu va funcționa (sau cel puțin nu ar trebui să funcționeze) după ce a început generarea conținutului paginii. Prin urmare, nu poți folosi pur și simplu această funcție într-un shortcode.
Totuși, asta nu înseamnă că nu poți utiliza un shortcode pentru a controla redirecționarea. Poți verifica condițiile necesare (de exemplu, dacă este o pagină și dacă conține shortcode-ul) înainte de începerea generării conținutului (de exemplu, folosind hook-ul template_redirect
) și apoi să efectuezi redirecționarea.
O altă opțiune ar fi să afișezi condiționat cod JavaScript care va executa redirecționarea după ce pagina s-a încărcat complet.

Salut, am găsit asta:` 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');` Aici se pare că wp_redirect este plasat în interiorul unui shortcode.

Linkul este http://pippinsplugins.com/wordpress-login-form-short-code/

Soluție simplă în JavaScript:
Shortcode:
[js_logout]
functions.php:
add_shortcode('js_logout', 'js_logout');
function js_logout() {
// redirecționează către pagina principală
$logout_url = html_entity_decode(wp_logout_url(home_url()));
return '<p>' . __('Dacă nu sunteți redirecționat automat, faceți clic aici:') . ' <a href="' . $logout_url . '">Deconectare</a></p><script>window.location.href = "' . $logout_url . '";</script>';
}

Iată o soluție într-un singur rând.
Puneți acest cod în fișierul functions.php
:
add_action( 'template_redirect', function () {
ob_start();
} );
ob_start()
începe bufferizarea output-ului, când acțiunile template_redirect
sunt finalizate și nimic nu a fost trimis către browser. Asta înseamnă că wp_redirect()
funcționează de oriunde:
wp_redirect( $url );
exit;
inclusiv într-un shortcode. Dacă scriptul se termină normal, fără un exit, bufferul este automat goliat și întreaga pagină este trimisă în acel moment.
Îndrăzneț... dar funcționează pentru mine.
