WordPressのCookieのナゾ

本日、”TinyMCE Templates”プラグインをアップデートしたのですが、アップデートの発端は海外のユーザーからの不思議な不具合報告が発端でした。

2つのCookie

WordPressでは、複数のCookieが発行されています。

それぞれの役割を詳細には調べていませんが、ログイン状態の有無に直接関係あるCookieは、以下の2つのCookieです。

名前 対象パス 有効期限
wordpress_xxxxx /wp-admin 2週間
wordpress_logged_in_xxxx / 2週間

この2つのCookieは多くの場合は管理画面にログインする際に同時に発行されますが、以下のように役割が違うようです。

  • wordpress_xxxx の Cookie は管理画面にログインするために使用され、is_user_logged_in() はこの Cookie を判別して true か false を判断している。
  • wordpress_logged_in_xxxx のCookie はサイト側でログインの有無を判別するために使用され、コメントフォームやAdminバーの表示は、この Cookie によって判別されているが管理画面にはログイン出来ない。

どういうシチュエーションでそうなるのかはソースを追いかけきれていないので不明なのですが、少なくとも私のプラグインの複数のユーザーによる報告では以下のような現象が起こりうるようです。

  • 2つの Cookie のうち wordpress_logged_in_xxxx Cookie の有効期限が先に切れてしまう。
  • その結果、管理画面にはログインできるけど、/wp-admin より上の階層ではログインしていないと判断される。
    (この場合Adminバーが表示されていないけど管理画面は開けるなどの不思議な現象が発生します。)

あいにく私が作ったプラグインは管理画面からAjaxでリクエストしてmod_rewrite経由でドキュメントルート直下のJSONにアクセスします。

その際、セキュリティのためにログインの有無をJSON側で判別していたのですが、それが災いして上記のような状況ではJSONが出力されないという不具合が発生しました。

回避方法

これが仕様なのかバグなのか判断できないのですが、セキュリティ上では厳しい方向へ働いていると思われますので、この部分をプラグインでどうこうするのは危険だと判断しました。

もし、認証まわりで不思議な現象が発生した場合は、一度ログアウトして再度ログインすると、上述した現象は解消するようです。