web-dev-qa-db-fra.com

Obtenir une redirection avant la sortie de l'en-tête

Quiconque connaît un moyen de tromper WordPress en lui faisant une redirection d'emplacement d'en-tête. Je dois vérifier si les utilisateurs sont connectés ou non, et sinon les rediriger vers le système d'autorisation de notre organisation, qui est un site externe.

Je reçois une sortie avant mon appel à header (), de WordPress produisant les scripts en file d'attente.

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

J'ai un plugin, qui avait un gestionnaire de classe, qui gère ça avec cette méthode:

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

Mettre à jour:

Cette méthode est appelée via un filtre GravityForms:

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

Ce qui charge essentiellement les informations dans un formulaire de page. L'utilisateur doit être connecté pour que ce formulaire puisse être rempli (donc la vérification $webAuth->isLoggedIn()). Bien entendu, je suis conscient du fait que les en-têtes sont générés au préalable. Ma question est donc de savoir comment résoudre correctement ce problème dans WordPress afin de pouvoir rediriger les utilisateurs non autorisés vers le journal, sans être masqué par les en-têtes précédents.

2
cj5

Votre méthode s'appelle trop tard. Je ne sais pas comment vous appelez cette méthode mais vous devez l'exécuteravantla sortie est envoyée au navigateur - généralement cela signifie avant get_header(). Un certain nombre de crochets peuvent être utilisés. Par exemple (from https://wordpress.stackexchange.com/a/131210/21376 ):

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

Sans plus de contexte, il est impossible de dire exactement quel est le bon crochet.

5
s_ha_dum

Je ne connais rien à Gravity Forms, mais il est difficile de croire qu’il n’y ait pas de hook plus ancien que vous pouvez utiliser pour mettre la logique de redirection. Cela peut vous obliger à modifier une partie du code, à passer par le code source, etc., mais c'est vraiment un problème de logique de votre côté.

Cela dit, il existe une solution de contournement que je vous conseillerais personnellement de ne pas utiliser, mais elle peut fonctionner jusqu'à ce que vous disposiez de plus de temps pour examiner le problème. C'est ce qu'on appelle la mise en mémoire tampon de sortie: vous demandez fondamentalement à PHP de conserver la sortie jusqu'à ce que vous lui disiez de la "libérer", à savoir, après avoir épuisé toutes les redirections possibles. Il a de nombreuses mises en garde , alors soyez avisé.

Vous pourriez mettre quelque chose dans ce sens sur le functions.php de votre thème:

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();
}

Je suppose que gform_pre_render est déclenché après init et avant wp_footer, mais vous devrez peut-être ajuster en conséquence.

Avec plus d’informations, nous pourrons peut-être mieux vous répondre.

2
Tomas Buteler

Le problème principal que vous rencontrez le plus probablement n’appelle pas votre fonction assez tôt dans le processus de chargement WP. Cela dépend du hook d’action que vous utilisez pour appeler votre fonction. Voir le Référence d'action WordPress pour l'ordre approprié.

Un autre commentaire sur votre code, vous devriez appeler exit; au lieu de return; après wp_redirect(); selon le WordPress Codex

EDIT: Pour clarifier les éléments de référence d’action, plus vous pouvez fournir de contexte pour indiquer quand, où et comment votre fonction est appelée, plus vous pouvez aider tout le monde!

1
David

Le hook approprié à utiliser est template_redirect, ce qui vous permet de disposer des informations nécessaires pour effectuer des vérifications tout en étant suffisamment tôt pour effectuer une redirection. Selon l'exemple de la page du codex:

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

Page Codex ici - template_redirect

0
Ashraf Slamang