購読者権限のユーザ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にログインすると、管理画面に警告メッセージが発生しました。その際に購読者権限では「投稿」の文言を変更する処理を行わない。ということで対応しました。
同じ現象で困っている人がいましたら、ぜひ参考にしてください。