Pocket

WordPressサイトを開いたときに、「Warning: Trying to access array offset on false」という警告が突然表示されることがあります。

先日も警告が出てしまい「あちゃー!」となりました…。

このエラーは、PHPで配列として扱うはずのデータが取得できず、falseになっている状態で、その中身を読み込もうとした際に発生します。特に、PHPのバージョンアップ後や、古いWordPressテーマを使用しているサイトで表示されることがあります。

今回は、テーマ内のheader.phpでアイキャッチ画像の情報を取得する処理が原因でした。この記事では、「Trying to access array offset on false」が表示される原因と、実際に行ったコードの修正方法を分かりやすく解説します。

「Trying to access array offset on false」とは?

WordPressサイトを表示した際に、次のような警告が表示されることがあります。

Warning: Trying to access array offset on false in /wp-content/themes/テーマ名/header.php on line 46

この警告は、PHPで配列として扱おうとしたデータが、実際には「false」になっている場合に表示されます。

今回のケースでは、WordPressテーマの「header.php」内でアイキャッチ画像の情報を取得しようとした際に、画像情報を正常に取得できなかったことが原因でした。

サイトそのものが完全に壊れているわけではありませんが、PHPのバージョンアップなどをきっかけに、これまで表面化していなかった古いコードの問題が警告として表示されることがあります。

今回エラーが発生していたコード

header.phpの46行目付近には、次のようなコードが記述されていました。

$src_info = wp_get_attachment_image_src($thumbnail_id, 'large');
$src = $src_info[0];

「wp_get_attachment_image_src」は、WordPressに登録されている画像のURLやサイズなどを取得する関数です。

正常に画像情報を取得できた場合は、次のような配列が返されます。

array(
    0 => '画像のURL',
    1 => 画像の横幅,
    2 => 画像の高さ,
    3 => サイズ情報
)

そのため、次のコードでは配列の0番目に入っている画像URLを取得しています。

$src = $src_info[0];

しかし、画像情報を取得できなかった場合、「wp_get_attachment_image_src」は配列ではなく「false」を返します。

falseに対して「[0]」という配列の指定を行ったため、「Trying to access array offset on false」という警告が表示されていました。

エラーを解消した修正方法

画像情報が配列として取得できているかを確認してから、画像URLを代入するようにコードを修正します。

修正前のコードは次のとおりです。

$src_info = wp_get_attachment_image_src($thumbnail_id, 'large');
$src = $src_info[0];

これを、次のように変更しました。

$src_info = wp_get_attachment_image_src($thumbnail_id, 'large');

if (is_array($src_info) && !empty($src_info[0])) {
    $src = $src_info[0];
} else {
    $src = get_stylesheet_directory_uri() . '/images/noimage.png';
}

「is_array」を使用して、取得したデータが配列かどうかを確認しています。

さらに、「!empty($src_info[0])」によって、画像URLが空になっていないかも確認しています。

画像情報を正常に取得できなかった場合は、テーマ内にある「noimage.png」を代替画像として表示します。

該当部分を含めた修正コード

アイキャッチ画像を取得する処理全体を修正する場合は、次のように記述できます。

// thumb
$src = '';

if (has_post_thumbnail($post->ID)) {
    // アイキャッチ画像が設定されている場合
    $thumbnail_id = get_post_thumbnail_id($post->ID);
    $src_info = wp_get_attachment_image_src($thumbnail_id, 'large');

    if (is_array($src_info) && !empty($src_info[0])) {
        $src = $src_info[0];
    } else {
        $src = get_stylesheet_directory_uri() . '/images/noimage.png';
    }
} else {
    // アイキャッチ画像が設定されていない場合
    if (preg_match(
        '/<img([ ]+)([^>]*)src\=["|\']([^"|^\']+)["|\']([^>]*)>/',
        $post->post_content,
        $img_array
    )) {
        $src = $img_array;
    } else {
        $src = get_stylesheet_directory_uri() . '/images/noimage.png';
    }
}

このコードでは、次の順番でOGP画像を決定しています。

  1. 投稿や固定ページにアイキャッチ画像が設定されている場合は、その画像を使用する
  2. アイキャッチ画像の情報を取得できなかった場合は、noimage.pngを使用する
  3. アイキャッチ画像が設定されていない場合は、本文内の最初の画像を使用する
  4. 本文内にも画像がない場合は、noimage.pngを使用する

画像情報を取得できなかった場合の処理をあらかじめ用意しておくことで、同じ警告が表示されるのを防げます。

アイキャッチ画像があるのにfalseになる原因

「has_post_thumbnail」でアイキャッチ画像が設定されていると判定されても、画像情報を正常に取得できないことがあります。

メディアライブラリから画像を削除している

