WordPressで任意の文字列(HTMLタグ含む)の前にコード挿入する方法

 Google Adsenseによる広告挿入にあたり、このブログページのように、<h2>タグ前にコードを挿入するようにしてみようかなどと考えまして、色々検索してみましたが、どうもしっくりくる感じのが無かったので、その検索で出てきたコードなどを参考にしつつ、PHPの関数を調べて自分なりの挿入方法を見つけましたので、その方法と関数の解説付きで書いておきます。なお<h2>タグ前に挿入するだけなら、ほぼコピペ一発で出来るかと。

広告

使ったプラグイン&想定されるプラグインなしでの挿入方法

 使ったプラグインはCode Snippetsです。かなり便利なプラグインで、function.phpのコードをプラグインの画面上で追加し、管理できます。これを用いて後述するコードを挿入しました。
 従って、プラグインを使わない場合は、function.phpを編集して、下記のコードを追加すれば良いと思われます。

コード

追加コード本体

 以下をCode Snippetsにより、function.phpに追加しました。

function ad_add_before_first_h2($the_content){
if(is_single()){
$query_h2 = "<h2>";
$position_number = strpos($the_content,$query_h2);
if($position_number != false){
$str = <<<EOT
【ここに挿入するコード】
EOT;
$the_content = substr_replace($the_content,$str,$position_number,0);
}
}
return $the_content;
}
add_filter('the_content','ad_add_before_first_h2');

軽い解説

 まず最終行のadd_filter関数で、the_content部分、つまり記事の内容にフィルタをかけています。つまり、第2引数のad_add_before_first_h2関数が、きじの処理のときに、記事の内容に対して実行されるようになっているのです。
 そして1行目から13行目までのコードで、そのad_add_before_first_h2関数を宣言し、処理を書いています。

 処理内容は以下の通り。

  • 1行目: 関数を宣言。引数として$the_contentを設定。この$the_content内には、おそらく記事の内容文がadd_filterにて放り込まれる模様
  • 2行目: if(is_single())で生地かどうかを判断
  • 3行目: クエリを設定(""で挟んでいる部分がタイトルで言う「任意の文字列」)
  • 4行目: strpos関数を用いて、クエリが最初に出現した位置を特定。$position_numberにクエリが何文字目にあるかを代入
  • 5行目: クエリが記事本文内にあるかどうかの判定。判定条件を変えることで、固定ページにも反映できるかもしれません
  • 6~8行目: ヒアドキュメント構文により、【ここに挿入するコード】部分に書かれたコードをそのまま変数$strに代入(これをすると括弧などあまり気にせずに済むため、お気に入りの構文です)
  • 9行目: substr_replace関数により、$position_numberで保存しておいたクエリの位置に$strを挿入
  • 12行目: 上記の処理を経て、加工した$the_contentを返す(これにより、記事の内容文が加工された、と思われる)

工夫した箇所とコメント

 preg_matchのような正規表現で検索するではなく、指定した文字列を検索するための関数strposを使っています。置換についても、正規表現を使っての置換ではなく、substr_replaceを使って置換しています。このため処理は単純になり、検索速度はだいぶ速くなっていると考えられる…はず…です。たぶん。テストしてないので正確にはわかりませんが…。
 尚この工夫した箇所の関数は、文字コードがUTF-8でなければなんか支障が出やすいみたいですが、WordPressの文字コードは元からUTF-8なのでその点は大丈夫でした。

 また、strpos関数を文字列が含まれるかの判定に使い、str_replace関数を使うことで、全ての文字列に対して置換を行うことが可能です。

どんな目的のときにこのコードが使用できるか

  • 検索文字列が固定であるとき(<h2>などのように、クラス名も特に変化のない特定の文字列であれば、正規表現を使う必要が無いのでこのコードを使用できます)
  • 記事内のクエリ文字列の位置に挿入を行いたいとき(フィルタの関係)
  • 1度だけ検索文字列前にコードを挿入したいとき(コメントに書いたとおり、str_replace関数を使って全ての文字列の前に挿入することも可能)

その他コメントなど

 私のブログの場合、検索する文字列は分かっていたので、わざわざ正規表現を使わないでも出来るかなと思ってやってみたら、できました。
 なお、検索部分や、置換する部分をうまくfor文ループとかwhile文ループでさばけば、何番目に出てきた文字列の前に、とか色々指定できると思います。

広告

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA