Funcție de redirecționare în interiorul unui Shortcode

1 iun. 2013, 15:09:22
Vizualizări: 19.8K
Voturi: 15

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?

0
Toate răspunsurile la întrebare 4
4
23

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.

1 iun. 2013 20:04:51
Comentarii

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

Harish Chouhan Harish Chouhan
2 iun. 2013 17:52:34

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.

Harish Chouhan Harish Chouhan
5 iun. 2013 19:51:02

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.

s_ha_dum s_ha_dum
5 iun. 2013 20:10:52

Da, ai dreptate. Îmi pare rău că ți-am irosit timpul. Aveam multiple instanțe ale codului tău. Am revenit la utilizarea codului tău de mai sus :)

Harish Chouhan Harish Chouhan
5 iun. 2013 21:58:04
4

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.

1 iun. 2013 15:21:22
Comentarii

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.

Harish Chouhan Harish Chouhan
1 iun. 2013 15:38:29

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

Harish Chouhan Harish Chouhan
1 iun. 2013 15:39:58

@HarishChouhan unde vezi wp_redirect() în acel cod?

Rarst Rarst
1 iun. 2013 15:43:21

Bună, îmi pare rău, ai dreptate. În codul exemplu, acesta doar salvează URL-ul și nu realizează efectiv o redirecționare. Deci, conform spuselor tale, redirecționarea bazată pe JavaScript pare să fie singura mea opțiune?

Harish Chouhan Harish Chouhan
1 iun. 2013 16:01:47
0

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>';
}
18 mai 2021 13:17:44
0

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.

13 iun. 2023 04:14:59