Wordpressを利用しているあなたは、この画面を見たことがあるだろうか。
だいぶフランクに問いかけて来ているが、
経験のある方だったら、これが悪魔のメッセージであることをご存知だろう。
どんな時におきるか
ある時、WPで熱心に投稿を書いていた。
それは、1〜2時間ではなく、夜中に途中まで書き、一度パソコンの画面を閉じて、翌日また開き続きを書きだした・・・そうこれは間違いなく超大作だ。
そして、完成に近づいたところで「下書き保存」を押して、一息つこうとしたところに、例のあの画面である。
ん、、、下書き保存をしたいと思っていたので、「もう一度お試しください」を恐る恐る押してみる。
画面がリロードされた後、よくよく投稿を見ると、、、、
半分の投稿が消えている!
リビジョンは・・・ない!
戻るボタンで戻っても・・・ない!
どんなに頑張って探しても、戻ってこない。
(( ;゚Д゚))ブルブル
(これはフィクションですが、こんな感じの事が起こるんです。)
何が原因か?
原因はNonce(ノンス)とよばれるCSRF対策が施されているため発生します。
Wordpress Codex: WordPress Nonce
nonce(ノンス)は、ある種の誤使用や悪意のある操作から URL やフォームを守るための「一度だけ使われる数値」です。WordPress の nonce は実際には数値ではなく、数字と英字で作られたハッシュです。また、本当に一度だけ使われるのではなく、無効になるまでの「有効期間」を持っています。その期間では、同じユーザーの同じコンテキストに対して、同じ nonce が生成されます。つまり、ある操作に対する nonce は、nonce の有効期間が切れるまで同じユーザーについて同じ値を保ちます。
このnonceの有効期限切れが発生することによって、更新できなくなります。またnonceの有効期限切れが発生した時点で、自動保存も効かなくなります。なので、画面を開いたまま長いこと作業をするとこのような事態を引き起こしてしまうのです。
エラーは出ないの?
出てました。ただ、これはだれも気付きません。
消えた文章は復旧できないの?
他に保存していなければ、復旧はできなそうでした。
有効期限はいつ切れるのか?
デフォルトでは、nonce の有効期間は 1 日です。
→24時間の設定です。
注意: WordPress の nonce が一度だけ使われる数値ではないという意味で、nonce の有効期間は本当の有効期間とは異なります。WordPress は 2 期(有効期間の半分が 1 期)のシステムを用いて、nonce を前期と後期の両方で検証します。デフォルト設定(有効期間が 24 時間)では、nonce に含まれる時刻データは、いくつの 12 時間区切りを過ぎたかチェックされます。ただし期の区切りは UNIX エポック を起点として計算されます。つまり、昼 12 時〜夜 12 時に作られた nonce は翌日の昼 12 時までの有効期間を持ちます。従って本当の有効期間は一定ではなく 12〜24 時間の間です。
→実際にはデフォルトの場合、12時間〜24時間となるようです。
どうすればよいのか?
まずWordpressのコミュニティでは、3年も前から最近もアクティブに議論されています。
Avoid losing data after nonces expire
https://core.trac.wordpress.org/ticket/24447
ただ、あまり緊急ではないということなんでしょうか。未だにOpenなチケットのようです。
セキュリティ対策上、止めてしまうのは問題なので、根本的な解決は難しいところです。
運用的対策
①ログインしなおす
nonceはユーザーごとに割り当てられた値です。ログアウト・ログインすることでリフレッシュされます。毎回、ログインし直すような習慣がいいかもしれません。
②下書き保存は押さずに、プレビューを押すようにする。
プレビューを押すと新しいタブが開きますが、その時に上記の画面が出たら、直ちにテキストをコピペして退避させましょう。退避後にリロードし、再度貼りつけ直せば大丈夫でしょう。
技術的対策
③自動保存に失敗したらアラートを出す(プラグイン)
一応エンジニアなので、最低限は技術的に解決したいものです。
現在問題なのが、アラートが出ていても全く気付けないことです。
そこで、自動保存が失敗した場合にjsでalertが出るようなプラグインを作って見ました。
Alert-Autosave-Error
https://github.com/nishiyamaosamu/Alert-Autosave-Error
まだgithub上にあるだけですが、これをプラグインディレクトリへ追加し、有効にすることで、もし万一自動保存に失敗しても、すぐに気付き退避可能になり、リスクを軽減できます。
さいごに
もしもっと良い解決方法をご存知の方がおりましたら、コメントお願いします。