記事内に自動で広告などの要素を表示する+内容によって場所を変える

広告の場所は悩み物。記事内に表示されるようなページも多いですね。このサイトも同じことをやっています。

記事は基本的に「single.php」によって書き出されます。記事自体の関数は「the_content()」だけで呼び出されているのでここを置き換えてやる。記事内容を変数に代入して、内容に割り込むようにするのだ。

$singletagcount = 3; //タグをカウントする
$content = apply_filters('the_content', get_the_content()); //記事内容を収納
$contentblock = preg_match("/<blockquote>/", $content); //引用がないかどうか探す
//広告などの要素を収納
$koukokukoku = <<<EOD
  広告を入れる
EOD;
//条件分岐。記事の中に引用があれば引用の下に広告表示。なければ</p>をカウントして $singletagcount の場所に表示
if ($contentblock) {
//</blockquote>で記事内容を区切って$content[0]、$content[1]と収納。
  $content = explode("</blockquote>", $content);
//繰り返し
  for ($i = 0; $i < count($content); $i++) {
//最初の引用の後に広告を表示。</blockquote>はexplode()で消えてるので追加しなおしつつ。「n」は改行。ソースコードを見やすくするため。
    if ($i == 0) {
      echo $content[$i] . "</blockquote>n" . $koukokukoku;
//最後の行は</blockquote>が必要ないので$content[$i]と単体書き出し
    } elseif ($i == count($content) - 1) {
      echo $content[$i];
//上記二つの条件に当てはまらない場合は</blockquote>を追加しつつ書き出し
    } else {
      echo $content[$i] . "</blockquote>n";
    }
  }
//以下同様の事を</p>を基準にやっている。
} else {
  $content = explode("</p>", $content);
  for ($i = 0; $i < count($content); $i++) {
    if ($i == $singletagcount) {
      echo $content[$i] . $koukokukoku;
    } elseif ($i == count($content) - 1) {
      echo $content[$i];
    } else {
      echo $content[$i] . "</p>";
    }
  }
}

とりあえずこれが全文だ。

記事内に引用(<blockquote>)がある場合は引用の下に。ない場合は<p>タグをカウントして広告を埋め込むようになっている。
私のブログは本の紹介などが多くなるので引用に広告が紛れ込むと色々と見た目が悪いのでこうした。

if ($contentblock) {
  $content = explode("</blockquote>", $content);
  for ($i = 0; $i < count($content); $i++) {<br />

explodeによって記事のデータは</blockquote>を基準に分割されて収納される。さらにその配列をカウントしてfor文でくくることで記事データを順番に出力していく形になっている。

   if ($i == 0) {
      echo $content[$i] . "</blockquote>n" . $koukokukoku;
//最後の行は</blockquote>が必要ないので$content[$i]と単体書き出し
    } elseif ($i == count($content) - 1) {
      echo $content[$i];
//上記二つの条件に当てはまらない場合は</blockquote>を追加しつつ書き出し
    } else {
      echo $content[$i] . "</blockquote>n";
    }
  }

引用は大抵1つなので0番目の配列( $content[0])の下に広告を埋め込む。
さらに、</blockquote>で単純に区切っていくと、記事の最後が「</blockquote>」で仕切られていなかったときに迷子の「</blockquote>」タグが生成されてしまう。

<blockquote>ほげほげ1</blockquote>
<blockquote>ほげほげ2</blockquote>
<p>hogehoge</p>

といったコンテンツがあった場合、配列は「$content[0]→<blockquote>ほげほげ1</blockquote>」「$content[1]→<blockquote>ほげほげ1</blockquote>」「$content[2]→<p>hogehoge</p>」となる。
処理すれば

<blockquote>ほげほげ1</blockquote>
広告
<blockquote>ほげほげ2</blockquote>
<p>hogehoge</p></blockquote>

こうなる。

じゃあ最後が「</blockquote>」で終わっていたらどうなるのかというと、

<blockquote>ほげほげ1</blockquote>
<blockquote>ほげほげ2</blockquote>

<blockquote>ほげほげ1</blockquote>
広告
<blockquote>ほげほげ2</blockquote></blockquote>

やっぱりこうなる。配列の中身を見ると理由がわかるが、

$content[0] → <blockquote>ほげほげ1</blockquote>
$content[1] → <blockquote>ほげほげ1</blockquote>
$content[2] →

最後の配列が空になっている。explodeによって分割された要素は、例え区切って空要素が出ても配列にぶち込むのがここからわかる。だから最後の配列は「</blockquote>」で終わっていようがいなかろうがタグはつけづに書き出す。「</p>」での処理もこれと同様だ。

ううん、「preg_match」で記事内を検索かけているのだけれど、もっと楽な方法はないのか。strstrをissetでくくったけれど何故かtrueになる。