そんな馬鹿な・・・な件ですが本当に発生したことです。
さくらインターネットのサーバーでWordPressサイトを運営している知人から「何もしてないのに突然ログイン画面が表示できなくなった」と連絡がありました。
確認したところフロントエンド(訪問者が見る画面)は正常に表示できるのに、「wp-login.php」への直接アクセスでも、「wp-admin」からのリダイレクトでも500エラーが出る症状でした。
パソコンやサイト関係で「何もしてない」っていうのは大抵・・・とも思いましたがどうやら違うようです。
早速ファイルマネージャーで該当ディレクトリを見てみると、あったはずの「.htaccess」ファイルがなくなっていました。そのサイトは標準のパーマリンクを使っているのでフロントエンドは問題なく表示されるのだろうと判断し、WordPressに必要な部分だけの.htaccessファイルをアップロードしてみましたが解決せず・・・。
大切なサイトなのでいろいろとそのままいじくりまわすのはちょっと避けたいところでしたので、こんなときはサイト全体(ファイル・フォルダとデータベース)をバックアップ。他サーバーでも同じ現象が出るのかとひとまずこのサイトを収容している「カラフルボックス」でサイトを再現したら(要するに引っ越し)、正常に表示されるではありませんか!!!
どうやらさくらインターネット特有の症状のようです(ひょっとしたら他サーバーでも発生する可能性があるかも知れません)。
別サーバーでは動作するのにさくらインターネットだけ何で??さらに混迷を極めます。
カラフルボックスのPHPのバージョンは7.2、それで正常に動作。一方さくらインターネットのPHPバージョンは5.2.7(いつの時代?)なので、カラフルボックスにあるサイトをこの環境のさくらサーバーへ移したら問題があるかも知れませんが逆は考えにくい・・・更に混迷を極める状況です。
でも・・・案外簡単な方法で解決できました。
突然ログイン(管理画面の操作)だけができなくなったときの対処
このままサイトへログインできなければサイトの存在意義もありませんし、何より別のサーバーで動くんだし、さらにはバックアップという強い味方がいるのでちょっと怖いものなしの状態。ひとまずデバックをONにしてエラー表示させてみました。
すると・・・
数々のワーニング項目はありましたが、不具合ではないので無視。唯一エラーとなっていたのが
Fatal error: Uncaught Error: Cannot create references to/from string offsets in /サイトのディレクトリ/wp-includes/user.php:54 Stack trace: #0 /サイトのディレクトリ/wp-login.php(795): wp_signon('', '') #1 {main} thrown in /サイトのディレクトリ/wp-includes/user.php on line 54
内容を要約すると
「/サイトのディレクトリ/wp-includes/user.phpの処理ができません」
「理由は/サイトのディレクトリ/wp-login.phpの795行目にあるwp_signon(”, ”)の処理がおかしいからです」
というもの。
え?WordPress標準のファイルなのに・・・なんで??状態でした。
ここは何でも載ってるインターネットに頼るしかということでエラー内容を検索してみたら、海外のサイトに解決方法が掲載されていました。
手順を紹介します。
サイトの「wp-login.php」をFTPでダウンロードします
エラーが出ているという795行目付近を見ます(行数はエラー内容を確認してください)
以下のように修正します
【修正前】
$user = wp_signon( '', $secure_cookie );
【修正後】
$user = wp_signon( array(), $secure_cookie );
サーバーの元の場所へ上書きアップロードします
これで解消されました。
この行で何が行われているのかというと、ログアウト状態(Cookieの保存期間が切れ、完全にログアウトした状態)の時に「”」という空の文字列をセットして再度ログイン画面を表示しなさいという命令が出ています。
そしてuser.phpへ「”」という空の文字列を投げ、ログイン画面を出しなさいという動作の流れのようです。
そこで「”」という空の文字列を投げたら「そんな人いましぇ~~ん」となり再び「wp-login.php」へ戻ってきて、それでも「”」なんだから処理して!!とuser.phpへ投げ、「そんな人いましぇ~~ん」・・・の繰り返し、つまり500エラーが発生していたのです。
上の変更部分は「”」という空の文字列ではなく、「array()」誰でもいいから!!という内容にしたということです。
要はサイトに登録しているユーザーが1人でもいて、ログアウト状態だったらログイン画面を出しなさい!!という風にしたのでログイン画面が表示されるようになったということなんですね。
何となくイメージつかめたでしょうか??
これで解決してめでたしめでたし!!ではあるものの、何で突然、しかもさくらインターネットに設置しているWordPressだけ発生したのか?(前述したように同じものが「カラフルボックス」では動く)甚だ疑問です。
まあとりあえず解決したからいいか・・・。
他のサーバーでも同じことが発生するかもしれませんが、ひとまずさくらサーバーで運営しているWordPressサイトで何もしていないのに突然バックエンドだけ入れなくなった、ログイン画面が500エラーで表示されなくなったという方はバックアップを取った上で試してみてください。
「何もしていない」のですからその他何もする必要はありません。
ログイン500エラーの根本原因は何?
対応が先だったので後から検証したのですが、今回の根本原因はさくらサーバーのPHPバージョンを7.2へ変更したことによりWordPressの旧バージョンで使われていた
$user = wp_signon( '', $secure_cookie );
という記述が無効になったことでした。
どのバージョンから改善後の記述に変わったのかまでは調べていませんが、WordPressのバージョン5.00では記述が変わっていましたのでWordPressのバージョンアップは必須だと思います。
※本体のバージョンアップによりテーマやプラグインでの不具合が発生する可能性があったり、サイトの表示や動作に影響が出る可能性がありますので本体のバージョンアップ前にはデータベースを含めてバックアップを取り、復元できるスキルを身に着けておく必要があるでしょう。
とはいえ、旧バージョンのWordPressもカラフルボックスサーバーでは動いたわけですし、ログインできなかったら本体のバージョンアップもできない話ですから何度も警告メールを送るなどして対応できないんでしょうかねぇ(あくまで個人の印象ですし、ひょっとしたらその知人が警告メールを捨てちゃったのかも知れないので何とも言えません・・)