Función de redirección dentro de un Shortcode
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?

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.

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

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ó.

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.

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.

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.

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

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

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í.
