img srcの記述を拾って画像を取得し表示するタグを使っていたが、imgタグ内でphpのエラー表示「Undefined offset: 0」が出るようになったので、修正した時のメモ。
アイキャッチを登録しなくても記事内の画像を拾って表示してくれるタグ
トップページやカテゴリーアーカイブなどの記事一覧でタイトルと共に画像も表示したい。しかしアイキャッチ画像を登録していない、という場合がけっこうある。
そこでアイキャッチ画像の登録が無い場合でも記事一覧に画像を表示しようと、functions.phpでWordPressの投稿記事内の画像の最初の1枚をサムネイルとして表示する方法で紹介されている「img srcの記述を拾って画像を取得し表示するタグ」を使っていた。
アイキャッチの登録の省略できるので、WordPressの記事投稿に不慣れなクライアントのためにも便利だから、今後も使いたい!だから、放置とか静的なタグに置き換えてしまうのは無しで対処した。
エラーが出たソース
function catch_that_image() { global $post, $posts; $first_img = ''; ob_start(); ob_end_clean(); $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches); $first_img = $matches [1] [0]; if(empty($first_img)){ //Defines a default image $first_img = "/images/default.jpg"; } return $first_img; }
ところが、記事内に画像が無い場合に、$first_img = $matches [1] [0];の行がphpのエラーを吐くようになった。
サーバーを移転した直後からエラーが出るようになったので、phpのバージョンが変わったせいかな?と思った。
エラー内容
状況は、記事内に画像が無い場合に表示されるはずのデフォルトの画像が表示されないというもの。記事内に画像がある場合はちゃんと記事内の画像が表示されている。
エラー表示は以下のとおり。
Notice: Undefined offset: 0 in [URL]functions.php on line 359
(このエラー表示はコンテンツの冒頭には表示されなかった。imgタグ内でひっそり吐かれていた。おかげで最初は気づかなかった。)
理由と対応
記事内に画像が無い場合、$matchesは空の配列になる。それはいかんよ、と。Undefined offset: 0はそういう意味。
画像が無い場合はempty以下で対応してるのでは?という程度の知識なので困った。ルールが変わったのか?
少し調べた結果、以下の記述で対処できた。
function catch_that_image() { global $post, $posts; $first_img = ''; ob_start(); ob_end_clean(); if (preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches)){ $first_img = $matches [1] [0]; }else{ $first_img = get_stylesheet_directory_uri().'/images/img_default_thum.gif'; } return $first_img; }
参考サイトの「$matchesは空の配列です。したがって、preg_matchにアクセスする前に、$matches[0]が一致を検出したかどうかを確認する必要があります。」。正確には理解できておらず、対処療法的な修正しかできていないけれど、とりあえずエラーは消え、デフォルト画像が表示されるようになった。