投稿や固定ページにはアイキャッチ画像のIDが残っていても、メディアライブラリから元の画像を削除している場合があります。

この状態では、WordPress上ではアイキャッチ画像が設定されているように見えても、実際の画像情報を取得できません。

サーバー上から画像ファイルが消えている

データベースには画像情報が残っていても、サーバーの「uploads」フォルダから画像ファイルが削除されている可能性があります。

サイト移行やバックアップの復元後などに発生しやすいケースです。

画像サイズが生成されていない

今回のコードでは、次のように「large」サイズの画像を指定していました。

wp_get_attachment_image_src($thumbnail_id, 'large');

何らかの理由でlargeサイズの画像が生成されていない場合や、画像データに不整合がある場合は、画像情報を取得できないことがあります。

サイト移行時に画像の関連付けが崩れている

WordPressサイトを別のサーバーへ移行した際に、画像ファイルやデータベースの一部が正しく移行されていないと、画像IDと実際のファイルの関連付けが崩れる場合があります。

特定の投稿や固定ページだけで警告が出る場合は、そのページのアイキャッチ画像を一度削除し、改めて設定し直すことで改善する可能性があります。

get_optionの戻り値にも注意する

WordPressテーマでは、「get_option」を使用してテーマ設定を取得することがあります。

$seo_options = get_option('seo_options');

しかし、指定した設定が存在しない場合、「get_option」もfalseを返すことがあります。

その後、次のように配列として値を取得すると、同じような警告が発生する可能性があります。

$seo_options['meta']

安全に処理するためには、取得した値が配列かどうかを確認します。

$seo_options = get_option('seo_options');
$seo_options = is_array($seo_options) ? $seo_options : array();

テーマ内で複数の設定を取得している場合は、それぞれに同様の対策を行うと安心です。

$html_options = get_option('html_options');
$html_options = is_array($html_options) ? $html_options : array();

$color_options = get_option('color_options');
$color_options = is_array($color_options) ? $color_options : array();

$head_options = get_option('head_options');
$head_options = is_array($head_options) ? $head_options : array();

$sns_options = get_option('sns_options');
$sns_options = is_array($sns_options) ? $sns_options : array();

PHPのバージョンアップ後に表示されることもある

今回のような警告は、レンタルサーバーのPHPバージョンを変更した後に表示されることがあります。

以前のPHPでは警告が目立たなかったコードでも、PHP 8以降ではデータ型の扱いが厳しくなり、問題のある処理が警告として表示されやすくなっています。

そのため、PHPのバージョンを上げた直後に警告が出た場合でも、PHPそのものに問題があるとは限りません。

古いWordPressテーマやプラグインのコードが、新しいPHPの仕様に十分対応していない可能性があります。

警告表示だけを消す方法

公開中のサイトに警告文が表示されている場合は、訪問者にサーバー内のパスやテーマ名が見えてしまいます。

まずは「wp-config.php」のデバッグ設定を確認し、公開画面に警告を表示しないようにします。

define('WP_DEBUG', false);
define('WP_DEBUG_DISPLAY', false);

すでに同じ設定が記述されている場合は、新しく追加せず、既存の記述を変更してください。

ただし、この方法は警告を見えなくするだけであり、コード上の原因を解消するものではありません。

公開画面の警告表示を止めたうえで、テーマやプラグインのコードを修正することが大切です。

テーマファイルを修正するときの注意点

修正前にバックアップを取る

header.phpは、サイト全体の表示に関係する重要なファイルです。

記述を間違えると、サイト全体が白くなったり、管理画面に入れなくなったりする可能性があります。

修正前には、必ず元のファイルをダウンロードして保存しておきましょう。

全角文字や記号の入力ミスに注意する

PHPコード内では、全角スペースや全角の引用符が混ざるとエラーになることがあります。

コードを貼り付ける際は、半角の記号が使用されているか確認してください。

テーマ更新で修正内容が消える可能性がある

親テーマのheader.phpを直接編集した場合、テーマを更新すると修正内容が上書きされる可能性があります。

継続して使用するサイトでは、子テーマを作成して修正する方法も検討しましょう。

まとめ

「Trying to access array offset on false」は、配列として扱おうとしたデータがfalseだった場合に表示されるPHPの警告です。

今回のケースでは、アイキャッチ画像の情報を取得する「wp_get_attachment_image_src」がfalseを返しているにもかかわらず、「$src_info[0]」を読み込もうとしていたことが原因でした。

取得結果が配列かどうかを「is_array」で確認し、画像を取得できなかった場合の代替処理を追加することで解決できます。

警告を非表示にするだけではなく、画像データの不整合や古いテーマコードを確認し、根本的な原因を修正することが重要です。

Pocket