サポート » テーマ » Warning: Invalid argument supplied for foreach() というエラーの修正方法を教えてください

  • 解決済 echizenya

    (@echizenya)


    いつもお世話になっています。
    下記の質問についてご存知の方がいらっしゃいましたらご教示を願います。

    【質問の主旨】

    フォローを必要としているページのURLにアクセスすると、下記のエラーメッセージが表示されてタグのページが表示されません。タグページを表示させるためには、header.phpのどこを修正すれば良いでしょうか?

    Warning: Invalid argument supplied for foreach() in /var/www/e-yota/wp-content/themes/mytheme/header.php on line 62
    サイトに技術的な問題が発生しています。

    【質問の補足】

    1.
    エラーについて言及されているheader.phpのページはGitHubにて公開しています。

    2.
    今回発生したエラーの修正に関して、こちらのページを参考にしました。

    3.
    参考にしたページの内容に基づき、

    if (is_array($posttags)) {
    	foreach($posttags as $tag) {
    		$termid = $tag->term_id;
    	}              
    }

    と修正すると、タグのページに

    サイトに技術的な問題が発生しています。

    と表示されます。

    4.
    参考にしたページの内容に基づき、

    foreach((array)$posttags as $tag) {
    	$termid = $tag->term_id;
    }

    と修正すると、タグのページに

    Notice: Trying to get property 'term_id' of non-object in /var/www/e-yota/wp-content/themes/mytheme/header.php on line 63

    というエラーメッセージが表示されます。

    以上、ご確認のほどよろしくお願い申し上げます。

    • このトピックは2 ヶ月、 2 週間前に  echizenya さんが編集しました。理由: タイトルに脱字があったため編集
    • このトピックは2 ヶ月、 2 週間前に  echizenya さんが編集しました。理由: 記事に誤字があったため
    • このトピックは2 ヶ月、 2 週間前に  echizenya さんが編集しました。理由: 記事に誤字があったため

    ヘルプの必要なページ: [リンクを見るにはログイン]

