Hacer que la redirección ocurra antes de la salida del encabezado

2

Alguien sabe de una manera de engañar a WordPress para que realice una redirección de ubicación de encabezado. Tengo que comprobar si los usuarios han iniciado sesión o no, y si no, redirigirlos al sistema de autorización de nuestra organización, que es un sitio externo.

Estoy obteniendo una salida antes de mi llamada de cabecera (), de WordPress que genera los scripts en cola.

Warning: Cannot modify header information - headers already sent by (output started at /.../wp-includes/class.wp-scripts.php:128) in ...

Tengo un complemento, que tenía un controlador de clase, que maneja esto con este método:

...
public function populateInfo($form) {
    $email = $this->hasEmail($form);
    /*$name = $this->hasName($form);
    $address = $this->hasAddress($form);
    $phone = $this->hasPhone($form);*/

    // let's get some auth info
    if($email !== false || $name !== false || $address !== false || $phone !== false) {
        $ldap = new LDAP();
        $webAuth = new Auth();
        $curPage = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
        $webAuth->url = $curPage;
        if($webAuth->isLoggedIn()) {
            $ldap->search($webAuth->getID());

            // set up form variables
            $form['fields'][$email['key']]['defaultValue'] = $ldap->getEmail();
        } else {
            // this is where redirect fails
            wp_redirect($webAuth->login_url);
            return;
        }
    }

    return $form;
}
...

Actualización:

Este método se llama a través de un filtro GravityForms:

add_filter('gform_pre_render', array($this, 'populateInfo'));

Que básicamente carga información en un formulario de página. El usuario debe iniciar sesión para que este formulario se llene (por lo tanto, el $webAuth->isLoggedIn() check). Obviamente, soy consciente de que los encabezados se están emitiendo de antemano, mi pregunta es, ¿cómo solucionar esto correctamente en WordPress, de modo que pueda redirigir a usuarios no autorizados al inicio de sesión, sin que los encabezados anteriores los bloqueen?

    
pregunta cj5 03.02.2014 - 17:53

4 respuestas

5

Tu método se llama demasiado tarde. No sé cómo llama a este método, pero necesita ejecutarlo antes de la salida se envía al navegador, generalmente eso significa antes de get_header() . Hay una serie de ganchos que se pueden utilizar. Por ejemplo (de enlace ):

add_action(
  'template_redirect',
  function() {
    if (is_single()) {
      wp_safe_redirect(home_url());
      exit;
    }
  }
);

Sin más contexto, es imposible decir exactamente cuál es el gancho correcto.

    
respondido por el s_ha_dum 03.02.2014 - 19:01
2

No sé nada sobre Gravity Forms, pero es difícil creer que no haya un enlace anterior que puedas usar para poner la lógica de redireccionamiento. Puede que te obligue a cambiar parte del código, revisar el código fuente, etc., pero en realidad es un problema lógico.

Habiendo dicho eso, hay una solución que personalmente le recomendaría que no use, pero podría funcionar hasta que tenga más tiempo para analizar el problema. Se llama búfer de salida: básicamente le pide a PHP que se aferre a la salida hasta que le diga que lo "libere", es decir, después de haber agotado todas las redirecciones posibles. Tiene muchas advertencias , por lo que debe estar informado.

Podrías poner algo en esta línea en el functions.php de tu tema:

add_action('init', 'my_prefix_start_buffer');
function my_prefix_start_buffer() {
    ob_start();
}

add_action('wp_footer', 'my_prefix_flush_buffer');
function my_prefix_flush_buffer() {
    ob_end_flush();
}

Supongo que gform_pre_render se activa después de init y antes de wp_footer , pero es posible que tengas que ajustarlo en consecuencia.

Con más información, podríamos darte una mejor respuesta.

    
respondido por el Tomas Buteler 04.02.2014 - 22:21
1

El problema principal con el que es más probable que te encuentres es que no llamas a tu función lo suficientemente pronto en el proceso de carga de WP. Esto depende de qué gancho de acción esté utilizando para llamar a su función. Consulte la referencia de acción de WordPress para obtener el orden apropiado.

Otro comentario sobre su código, debe llamar a exit; en lugar de return; después de wp_redirect(); según el Códice de WordPress

EDITAR: para aclarar las cosas de referencia de la acción, cuanto más contexto se pueda proporcionar acerca de cuándo, dónde y cómo se llama su función, ¡más ayuda para todos!

    
respondido por el David 03.02.2014 - 18:23
0

El enganche correcto que se debe usar es template_redirect , que le permite tener la información necesaria disponible para realizar las comprobaciones y también lo suficientemente temprano para redirigir realmente. Según el ejemplo de la página del códice:

function my_page_template_redirect()
    {
    if( is_page( 'goodies' ) && ! is_user_logged_in() )
    {
        wp_redirect( home_url( '/signup/' ) );
        exit();
    }
}
add_action( 'template_redirect', 'my_page_template_redirect' );

Página de Codex aquí - template_redirect

    
respondido por el Ashraf Slamang 31.10.2016 - 07:37

Lea otras preguntas en las etiquetas