前回は、文字列を置換するPHPの関数「str_replace」と「preg_replace」の基本的な使い方について解説しました。
今回は「実践編」ということで、WordPressでどのように活用するのか、記事本文の置換を例に解説してみます。
記事本文の文字列を置換する手順
WordPressの記事本文を置換するには2つの方法があります。
- get_the_content関数で本文を取得して変換
- フィルターフックを使って変換
どちらが正解というわけではありませんが、WordPressにはフィルターフックという便利なシステムがあるので後者の方法で置換するのがスマート。
このフィルターフックは種類がたくさんあり、本文のフックは「the_content」です。
雛形はこちら。
add_filter('the_content', function($content) {
//処理
return $content; //処理後の文字列を返す
});
いくつかサンプルコードをご紹介するので、参考にしてみてください。
特定のテキストを置換
- ニックネームが変わった
- 紹介している会社名が変わった
- 間違った名前で紹介していた
など、特定のテキストを置換したい場合は以下のようなコードになります。
add_filter('the_content', function($content) {
$content = str_replace('シェフ', 'マスター', $content);
$content = str_replace('三菱東京UFJ銀行', '三菱UFJ銀行', $content);
$content = str_ireplace('wardpress', 'WordPress', $content);
return $content;
});
参考str_ireplaceは小文字と大文字を区別せずに置換する関数です。
AMP対応のコードに変換
僕が開発しているWordPressテーマ「4536」もそうですが、今はプラグインなしでAMP対応できるテーマがあります。
その対応方法も実はこの置換を使っているんです。
以下はSoundCloudをAMP化するコード。
正規表現でSoundCloudのコード(iframe)を検索して変換しています。
add_filter('the_content', function($content) {
if(!is_amp()) return $content; //AMPページじゃなかったら処理停止
$pattern = '/<iframe.+?src="https:\/\/w.soundcloud.com\/player\/\?url=https%3A\/\/api.soundcloud.com\/(tracks|playlists)\/(\d+)&.*?height="(\d+)".*?><\/iframe>/is';
$append = '<amp-soundcloud data-$1id="$2" height="$3" layout="fixed-height" data-visual="true"></amp-soundcloud>';
if(preg_match($pattern,$content,$matches) === 1) $content = preg_replace($pattern, $append, $content);
$the_content = str_replace('<amp-soundcloud data-tracksid', '<amp-soundcloud data-trackid', $content);
$the_content = str_replace('<amp-soundcloud data-playlistsid', '<amp-soundcloud data-playlistid', $content);
return $content;
});
YouTubeやTwitterなども同じような手順でAMP用に変換していけばプラグインなしでAMP化することができます。
まとめ
どのように文字列を置換すればいいのか、仕組みを理解できたでしょうか?
前回もお話ししましたが、完璧に理解する必要はなく「なんとなくわかった」程度で大丈夫です。
「形」と「仕組み」さえ理解できれば、後はググればいいので。
例えば、本文ではなくウィジェットの文字列を置換するには「the_content」を「widget_text」に変えればいいだけですからね。そういうことです。
以上、参考にしていただければ嬉しいです!