14件の返信を表示中 - 1 - 14件目 (全14件中)
  • 公式ドキュメントだと、↓のように、if ( $posttags ) { … } を使っていますね。
    こちらを試してみてはいかがでしょうか。

    https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/get_the_tags

    <?php
    $posttags = get_the_tags();
    if ( $posttags ) {
    foreach ( $posttags as $tag ) {
    echo $tag->name . ‘ ‘;
    }
    }
    ?>

    @ounziw さん。
    コメントありがとうございます。
    教えていただいたコードを試すと、「サイトに技術的な問題が発生しています。」という表示がされてタグページが表示されません。変更の内容につきましては、GitHubにUPしています。度々お手数をおかけして恐れ入りますが、もし他の方法をご存知でしたらご教示いただけると助かります。

    なお、このコメント紹介しているGitのブランチはdeveloper_20190531を使っていますが、公開しているサイトはmasterブランチを使っています。

    以上、よろしくお願い申し上げます。

    $posttagsに何が入っている、ダンプしてみたらどうでしょうか?

    @munyagu さん。
    コメントありがとうございます。下記のとおりダンプするとbool(false)と表示されます。

    $posttags = get_the_tags();
    var_dump($posttags);
    if ($posttags) {
    	foreach($posttags as $tag) {
    		echo $tag->name . '';
    	}
    }

    https://github.com/echizenyayota/e-yota/blob/developer_20190531/wp-content/themes/mytheme/header.php#L61-L67

    • この返信は2 ヶ月、 2 週間前に  echizenya さんが編集しました。理由: タグを間違えたため編集

    false だったら foreach には入らないと思うんですけれど、それでもエラーが出るんですよね。
    最初のエラーの箇所とエラー発生箇所は変わっているはずです。

    タグのアーカイブページでは、グローバル変数の $tag_id にタグ ID が格納されています。

    $posttags = get_the_tags();
    foreach($posttags as $tag) {
      $termid = $tag->term_id;
    }

    $termid = $tag_id;

    • この返信は2 ヶ月、 2 週間前に  ishitaka さんが編集しました。
    Nora

    (@nora0123456789)

    こんばんは。

    get_the_tags()は投稿に関連づけられているタグオブジェクトを取得する関数ですので、戻り値がbooleanというのは、コールされるページあるいはコンテキストに誤りがあるからではないでしょうか?
    問題となっている箇所がヘッダーテンプレートのようですので、ループ外の投稿データが関与しない場所でコールされているように思えます。
    ですので、is_single()の場合、あるいは関連する投稿データを引数に使用するなど試してみてはどうでしょう?

    また、それでも戻り値がfalseの場合、ひとまず条件を付けてエラーを回避するのはどうでしょうか。

    if ( is_array( $posttags ) && 0 < count( $posttags ) ) {
      foreach ( $posttags as $tag ) {
        exec something.
      }
    }
    • この返信は2 ヶ月、 2 週間前に  Nora さんが編集しました。

    エラーが発生するのは、投稿が存在しないタグアーカイブページでのことではないでしょうか?
    get_the_tags() は投稿に付けられているタグを返す関数なので、投稿が存在しないと false を返します。
    また、ループ外で使用する場合は、基本的には引数の投稿 ID を省略することはできません。

    if ($posttags) {

    の条件を追加することで、当初のエラーは回避されますが、$termid に値が代入されないことで、$termid を使用するところでエラーが発生したのだと思われます。

    • この返信は2 ヶ月、 2 週間前に  ishitaka さんが編集しました。
    Nora

    (@nora0123456789)

    気になって見に来てしまいましたが、公開されているページとブランチを見間違えてました、失礼。
    公開されているページでは、if条件を設けるといった修正が反映されていない為にエラーが起こっているのですね。

    他のタグページで問題が無いようですので、やはり投稿が存在しないことで配列が返ってこないことによるエラーに思えます。
    問題となっているタグがついた投稿は存在するのでしょうか?

    こんにちは、

    wp-config.phpに

    	
    define('WP_DISABLE_FATAL_ERROR_HANDLER', true);
    

    を追加してみるとどうですか?

    @munyagu さん。
    @ishitaka さん。
    @nora0123456789 さん。
    @ishitaka さん。

    それぞれコメントありがとうございます。返信が遅くなり恐縮です。みなさまからいただいたコメントに基づいて以下の3つの処置を行いました。ですが下記のとおり、最初と同じエラーが表示されます。

    Warning: Invalid argument supplied for foreach() in /var/www/e-yota/wp-content/themes/mytheme/header.php on line 62
    サイトに技術的な問題が発生しています。

    1. header.phpの修正

    $posttags = get_the_tags();
    foreach($posttags as $tag) {
      $termid = $tag_id;
    }

    https://github.com/echizenyayota/e-yota/commit/b9b0bec843206c30e33940a559f02878a1696ee7
    (上記のブランチはdeveloper_20190531のものですが、本番上はmasterブランチにしています)

    2. タグの存在の確認

    googleロゴ 平成から令和にというタグを管理画面から検索したところ、タグはこちらの画像のとおり存在はしています。ただし表示させるとやはりエラーが表示されます。

    3. wp-config.phpによる確認

    wp-config.phpdefine('WP_DISABLE_FATAL_ERROR_HANDLER', true);を追加しましたが、
    ヘルプが必要なページに何か表示されることはありませんでした。

    たびたびの質問で申し訳ありませんが、このタグはブログの運営上、さほど重要なタグではありません。管理画面からタグを削除するという処置を取っても差し支えはないでしょうか?

    以上、ご確認のほどよろしくお願い申し上げます。

    • この返信は2 ヶ月、 2 週間前に  echizenya さんが編集しました。理由: コードタグを追加したため
    • この返信は2 ヶ月、 2 週間前に  echizenya さんが編集しました。理由: 誤字の修正

    googleロゴ 平成から令和にというタグを管理画面から検索したところ、タグはこちらの画像のとおり存在はしています。ただし表示させるとやはりエラーが表示されます。

    「googleロゴ 平成から令和に」タグに属する投稿が存在しない(カウントが 0)ためです。

    下記の変更は試されたでしょうか?

    $posttags = get_the_tags();
    foreach($posttags as $tag) {
      $termid = $tag_id;
    }

    $termid = $tag_id;

    補足です。

    $termid = $tag->term_id;

    この1行を、

    $termid = $tag_id;

    へ、変更するのではありません。

    $posttags = get_the_tags();
    foreach($posttags as $tag) {
      $termid = $tag_id;
    }

    この4行を、

    $termid = $tag_id;

    この1行に変更です。

    @ishitaka さん。
    たびたびのコメントありがとうございます。
    4行を1行に変更することで、「Googleロゴ 平成から令和にに関する記事」というタグページが表示されました。ご指摘のとおり、「googleロゴ 平成から令和に」タグに属する投稿は存在しませんでした。

    たくさんのアドバイスをいただきありがとうございます。今後ともどうぞよろしくお願いします。

14件の返信を表示中 - 1 - 14件目 (全14件中)
  • このトピックに返信するにはログインが必要です。