web-dev-qa-db-ja.com

ヘッダ出力の前にリダイレクトする

WordPressを悪用してヘッダーの場所をリダイレクトする方法を知っている人はだれでも。ユーザーがログインしているかどうかを確認し、そうでない場合は外部サイトである私たちの組織の承認システムにリダイレクトします。

キューに入れられたスクリプトを出力するWordPressから、header()を呼び出す前に出力を取得しています。

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

このメソッドでこれを処理するクラスハンドラを持つプラグインがあります。

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

更新:

このメソッドはGravityFormsフィルタを介して呼び出されます。

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

これは基本的に情報をページフォームにロードします。このフォームにデータを入力するには、ユーザーがログインしている必要があります(したがって$webAuth->isLoggedIn()チェック)。明らかに私は、ヘッダが前もって出力されていることを知っています、私の質問は、不正なユーザを先行するヘッダで邪魔されずにログインにリダイレクトできるように、WordPressでこれを正しく回避する方法です。

2
cj5

メソッドの呼び出しが遅すぎます。このメソッドをどのように呼び出すかわかりませんが、実行する必要がありますbefore出力はブラウザに送信されます-通常はget_header()の前を意味します。使用できるフックがいくつかあります。たとえば(from https://wordpress.stackexchange.com/a/131210/21376 ):

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

より多くのコンテキストがなければ、正しいフックが何であるかを正確に言うことは不可能です。

5
s_ha_dum

重力フォームについては何も知りませんが、リダイレクトロジックを作成するために使用できる初期のフックがないとは信じられません。ソースコードを掘り下げるなど、コードの一部を変更するように強制することもありますが、実際には論理上の問題です。

とは言っても、私が個人的には使用しないことをお勧めする回避策がありますが、問題を調査する時間ができるまではうまくいく可能性があります。それは出力バッファリングと呼ばれます:あなたはそれを '解放'するように指示するまで出力を保持するように基本的にPHPに要求します。 これには多くの注意点があります ので、お勧めします。

あなたはあなたのテーマのfunctions.phpにこれらの線に沿って何かを置くかもしれません:

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

gform_pre_renderinitの後でwp_footerの前にトリガーされると思いますが、それに応じて調整する必要があるかもしれません。

より多くの情報があれば、私たちはあなたにより良い答えを与えることができるかもしれません。

2
Tomas Buteler

あなたが遭遇する可能性が最も高い主な問題はWP loadプロセスで十分に早くあなたの関数を呼んでいないことです。これはあなたがどのアクションフックをあなたの関数を呼ぶのに使っているかに依存します。適切な順序については、 WordPressアクションリファレンス を参照してください。

あなたのコードに対するもう一つのコメント、 WordPress Codex のようにwp_redirect();の後にexit;の代わりにreturn;を呼ぶべきです。

編集:アクション参照のものを明確にするために、いつ、どこで、そしてどのようにあなたの関数が呼ばれるかについてあなたがより多くのコンテキストを提供することができれば誰もがより多くの助けになることができます!

1
David

使用する正しいフックはtemplate_redirectで、これは実際にリダイレクトするのに十分早いうちにチェックを行うために必要な情報を利用できるようにします。コーデックスページの例に従って:

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

ここコーデックスページ - template_redirect

0
Ashraf Slamang