【WordPress/PHP】7.3→8.2.2移行でregister_nav_menus(メニュー登録)がWarning: Array to string conversion吐いてたのに対処した
| 更新: 2025/05/11 | 2386文字

今回はWordPress/PHPのエラー・Warningの対処です。先日、WordPress7.3→8.2.2環境移行のときに発生した『Warning: Array to string conversion(配列を文字列に変換)』に対処してみました。配列型/文字列型でデータ型が違う・配列渡しできないのにしてしまったときなどによくみられるものです。早速状況を確認していってみましょう。
目次
発生状況・開発に使っていたxfreeサーバーが終了するのでシンフリーに移行したとき発生
先日管理人が開発用に使っていた『xfreeサーバー』が2025年夏で終了するので、シンフリーに移行を行いました。xfreeサーバーのPHPバージョンは7.3で、こちらは8.2.2となっています。バージョン違うのに移行すると、まあエラー吐くんですね(笑)フロントで何個か発生したものは対処したんですが・・・
管理画面でも出てきていました。ナビメニューの設定の部分ですね。Warningのメッセージは以下の通りです。Warningの後にメニュー位置を表す文字列が出ていないで、『Array』になっているのもヒントになりそう。
そのほか、位置管理のタブでも発生していました。PHP7.3のときは見なかったんですけど、PHPも8以降はデータ型にかなり厳密になってきているようですね。
考えられる原因~PHP8以降で、noticeが警告に変換されるようになっている
で、考えられる原因なんですけど、『PHP8からはnoticeが警告に変換されるようになったので、いままでスルーされてたのが出た』というあたりかなと思います。以下のようなコードを書いてしまったとき、以前はnoticeで済んでたのが警告されるようになっています。
- 未定義の変数・プロパティ・配列キー読み取り
- オブジェクトでない値のプロパティ読み取り
- 配列を文字列に変換
- etc
以前のバージョンではエラーリポートのレベルが『Notice: Array to string conversion』で軽かったので、サーバー設定とかでE_NOTICEのerror_reportingが非表示になってて表示してなかった、みたいなのが考えられます。このほかの警告に変換されるようになったnoticeは、PHPマニュアルを見ていただくとよいでしょう。
PHP 7.4.xからPHP 8.0.xへの移行 下位互換性のない変更点
https://www.php.net/manual/ja/migration80.incompatible.php
実際の原因~配列渡しなどコード間違えていたが、PHP7.3時はNoticeレベルで出ていなかった
調査の結果、エラーを吐いていた部分がわかったので、さっそく対応してみましょうか。メニュー部分ということで、コアのnav-menus.phpというよりは、管理人が設定した部分のコードが間違ってたけど、Notice時はスルーされてたという感じですかね(それで気づかなかった笑)。
問題の部分はWP搭載ファンクション『register_nav_menus』で、配列で渡してはダメな部分はここでした。複数のメニュー位置指定するときは配列で渡してokなんですけど、そこから一段階下(場所そのものの定義)で配列を入れていたため『Array』が出てたわけです。
というわけで、『配列で複数(Top Menu/Footer Menu)指定しつつ、その下は文字列型で入れる』というように修正しました。register_nav_menusのパラメータを修正。コードは以下の通りです(functions.php内)。
register_nav_menus( array(
'top-menu' => 'Top Menu',
'footer-menu' => 'Footer Menu',
) );
register_nav_menus部分を上記のコードに直して管理画面を再度表示したところ、エラーは発生しなくなりました。
あとがき・まとめ
- PHPでは、バージョン7あたりではnotice扱いだったものが、バージョン8では警告になっている
- サーバー設定でerror_reportingがnoticeをスルーするようになっていたと考えられる
- WP搭載ファンクションregister_nav_menusでは、メニュー場所を複数定義するときは配列が使えるが、一つの場所そのものは文字列で渡す
まとめると、こんなところでしょうか。管理画面エラーは結構ドキドキするものですが、メニュー設定部分→テーマ内メニュー設定関数→配列渡しでエラーになってる部分、のように追いかけて、短時間で解決できました。
【カテゴリ】- サイトエラー対策と復旧
【タグ】- PHP, WordPress