Función de redireccionamiento dentro de un shortcode

14

Estoy desarrollando un complemento gratuito para conectar un sistema de soporte externo a WordPress para poder autenticar a los 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

Luego, mi complemento verifica si el usuario ha iniciado sesión en WP; si no, muestra el formulario de inicio de sesión y, después de iniciar sesión correctamente, los redirige 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 código corto que podría agregarse a una página que el usuario elija. Ahora, una vez que un usuario accede a esta página, si ha iniciado sesión, debe ser enviado al sitio de terceros, si no, a la página de inicio de sesión.

¿Hay alguna manera de sugerir que wp_redirect funcione dentro de un shortcode?

Harish Chouhan
fuente

Respuestas:

21

Como explica @Rarst, los códigos cortos normalmente se ejecutan demasiado tarde para que puedas redirigirlos desde dentro de uno. Por lo general, se ejecutan en el the_contentgancho, que es mucho después de que el contenido se envía al navegador. Si necesita redirigir en función de la presencia de un código corto, debe verificarlo antes de que el 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()) {
      // redirect to third party site
    } else {
      // login form or redirect to login page
    }
  }
}
add_action('template_redirect','pre_process_shortcode',1);

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

s_ha_dum
fuente
Gracias una tonelada Esto es perfecto y exactamente lo que estaba buscando.
Harish Chouhan
Hola, agregué algunas comprobaciones para asegurarme de que este código solo se ejecuta en una página específica, sin embargo, noté que colocar wp_redirect dentro de un shortcode también funciona bien. Intenté con javascript y también con wp_redirect( $sso_url );y simplemente funcionó.
Harish Chouhan
1
wp_redirectno funciona en un shortcode en condiciones normales. Acabo de verificar. Si funciona para usted, su tema o un complemento está haciendo algo muy parecido a lo que sugerí para que funcione.
s_ha_dum
Sí, tiene usted razón. Perdón por hacerte perder tiempo. Tuve múltiples instancias de tu código. He vuelto a usar su código anterior :)
Harish Chouhan
5

wp_redirect()realiza la redirección a través de encabezados HTTP, por lo que técnicamente no funcionará (o al menos no debería funcionar) después de que comience la salida de la página. Por lo tanto, no puede usar esta función en shortcode.

Lo que no significa, sin embargo, no puede usar shortcode para controlarlo. Puede verificar las condiciones de ajuste (si la página y la página contienen código corto) antes de que comience la salida (en algún lugar alrededor del template_redirectgancho) y luego realizar la redirección.

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

Rarst
fuente
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'); `Parece que wp_redirect se coloca dentro de un shortcode.
Harish Chouhan
@HarishChouhan, ¿dónde ves wp_redirect()ese código?
Rarst
Hola, lamento que tengas razón. En el código de ejemplo, solo guarda la URL y en realidad no redirige. ¿Entonces, según usted, la redirección basada en JavaScript parece ser mi única opción?
Harish Chouhan