購読者権限のユーザIDでログインするとエラーメッセージが発生する

クライアントよりWordPressにログインすると管理画面にエラーメッセージが出ると言われました。 全員にエラーメッセージが出るわけではなく、一部ユーザに発生するとのことでした。

調べたところ、購読者権限のユーザIDでログインすると、管理画面に下記のメッセージが出ていました。

 

ちなみに、購読者以外の権限グループ(管理者、編集者など)では、エラーメッセージは出ませんでした。今回の事象は購読者権限のユーザで起きました。

 

原因を考える

まずはエラーメッセージを見ます。

Warning: Undefined array key 2 in C:\\Users\\kazur\\Local Sites\\test20240427\\app\\public\\wp-admin\\includes\\plugin.php on line 2012

Warning: Undefined array key 2 in ~ というメッセージが大量に発生しています。

Warningなのでエラーメッセージでは無く、警告メッセージですね。たぶん問題なく動作すると思いますが、これだけメッセージが多く出ると気持ち悪いですね。

Undefined array key 2 in は、何かの配列のキーが無かったという意味です。

次に考えられるのは、なぜ購読者権限のユーザだけ発生するのかということです。

以上をまとめると、購読者権限のユーザIDでログインすると、何らかの配列のキーが取得できなかったということになります。

「投稿」の文言を変更したのが原因

こいつが原因でした。

通常は「投稿」の文言ですが、プロジェクトに合わせて「ブログ」に文言を変更していました。文言を変更したのが原因でエラーメッセージが出るようになりました。

プロジェクトに合わせて「投稿」の文言を変更することは、受注制作の現場ではよくあるケースです。その場合はfunctions.phpから下記のコードを記載します。このコードはネットで調べると出てくると思います。

//「投稿」の名前を変更
function Change_menulabel()
{
  global $menu;
  global $submenu;
  $name = 'ブログ';
  $menu[5][0] = $name;
  $submenu['edit.php'][5][0] = $name . '一覧';
  $submenu['edit.php'][10][0] = '新しい' . $name;
}
function Change_objectlabel()
{
  global $wp_post_types;
  $name = 'ブログ';
  $labels = &$wp_post_types['post']->labels;
  $labels->name = $name;
  $labels->singular_name = $name;
  $labels->add_new = _x('追加', $name);
  $labels->add_new_item = $name . 'の新規追加';
  $labels->edit_item = $name . 'の編集';
  $labels->new_item = '新規' . $name;
  $labels->view_item = $name . 'を表示';
  $labels->search_items = $name . 'を検索';
  $labels->not_found = $name . 'が見つかりませんでした';
  $labels->not_found_in_trash = 'ゴミ箱に' . $name . 'は見つかりませんでした';
}
add_action('init', 'Change_objectlabel');
add_action('admin_menu', 'Change_menulabel');

購読者権限のユーザIDでログインすると投稿機能自体が表示されません。
下記を見てください。購読者権限で正常にログインできた時の状態です。
購読者はそもそも投稿機能を利用できる権限がありません。

投稿機能が無いのに、「投稿」の文言を変更する処理をしていることが原因でした。その際に何かのデータ(配列のキー)が存在しなくて読み込めなかったのだと思います。

購読者権限では処理させない

「投稿」の文言を変更する処理は、購読者権限以外の権限で行うように設定します。

下記のコードを追加します。

// 購読者権限以外の場合に処理する
if (!current_user_can('subscriber')) {
処理
}

完成形です。

//「投稿」の名前を変更
function Change_menulabel()
{
  global $menu;
  global $submenu;
  $name = 'ブログ';
  $menu[5][0] = $name;
  $submenu['edit.php'][5][0] = $name . '一覧';
  $submenu['edit.php'][10][0] = '新しい' . $name;
}
function Change_objectlabel()
{
  global $wp_post_types;
  $name = 'ブログ';
  $labels = &$wp_post_types['post']->labels;
  $labels->name = $name;
  $labels->singular_name = $name;
  $labels->add_new = _x('追加', $name);
  $labels->add_new_item = $name . 'の新規追加';
  $labels->edit_item = $name . 'の編集';
  $labels->new_item = '新規' . $name;
  $labels->view_item = $name . 'を表示';
  $labels->search_items = $name . 'を検索';
  $labels->not_found = $name . 'が見つかりませんでした';
  $labels->not_found_in_trash = 'ゴミ箱に' . $name . 'は見つかりませんでした';
}
if (!current_user_can('subscriber')) {
  add_action('init', 'Change_objectlabel');
  add_action('admin_menu', 'Change_menulabel');
}

これで警告メッセージが無くなりました。

別の対処方法もあります。

別の方法もあります。それは対象の配列を探し出して、その配列があった場合に処理という条件を足すことです。

対象の配列にisset関数を追記しています。

//「投稿」の名前を変更
function Change_menulabel()
{
  global $menu;
  global $submenu;
  $name = 'ブログ';
  $menu[5][0] = $name;
  // isset追加
  if (isset($submenu['edit.php'][5][0])) {
    $submenu['edit.php'][5][0] = $name . '一覧';
  }
  // isset追加
  if (isset($submenu['edit.php'][10][0])) {
    $submenu['edit.php'][10][0] = '新しい' . $name;
  }
}
function Change_objectlabel()
{
  global $wp_post_types;
  $name = 'ブログ';
  $labels = &$wp_post_types['post']->labels;
  $labels->name = $name;
  $labels->singular_name = $name;
  $labels->add_new = _x('追加', $name);
  $labels->add_new_item = $name . 'の新規追加';
  $labels->edit_item = $name . 'の編集';
  $labels->new_item = '新規' . $name;
  $labels->view_item = $name . 'を表示';
  $labels->search_items = $name . 'を検索';
  $labels->not_found = $name . 'が見つかりませんでした';
  $labels->not_found_in_trash = 'ゴミ箱に' . $name . 'は見つかりませんでした';
}
add_action('init', 'Change_objectlabel');
add_action('admin_menu', 'Change_menulabel');

こちらの方が警告メッセージに対して、適切な対応と言えるでしょう。
しかし、対象の配列を探す手間がありますし、今回は「投稿」の文言を変更する処理自体が不要ので、前者の対処で十分だと思います。

まとめ

購読者権限のユーザIDでWordPressにログインすると、管理画面に警告メッセージが発生しました。その際に購読者権限では「投稿」の文言を変更する処理を行わない。ということで対応しました。

同じ現象で困っている人がいましたら、ぜひ参考にしてください。

facebook
twitter
line
hatena
pocket