apply_filtersとadd_filterを使ってコード管理を楽にする方法

apply_filtersとadd_filter。

どちらもWordPressに用意されている関数ですが、普段どんな感じで使ってますか?

僕はこれまでadd_filterはよく使ってたんですが、apply_filtersに関してはノータッチでした。

…が、WordPressのコアファイルを調べてわかったんですが、この2つの関数、かなり便利なんですよ。

この記事ではその知られざる魅力について紹介します。

(※わかりやすく説明するために公式サイトとは違った表現をしている部分がいくつかあります)

add_filterの使用例

add_filterの方が使用頻度が高いはずなので、わかりやすいように使用例を挙げます。

add_filterは名前の通り「フィルターを加える」関数なので、何らかの処理に対して自由にフィルターをかけることが可能です。

例えば、「記事本文」に対して「バナナの文字をリンゴの文字に変えるフィルター」を加える場合は以下のようなコードになります。

add_filter( 'the_content', 'banana_to_apple' );
function banana_to_apple( $content ) {
 $content = str_replace( 'バナナ', 'リンゴ', $content );
 return $content;
}

これで、本文にある「バナナ」の文字がすべて「リンゴ」に変わります。

add_filterを使うメリット

え、だったら元々の本文を修正すれば良くない?

と思ったみなさん、こんにちは。

本文を直接修正したりSearch Regexのようなプラグインを使って置換した方がいいかどうかはケースバイケースです。

わかりやすい例としては、「三菱東京UFJ銀行」や「WardPress」のような文字があった場合ですね。

前者は社名が変更になり、後者はそもそも文字が間違っています。こういった場合は直接修正してください。

では、add_filterはいつ使うのかと言うと、特定のページや特定のタイミングで文字を変えるなどの処理をしたい場合ですね。

エラーにならないようにAMPページだけタグを置換したり、3月だけ特定の文字にしたり。

add_filterはこういった場合に使います。

add_filterの基本形

順番が前後しましたが、add_filterの基本形は以下の通りです。

add_filter( '存在しているフィルターの名前', '処理をする関数の名前' );

関数リファレンス/add filter

apply_filtersとadd_filterの違いと基本的な使い方

基本的な使い方とセットで「両者の違い」について説明しておきます。

add_filterと同じようにapply_filtersも直訳してみると、「フィルターを適用する」となります。

つまり、何らかのフィルターを直接適用するのがapply_filters関数の役目です。

WordPressの公式サイトで紹介されている以下のコード、これを見てください。

$content = apply_filters( 'the_content', get_the_content() );

このコードは、the_contentというフィルターを通してget_the_content関数の返り値である記事本文を取得しています。

get_the_content関数だけで本文を取得するとショートコードや自動埋め込みが実行されないので、それらを実行するthe_contentのフィルターをapply_filters関数で「適用」したわけですね。

一方のadd_filter関数はというと、このように直接適用するのではなく、間接的にフィルターを加える形になります。

登録されている(存在している)フィルターに独自のフィルターを加えると覚えるとわかりやすいかもしれません。

先ほども例に挙げたこちらのコードを見てください。

add_filter( 'the_content', 'banana_to_apple' );
function banana_to_apple( $content ) {
 $content = str_replace( 'バナナ', 'リンゴ', $content );
 return $content;
}

これはつまり、the_contentフィルターにbanana_to_appleのフィルター(関数)を加えていることになります。

では、これまでの内容を踏まえて次に進みます。

apply_filtersとadd_filterの便利な使い方

apply_filtersとadd_filterは色々なサイトで説明されているような使い方でも十分便利な関数ですが、開発者やテーマを直接編集している方にとってはもっと便利な使い方があります。

それは、メインの処理にapply_filters関数で独自のフィルターを適用、add_filter関数でそのフィルターを使って編集作業をすることです。

わかりづらいと思うので、コードで説明します。

例として「CSSを出力する関数」を作ってみましょう。

まず、メインの出力部分にapply_filters関数でフックを追加します。

function add_inline_style_4536() {
 $css = '';
 $css = apply_filters( 'inline_style_4536', $css );
 echo $css;
}

(※ここで登場した「inline_style_4536」というフィルター(フック)名は僕が付けたものです)

次に、cssを追加するフィルターを作ります。

function add_css_4536( $css ) {
 // 変数にCSSを入れる
 $new_css = 'h2{color:blue}';
 // 元の変数に新しい変数を追加
 $css .= $new_css;
 return $css;
}

(※ここで登場した$cssという引数は、先ほどのapply_filtersで使われていたものです)

最後に、inline_style_4536のフィルターにadd_css_4536のフィルターを加えます。

add_filter( 'inline_style_4536', 'add_css_4536' );

これで、add_inline_style_4536()と記述すると、CSSが出力されるようになります。

このやり方の良いところは、コードの保守性(メンテンス性)がアップするところです。

例えば、今回と同じことをフィルターを使わずにやろうとすると、CSSを出力する関数を作るたびにそれを追加する必要があります。

しかも、その都度関数名も考えなくてはいけませんし、場合によっては読み込む順番も考えなくてはいけません。

その点、フィルターだと、無名関数を使えば関数名を考える必要もありませんし、引数で順番(優先順位)を指定することもできるので、メイン部分に触れることなくCSSを追加することができます。

フィルター名だけ覚えればいいので、以下のようなコードを記述するだけで済むからです。

add_filter( 'inline_style_4536', function( $css ) {
 $amp_css = '';
 if ( is_amp() === true ) $amp_css = 'h2{font-size:16px}';
 $css .= $amp_css;
 return $css;
}, 999 );

もちろん、これはあくまで一例なので、色んな場所で色んな使い方ができます。

その利便性はWordPressのコア部分で多用されていることからもおわかりいただけるかと思います。

使わなくても特に問題があるわけではありませんが、コードのメンテンス性は開発する上で割と重要なポイントだと思うので、「これ便利じゃん!」と思ったらぜひ使ってみてくださいね。


カテゴリー:フィルターフック・アクションフック

シェフ

このサイト「Fantastech」を運営している人。WordPressテーマ「4536」の開発中にインプットした情報などを発信中。お仕事のご依頼については「Shinobi Works」までどうぞ