"続きを読む"、"Read more" を AdSense に置き換える

WordPress では <!--more--> タグをページに記述すると、 そのページが一覧に表示されるとき、"続きを読む(Read More)" のように、 タグ以降のテキストを隠すことが可能です。 対象のページが表示された後はこのタグは不要になるので、 これを活用して AdSense など別のコンテンツを表示することにします。

more タグを置換する

やることは至極シンプルで、記事中にある more を正規表現で検出して置換します。 functions.php に次のような関数を追加します。 the_content のフィルタとして関数をフックさせるので、 the_content が呼ばれる度に追加した関数が呼び出されることになります。

function replace_readmore($contentData)
{
    $replace ='AdSenseなどのテキスト'

    $contentData = preg_replace('/<span id="more-[0-9]+"><\/span>/',
                                $replace,
                                $contentData,
                                1);
    //コメントアウトの理由は後述します。
    //$contentData = str_replace('<p></p>', '', $contentData);
    //$contentData = str_replace('<p><br />', '<p>', $contentData);   

    return $contentData;
}
add_filter('the_content', 'replace_readmore');

4番目の引数を指定する

preg_replace の4番目の引数に、1 を指定しておくのが良いと思います。 本来 preg_replace はテキストに含まれる対象の文字列すべてを置換しますが、 4番目の引数を指定するときは、指定した数だけしか文字列を置換しなくなります。

従来の目的で利用しているなら more は1度しか記述しないでしょうから、 1度目の検出以降はテキストを走査しない方がコストが低くなるはずです。 実のところ検証はしていないので定かではありませんが、 まっとうに正規表現の実装をしている言語なら途中で走査を中断してくれるでしょう。

空の p 要素の置換

この記事の参照元は"WordPressスマフォページの「記事中」にアドセンスを表示する方法とメリット - わかったブログ" です。 オリジナルのソースコードには、先に紹介したような置換回数を指定する記述はありません。加えて、コメントアウトされているコードが掲載されています。 コメントアウトしたコードは、空の p 要素、および不要な改行 br 要素を取り除く操作ですが、必要になる条件が限られているように見えます。 少なくとも私の環境下では不要なコードは出力されていないので、手元の環境で不要なコードが出力されていないか確認することを推奨します。