[wordpress error] アクセスする権限がないと表示されて管理画面にログインできない場合の対処法

フォーラムを眺めていると、結構高い頻度で「あなたはこのページにアクセスする権限を持っていません。」と表示されてWPの管理画面にログインできないという申告が多いようです。エラーや発生タイミングはいろいろあるようなのですが、原因がある程度分かってきたようなので需要があるのかわかりませんが、メモがてらまとめてみます。

エラーメッセージ

WordPress 2.1系の場合

ログインすると
Warning: Invalid argument supplied for foreach() in /INSTALL_DIRECTORY/wp-includes/capabilities.php on line 31

Warning: Cannot modify header information – headers already sent by (output started at /INSTALL_DIRECTORY/wp-includes/capabilities.php:31) in /INSTALL_DIRECTORY/wp-includes/pluggable.php on line 317

Warning: Cannot modify header information – headers already sent by (output started at /INSTALL_DIRECTORY/wp-includes/capabilities.php:31) in /INSTALL_DIRECTORY/wp-includes/pluggable.php on line 318

Warning: Cannot modify header information – headers already sent by (output started at /INSTALL_DIRECTORY/wp-includes/capabilities.php:31) in /INSTALL_DIRECTORY/wp-includes/pluggable.php on line 279

投稿などは
あなたはこのページにアクセスする権限を持っていません。(本家はYou do not have sufficient permissions to access this page.)

WordPress 2.0系の場合

ログインすると
Warning: Invalid argument supplied for foreach() in /INSTALL_DIRECTORY/wp-includes/capabilities.php on line 19

Warning: Cannot modify header information – headers already sent by (output started at /INSTALL_DIRECTORY/wp-includes/capabilities.php:19) in /INSTALL_DIRECTORY/wp-includes/pluggable-functions.php on line 312

Warning: Cannot modify header information – headers already sent by (output started at /INSTALL_DIRECTORY/wp-includes/capabilities.php:19) in /INSTALL_DIRECTORY/wp-includes/pluggable-functions.php on line 313

Warning: Cannot modify header information – headers already sent by (output started at /INSTALL_DIRECTORY/wp-includes/capabilities.php:19) in /INSTALL_DIRECTORY/wp-includes/pluggable-functions.php on line 274
投稿などは
あなたはこのページにアクセスする権限を持っていません。(本家はYou do not have sufficient permissions to access this page.)

行数はカスタマイズの有無やバージョンによって異なります。エラーはこの他にもあるかも。

エラーが出るタイミング

  • 新規インストールを行い、ログインする場合
  • EUCからUTF-8に文字コードを変更した場合。またはその逆。
  • WordPressをインストールしたDBのwp_optionsを変更するプラグインをインストールした場合
  • WordPressをインストールしたDBに猛烈に負荷がかかっている場合(筆者が経験)

他にもあるかもしれません。

エラーの原因

WordPressをインストールしたデータベーステーブルwp_optionsの中にoption_nameが”wp_user_roles”のものがあります。この値option_valueには

という文字列が入っています。

ここに管理者や編集者、寄稿者や協力者といった管理画面にログインするメンバーの権限設定のデータが入っているようです。上記エラーが出るタイミングで、このデータが書き換わってしまったり、正しく書き換わらないとログインができない、投稿ができないなどの不具合が発生する、というわけです。

特に多いのが文字列情報と文字コードの不整合のようです。上記””の前についている「s:数字」の数字は””の文字数を表していて、”administrator”なら1バイト文字×13文字でs:13なのですが、”管理者”の場合文字コードによって数字が変わってきてしまいます。EUCでは漢字1文字は2バイトなので2バイト×3文字でs:6なのに対して意、UTF-8では漢字1文字は3バイトなので3バイト×3文字でs:9でなければなりません。UTF-8なのに「s:6:”管理者”」なんてなってしまっていると不具合発生です。

いまのところこの不具合はWindowsサーバー環境下でのみ発生するようです。ホスティングサーバーがWindowsサーバである場合や、お手持ちのWindowsパソコンにApacheを入れてローカル環境を構築したような場合に発生するかもしれません。

WP 2.3においてデータベースの変更があり、この情報はwp_usermetaのwp_capabilitiesに格納されるようになりました。この際に適宜データベースの適正化も図られているので2.3以降では発生しにくいんじゃないかと個人的には思っています。

解決方法

能書きはこのあたりにして、どうすればよいかというと……

修正用パッチを使う方法

「WordPress標準ガイドブック」サポートサイト » capabilities.phpのエラーが表示された場合
こちらで修正用のパッチが提供されていますので、ダウンロードして指示通り実行します。2.0系のものでローカル向けに書かれたものですが、おそらくホスティングサーバーでも、また2.1系でも大丈夫だと思います。

