WordPressのカスタマイズ方法やプラグインレビューを中心に、パソコン/動物/植物のことなどを紹介するホームページです

【WordPress】「Warning: Invalid argument supplied for foreach() in・・・」エラーが出たときの対処

公開日:2016(平成28)年2月8日/最終更新日:

トラブル



【景品表示法に基づく表記】ページ内のコンテンツには、商品プロモーションが含まれています

プラグインを有効化して動かしてみたら、自分でコードを書いてみたらこんなエラーが出たことありませんか?

配列を反復処理するための foreach()という関数のエラーなのですが、エラーが出てしまうと「なんじゃこれ?」となってしまいますよね?

wikipediaより
このループはだいたい次のような手順で実行される。
1.変数にリストの中のある要素への参照を代入する。
2.文を実行する。
3.リストの全要素を参照し終わっていない場合は、変数に未参照の要素を代入して文の実行へ戻る。
4.ここで、線形リストや配列など要素の順序が決まっているものは、通常その順序でループが実行されるので、この場合以下とほぼ同様である。


要するにある値の一覧からある値を引っ張り出す関数ですね。エラーが出るということは必ず要因があるということで対処すればちゃんと動くようになります。

このエラーが出たのは「Post Grid」というプラグインを使ったとき。「Post Grid」は記事の一覧をタイル表示するプラグインで、カスタム投稿タイプも含めすべての投稿タイプに使える数少ないタイル表示プラグインです。是非使いたいと思いつつテストサイトで試したら・・・エラーが出ました。ただ、エラーが出てストップという訳ではなく、エラー文の後にちゃんとタイル表示の一覧が作られたので、「このプラグインが使えないのではなく、一部にエラーが出てるのでは?」と思ったのがきっかけです。

では早速解決方法を・・・
エラーが出た実際の構文は
Warning: Invalid argument supplied for foreach() in /home/shop01/shop01.wpblog.jp/public_html/wp-content/plugins/post-grid/includes/functions.php on line 105

これがテスト記事数分(3つ)表示された後にきちんとタイル表示の一覧が表示されていました。

要するに/home/shop01/shop01.wpblog.jp/public_html/wp-content/plugins/post-grid/includes/という場所にあるfunctions.phpの中の105行目でInvalid argument supplied for foreach()「間違ったデータの参照をした」というエラーなんです。

対処方法は案外簡単で↓のサイトに掲載されていました

「Invalid argument supplied for foreach() …」エラーの対処法

この方法でやってみたらエラー解消されてきちんと表示されるようになりました。

どこを変更したか

実際には先ほどのphpファイルの105行目
foreach($term_list as $term_key=>$term)
という部分で、「キー」に入力されたデータを元にタクソノミーのリストを参照しなさいという構文なのですが、これを
foreach((array)$term_list as $term_key=>$term)
とするだけで解消されました

この「(array)」というのは、本来、データのあるなしにかかわらずデータに含めるという意味の構文なのですが、この「データのあるなしにかかわらず」というのがミソだったようです。

「Post Grid」はカスタム投稿タイプにも使えるので、カスタム投稿タイプでテストしてエラーが出たのですが、テストサイトでカスタム投稿タイプを作ったときに「タグ」や「カテゴリー」に紐づけしなかったことが原因だったようです。
通常の「タグ」や「カテゴリー」に紐づけしたり、カスタムタクソノミーを作って投稿タイプを紐づけしたらちゃんと動きました。カスタム投稿タイプを作ったらタグやカテゴリーは当然使うだろうとプラグインの作者は思ったんでしょう。

直接PHPファイルを修正してもいいですが、アップデートしたらまたエラーが出てしまいますので、「タグ」「カテゴリー」との紐づけをして使えば問題なしということで解決しました。