WordPress の小ネタです。WordPress のプラグインなど、更新が頻繁に必要なケースでは、時折、
「現在メンテナンス中のため、しばらくの間ご利用いただけません。」
と表示され続けて、ページをみることができなくなることがよくあります。
今回のミッション
- 「現在メンテナンス中のため、しばらくの間ご利用いただけません。」を速攻解除する
WordPress で長時間「現在メンテナンス中のため・・・」が出続ける理由
簡単に言ってしまうと、wp-settings.php 内で呼び出している wp_maintenance() で決定されます。
wp_maintenance() という関数は、WordPress をインストールしたディレクトリに ".maintenance" があるかどうかをまずチェックします。そのファイルがあれば、アップグレード作業を開始した時間から 10分以内であれば、「現在メンテナンス中のため・・・」という表示を出すようになっています。
ということは、高々 10分待てば、これが解除されると言うことにはなります。
ところが、スマホから接続しているなど、時間が競っているときは10分も待てない、また更新インストールすべきプラグインやらが 10個もあれば最大で 100分待ちと言うこともあり得ます。
WordPress の「現在メンテナンス中のため・・・」を速攻消す方法
速攻消すということは、インストールやアップグレード作業を開始してから 10分経過していない状態で、このこざかしい警告を消したいというケースです。その場合は、まず WordPress をインストールしたホームディレクトリにアクセスして、".maintenance" を消せば一件落着です。
".maintenance" ファイルを消す一般的な方法
ファイルを消すだけですので、サーバーに必要権限でアクセスできれば普通に消すことができます。一般的なアクセス方法としては FTP を使うのが簡単です。なお、ファイルリスト取得コマンドは "NLIST -la" などにしておく必要があります。図は NextFTP での例です。
Xserver の場合、".maintenance" ファイルを安全に消す方法
Xserver や他のレンタルサーバーの場合、FTP 等でアクセスしてファイルを消去する方法など様々ありますが、間違いが無いのが WebFTP を利用する方法です。
Xserver のアカウントにアクセスして、操作メニューから「ファイル管理」を選びます(図のマル1)。
独自ドメインを利用している場合は、「ドメイン名 / public_html」下のディレクトリが今回の目的の場所になります。
図のマル2で ".maintenance" を選んでチェックを入れます。それてマル3の削除をクリックして消します。
メンテナンス強制脱出後の仕上げ
メンテナンスモードは強制解除したとしても、WordPress の「更新」マークが残り続けてしまうことがあります。もちろん更新はすべて完了しているのに、未更新のものがあるというという警告です。
これもデータベースを上書きすることで、解消できますが、手っ取り早いのは「更新」画面から「翻訳を更新」をクリックして解消するという方法です(図のマルAをクリック)。
翻訳の更新は時々、表示が消えることがありますので、更新表示周りで悩んだらとりあえずクリックしてみると解消できるかもしれません。
WordPress で永久に「現在メンテナンス中のため・・・」にする方法
しばらく本格的なメンテナンスをしたくなることがあるかもしれません。例えば WordPress をあきらめて、他のスクリプトを使う、あるいはシステム不可を考えて HTML ファイルだけのサイトにするなどです。また、データベースのバックアップ中など、その際は、メンテナンスモードを長く存続させたいことになります。
誰でも思いつくことは、".maintenance" ファイルをフォームディレクトリ(WordPress をインストールしたディレクトリ)に置くことです。しかし、単純に置いてもメンテナンスモードにはなりません。
".maintenance" ファイルには、アップグレード作業を開始した時間がUNIX時刻で書かれています。
<?php $upgrading = 1589864404; ?>
赤字部分がUNIX時刻です。
この値が、常に現時刻と 10分以内であれば、WordPress はメンテナンスモードを継続し続けます。つまり、現時刻を刻む関数(変数)を書き込んでやれば、常に10分以内です。
<?php $upgrading = time(); ?>
time 関数は、現在の UNIX 時刻を返します。
10 分以内ならメンテナンスモードになるので、
<?php $upgrading = time() - 3*60; ?>
として、常に3分前の UNIX 時刻を返すように設定しても結果は同じになります。