データベースを直接いじる場合

上記方法でうまくいかない場合や、データベースの扱いに慣れている方は直接データベースの値をいじることでも解決できます。以下phpMyAdminでの例になります。

wp_optionsを選択

phpMyAdminのWordPressデータベースを開き、wp_optionsテーブルを選択します。

表示を選択

次に「表示」を選択します。

wp_user_rolesの鉛筆アイコンを選択

wp_user_rolesの行の鉛筆アイコンを選択します。

option_valueの値を修正

option_valueの値を修正します。特に管理者以外に権限を割り振っていないのであれば、上記(エラーの原因のところの)の一文をコピー&ペーストしてもよいでしょう。修正が終わったら、保存するになっているのを確認して実行してやればOKです。

via

WordPress Japan :: トピックを表示 – WPをインストールしてログインすると権限エラーになってしまいま
「WordPress標準ガイドブック」サポートサイト » capabilities.phpのエラーが表示された場合
WordPress Japan :: トピックを表示 – 管理画面に入ろうとするとワーニングが表示される

[wordpress error] アクセスする権限がないと表示されて管理画面にログインできない場合の対処法” への18件のコメント

  1. ピンバック: mutter to oneself

  2. いつも拝見させていただいております。
    リンク先のエントリでも書いたのですが、WordPressME2.13→2.2に変更したときに、wp-config.phpに

    define(’DB_CHARSET’, ‘utf8′);
    define(’DB_COLLATE’, ”);

    の2行を追加したときに、このエラーが発生して悩まされました。
    そのときのエラー表示も

    Warning: Invalid argument supplied for foreach() in /INSTALL_DIRECTORY/wp-includes/capabilities.php on line 31

    でした。
    プラグイン導入テスト用に作成した同一環境のテスト用WPでは問題なく成功したので回kつ方法は不明で棚上げ中です。

    そういえば、2月にWordPressを始めたときもインストールに何度となく失敗してこのエラーを呪ったことを思い出しました。
    この時はDB作成時の文字コード間違えとか、やはりwp-config.phpの文字コードがらみの設定ミスでした。
    もうあまり見たくない・・・

  3. せれさん、こんばんわ。

    define(’DB_CHARSET’, ‘utf8′);

    とのことなので、おそらくcapabilities.phpが定義している権限が文字化けしたのでしょうね。

    私も2台のパソコンにそれぞれローカル環境を作ったことがあるのですが、片方ではこの症状が出て、片方では出ないということがありました。
    原因としてはいまいちですが、まれに文字コードの不整合が起きるというのが現状言える事みたいですね。

  4. ピンバック: kishi-r.com » Blog Archive » WordPressローカル環境でのバグ

  5. WordPress 2.2(EUC-JP)から、2.6(UTF-8)へのアップデートでも似た症状になりました。
    この記事の方法でも使えましたので、報告しておきます。
    ありがとうございました。

  6. ピンバック: links for 2007-06-01 | LOVE!?

  7. ピンバック: WordPressの移行時のエラーメッセージ~このページにアクセスするための十分なアクセス権がありません~ | miscellaneous

  8. ピンバック: Apr20.net » wordpress me から3.13にアップグレードする

  9. ピンバック: Apr20.net » wordpress me から3.13にアップグレードする

  10. はじめてコメントさせていただきます。
    記事をとても参考にさせていただいております。ありがとうございます。
    そこで、お伺いしたいのですが、こちらの「管理画面にログインできない場合の対処法その1」は、今回アップグレードした3.2でも同様にできるのでしょうか?
    実は、3.2にアップグレードしたところ、ログインできなくなってしまいました。ご返信いただけますと幸いです。よろしくお願いします。

    • >ちびたさん
      大丈夫なように見えますが、prefix を変えてたりすると通りませんから、
      直接データベースをいじるほうをおすすめしますね。
      ただ、環境によって内容が違いますから、ご自分の環境で数字が正しいかどうか、文字列情報の数字をカウントして観る必要があると思います。

  11. お返事ありがとうございます。
    データベースを触ったことがないので、緊張しますが、参考にさせていただきます。
    ご丁寧に教えていただき、感謝しています。ありがとうございました。これからもブログの更新楽しみにしています。

  12. 結局解決策となったのはhttp://t.co/IqSwYQvAここだった。ただ情報が古くて何を信じて良いのか分からず回り道した。2.3ではwp_capabilitiesとあるからそっちを書き換えればOKかと思いきや関係なく、やっぱりwp_user_rolesが無いのが問題だった。

  13. ピンバック: ドメイン価格比較と機能 | 明鏡止水

フォームは コメントしてほしそうに こちらを見ている……!