wp-login.phpが白紙、wp-adminにリダイレクトされない

 WordPressとatahualpaで構築をお手伝いしたサイト様から、「ブログパーツを付けたらログインできなくなった!」と緊急連絡が入りました。
 「どこに何を貼りつけて、その後何をしましたか」と詳細を尋ねるメールを返したのですが、海外のこともあってすぐの返答が期待できず、とりあえず対応開始。
 どうもヘッダにスクリプト貼り付け、その後外したのに直らないらしいのですが、確かにヘッダに貼り付けられています。しかし出力されたソースを見ると、DOCTYPE宣言の前にスクリプトが吐かれていて、この時点で貼り付ける場所を間違えすぎています。

 そんなことを言っても始まらないので、ログインしてみようとすると(/wp-admin/にログイン前にアクセスすると/wp-login.phpにリダイレクトされ、ここで認証が行われる)、確かに白紙ページになってしまいます。
 通常、wp-login.phpで認証成功すれば、/wp-admin/(/wp-admin/index.php)にリダイレクトされるはずなのですが、ここでコケているようです。
 非常に不吉なことに、なぜかログイン画面でも貼り付けたスクリプト(ブログパーツ)が表示されています。コイツが悪さをしているのは一目瞭然です。

 まずはスクリプト貼り付け先ですが、普通に考えれば themes/atahualpa/header.php が書き換えられているはずです。
 ところが、このファイルを見てもスクリプトはありません。
 後から分かったのですが、運営者の方が慌ててスクリプトを外そうとし、header.phpからは取り除いていたようです。
 しかし彼がスクリプトを最初に貼り付けたのはheader.phpではなく、結論から言えば themes/atahualpa/functions/bfa_header_config.php でした。
 確かにこのスクリプトも管理画面から弄ることができて(考えてみるとこれも危ないなー)、かつこれを変更するとheader.phpも書き換えられるようです。
 向こうから報告が来る前に、この変更は見つけたので、スクリプトを外します。
 これでスクリプトは消滅し、サイトにもログイン画面にも表示されなくなったのですが、それでもwp-login.phpからのリダイレクトは失敗し、同じwp-login.phpが白紙で表示されてしまいます。

 wp-login.php 479行目あたりの

wp_safe_redirect($redirect_to);

 がコケて(リダイレクトされず)そのままexitまで行ってしまうので白紙表示になっているのですが、原因不明。
 とりあえずプラグインを全無効化(管理画面に入れないのでバックアップを取ってFTP削除)、さらにtheme以下以外のすべてのファイルを最新版に上書きしても、事象解消せず。
 theme以下に原因があることはハッキリしたのですが、ちょっと焦りました。

 冷静に考えれば、header(“Location://hoge.com/”);のコケそうなパターンは、ヘッダ出力前に何か変なものが出力されてしまっている、という状況です。よくありますね。
 問題はどこで吐かれているのかですが、弄った先は限定されているわけですから、bfa_header_config.phpをもう一度よーく見てみると、?>でphpスクリプトが終了した後に、改行が何個かあります。
 bfa_header_config.phpファイルは、読み込むとphpスクリプト以外がそのまま吐かれる対象のようです。試しにこの余計な改行を削除して再試行したところ、見事リダイレクトされてログイン成功しました。

 珍しいパターンかもしれませんが、似たところにハマった方のために記録しておきます。
 「変なものを先に吐いちゃってリダイレクト失敗」はよくあるパターンで、WordPressのログインはwp-login.phpに一度戻ってからリダイレクト、という方式なので、ログインできない時はこのパターンも一応疑ってみた方が良いです。

4798022012WordPress 2.7対応「導入&カスタマイズ」実践ガイド―個人ブログも企業サイトも簡単&無料で構築できる!
秀和システム 2009-02