Mr.Right
woman coding on computer

[WordPless]自動でimgタグの前後にdivタグを追加する方法

WordPlessでお困りの同士の皆さんこんにちは。オリジナルテンプレートを作っているときに、「投稿に画像を挿入するとき、勝手にimgタグをdivタグで囲んでくれたら神なのに」って思うことありますよね。そう、あるんです。
そんな皆さんに朗報です。勝手に<div><img></div>にしてくれるphpをお教えします!

ちなみに、function.phpに書き加えるものになります。「function.php…?知らない…いじりたくない…」という方はごめんなさい。

function.php

add_filter('the_content', 'filter_imgtags');
function filter_imgtags( $content ){
  return preg_replace('/(<figure .*>)(<img .* \/>)(.*<\/figure>)/iU', '$1<div class="ImgWrap">$2</div>$3', $content);
}

ちょっと解説

実は筆者もそこまでphp詳しくないので解説できないんですが、preg_replaceは正規表現ができるヤツみたいです。で

return preg_replace('/(<figure .*>)(<img .* \/>)(.*<\/figure>)/iU'

のところで検索したい文字列(ここでは<figure …><img… ><figure>)を指定しています。
( )で3つに分けられていることがポイントです。

'$1<div class="ImgWrap">$2</div>$3'

そして次に置換する文字列を指定して、<div class=”ImgWrap”>を挿入しています。
$1~3は、先ほど( )で囲んでいた文字列を順番に抜き出せる表現だそうです。
1つめの( )は$1で取り出せるということですね。

ちなみに、投稿画面で画像を挿入するときは画像が<figure>で囲まれるので、記事内の画像に限定するためにここでは<figure>も文字列を検索するときに含めていますが、「ちょっとやりたいことと違った…!」ってときは文字列とにらめっこして、うまくカスタマイズしてみてください。
( )の位置や中身を変えれば色々なタグの前後に応用できるはずです。

まとめ

imgタグってCSSで::beforeとか::afterとか疑似要素作れないから面倒くさいですよね。筆者がこれをしたかった理由は、画像をインスタントフィルム風のデザインにしたかったからです。こんな感じ。

interior of retro styled cafe with wooden table and comfortable armchairs
素敵なカフェ

素敵でしょ?おしまい。