Función de redirección dentro de un Shortcode

1 jun 2013, 15:09:22
Vistas: 19.8K
Votos: 15

Estoy desarrollando un plugin gratuito para conectar un sistema de soporte externo a WordPress para poder autenticar usuarios en WordPress.

Para esto, actualmente desde el sistema externo, el usuario es enviado a la página de inicio de sesión de WordPress con esto al final

?action=freshdesk-remote-login

Mi plugin entonces verifica si el usuario ha iniciado sesión en WP, si no, muestra el formulario de inicio de sesión y después de un inicio de sesión exitoso, los redirige de vuelta al sitio de terceros.

La redirección se realiza usando algo como esto: wp_redirect( $sso_url );

Ahora esto funciona bien, pero planeo ofrecer un shortcode que pueda agregarse a una página que el usuario elija. Ahora, una vez que un usuario va a esta página, si ha iniciado sesión, debería ser redirigido al sitio de terceros, si no, entonces a la página de inicio de sesión.

¿Hay alguna manera en que podrías sugerir que wp_redirect funcione dentro de un shortcode?

0
Todas las respuestas a la pregunta 4
4
23

Como explica @Rarst, los shortcodes normalmente se ejecutan demasiado tarde para redirigir desde dentro de uno. Generalmente se ejecutan en el hook the_content que ocurre mucho después de que el contenido se envía al navegador. Si necesitas redirigir basado en la presencia de un shortcode, debes verificarlo antes de que cualquier contenido salga del servidor.

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()) {
      // redirigir a sitio externo
    } else {
      // mostrar formulario de login o redirigir a página de login
    }
  }
}
add_action('template_redirect','pre_process_shortcode',1);

Esto es una "prueba de concepto". Las condiciones particulares que necesites probablemente serán diferentes. Ten en cuenta que esto es un procesamiento bastante "pesado". Me aseguraría de que solo se ejecute donde sea absolutamente necesario.

1 jun 2013 20:04:51
Comentarios

Muchísimas gracias. Esto es simplemente perfecto y exactamente lo que estaba buscando.

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

Hola, agregué algunas verificaciones para asegurarme de que este código solo se ejecute en una página específica, sin embargo noté que colocar el wp_redirect dentro de un shortcode también funciona bien. Lo probé con javascript y también con wp_redirect( $sso_url ); y simplemente funcionó.

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

wp_redirect no funciona en un shortcode bajo condiciones normales. Acabo de verificarlo. Si te está funcionando, tu tema o algún plugin está haciendo algo muy parecido a lo que sugerí para que funcione.

s_ha_dum s_ha_dum
5 jun 2013 20:10:52

Sí, tienes razón. Lamento hacerte perder el tiempo. Tenía múltiples instancias de tu código. Volveré a usar tu código anterior :)

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

wp_redirect() realiza redirecciones mediante encabezados HTTP, por lo que técnicamente no funcionará (o al menos no debería) después de que haya comenzado la salida de la página. Por lo tanto, no puedes usar esta función directamente en un shortcode.

Sin embargo, esto no significa que no puedas usar un shortcode para controlarlo. Podrías verificar las condiciones adecuadas (como si es una página y la página contiene el shortcode) antes de que comience la salida (alrededor del hook template_redirect) y realizar la redirección en ese momento.

Otra opción sería generar condicionalmente JavaScript que realice la redirección después de que la página se haya cargado.

1 jun 2013 15:21:22
Comentarios

Hola, encontré esto:` 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');` Aquí parece que el wp_redirect está colocado dentro de un shortcode.

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

El enlace es http://pippinsplugins.com/wordpress-login-form-short-code/

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

@HarishChouhan ¿dónde ves wp_redirect() en ese código?

Rarst Rarst
1 jun 2013 15:43:21

Hola, lamento que tengas razón. En el código de ejemplo solo se guarda la URL y no se realiza realmente la redirección. Entonces, según lo que mencionas, ¿parece que la redirección basada en JavaScript es mi única opción?

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

Solución simple con JavaScript:

Shortcode:

[js_logout]

functions.php:

add_shortcode('js_logout', 'js_logout');
function js_logout() {
    // redirigir a la página de inicio
    $logout_url = html_entity_decode(wp_logout_url(home_url()));

    return '<p>' . __('Si no eres redirigido automáticamente, haz clic aquí:') . ' <a href="' . $logout_url . '">Cerrar sesión</a></p><script>window.location.href = "' . $logout_url . '";</script>';
}
18 may 2021 13:17:44
0

Aquí hay una solución en una sola línea.

Coloca esto en tu archivo functions.php:

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

ob_start() inicia el almacenamiento en búfer de salida, cuando se completan las acciones de template_redirect y nada se ha enviado al navegador. Esto significa que wp_redirect() funciona desde cualquier lugar:

wp_redirect( $url );
exit;

incluyendo en un shortcode. Si el script termina normalmente, sin un exit, el búfer se vacía automáticamente y toda la página se envía en ese momento.

Audaz... pero parece funcionar para mí.

13 jun 2023 04:14:59