WordPressのカスタマイズでよく出てくるのが「add_filter」です。これは既に定義された内容に「変更を加える」ことができるWordPressの関数になります。

当記事では、フィルターフックの仕組みとadd_filter()の使い方について解説していきます。

WordPressのフィルターフックとは?

フィルターフックは「特定のタイミングで内容を変更できる仕組み」のことを指します。こちらを利用することで、既にWordPress側で決められた内容をテーマのfunctions.phpから上書きできるんですね。

例えば、クラシックエディターで文章を入力すると、自動でpタグやbrタグが挿入されますよね。これは、本文を出力する前に実行されるフック「the_content」で、内容に変更を加えているからなんですね。

これらのフィルターフックは、WordPressの中で定義されており、それぞれ固有の名称が付けられています。以下は、一部のフックの名称と実行されるタイミングになります。

the_content エディターの本文を出力する前
the_title 記事タイトルを出力する前
body_class bodyにクラス名を出力する前

これらはほんの一部で、WordPressには様々なフックが用意されています。その他のフックが気になる方は以下をご覧ください。

フィルターフック「add_filter()」の基本的な使い方

フィルターフックを利用する際は、WordPress関数の「add_filter()」を使います。

add_filter( $hook_name, $callback, $priority, $accepted_args );

「add_filter()」は、指定したフックで任意のコールバック関数を実行できる関数になります。

基本的には、第一引数に「フックの名前」、第二引数に「実行したい関数名」を指定してfunctions.phpに記入します。

// 基本的な使い方
add_filter( 'フックの名前', '実行したい関数名' );

// 例)フック「the_content」で関数「my_function()」を実行したい場合
add_filter( 'the_content', 'my_function' );

それでは、実際に具体的な使い方をみていきましょう。

  • 基本的な使い方
  • コールバック関数の実行順序を変更
  • コールバック関数の引数について
  • フックに登録済みの関数を削除する

基本的な使い方

それでは、add_filter()を使って、管理画面に簡単なカスタマイズをしていきます。今回は「投稿」に関するラベルを変更できるフィルター「post_type_labels_post」を利用していきます。

以下は、管理画面の左メニューにある「投稿」を「ブログ」に変更するカスタマイズですので、テーマのfunctions.phpに記入して正常に動作するかご確認ください。

// 投稿のメニュー名を「ブログ」に変更する
add_filter( 'post_type_labels_post', 'my_post_type_labels_post_filter' );
function my_post_type_labels_post_filter( $labels ){
  $labels->menu_name = 'ブログ';
  return $labels;
}

この「post_type_labels_post」フックでは、コールバック関数の引数に、投稿に関する様々なラベルが格納されています。このラベルを上書きすることで、メニュー名を書き換えているんですね。

add_filter()の基本的な使い方は、「コールバック関数の引数に変更を加えてから返す」のが基本になります。最後に「return」しなければ反映されないので、ご注意ください。

なお、「add_filter()」の第二引数には、無名関数も利用できます。

// 投稿のメニュー名を「ブログ」に変更する
add_filter( 'post_type_labels_post', function( $labels ){
  $labels->menu_name = 'ブログ';
  return $labels;
} );

コールバック関数の実行順序を変更

「add_filter()」の第三引数には、コールバック関数を実行する優先度を数値で指定できます。この数値が小さいものから優先的に実行される仕組みです。

例えば「the_content」に3つの関数をフックした場合、読み込まれた順番に実行されますが、

// 同じフックで複数の関数を実行する
add_filter( 'the_content', 'my_function_a' );
add_filter( 'the_content', 'my_function_b' );
add_filter( 'the_content', 'my_function_c' );

// 実行される順番
1:my_function_a()
2:my_function_b()
3:my_function_c()

第三引数に優先度(数値)を指定すると、指定した数値の小さい順に実行されるようになります。

// 同じフックで複数の関数を実行する
add_filter( 'the_content', 'my_function_a', 20 );
add_filter( 'the_content', 'my_function_b', 30 );
add_filter( 'the_content', 'my_function_c', 10 );

// 実行される順番
1:my_function_c()
2:my_function_a()
3:my_function_b()

これにより、実行順序をよりコントールしやすくなるので非常に便利です。なお、第三引数を省略した場合は優先度が「10」になります。

なお、フィルターフックは内容に変更を加える特性上、後から実行された内容に上書きされてしまいます。反映されない時は、優先度の値を大きくして(999など)実行してみてください。

コールバック関数の引数について

「add_filter()」で実行されるコールバック関数の引数は、利用するフックによって異なります。この引数はフィルターフックを使う上で非常に重要なので、WordPress Developer Resourcesのフック一覧から検索して調べるようにしましょう。

なお、引数を2つ以上利用する場合、第四引数を指定しなければいけない点にご注意ください。

第四引数には、受け入れる引数の数を記入するのですが、この数が合っていないとエラーが発生します。第四引数の初期値は「1」のため、2つ以上の引数を利用する場合は、引数の数を必ず記入するようにしましょう。

例えば、記事タイトルを出力する前に実行されるフック「the_title」では、最大2つまで引数を利用できます。2つとも利用する場合は、第四引数に「2」と記入します。

// 引数を2つ利用する場合は第四引数が必要
apply_filters( 'the_title', function( $post_title, $post_id ){
  // ここで変更処理
  return $post_title;
}, 10, 2 );

フックに登録済みの関数を削除する

ここまで紹介したのは、フックに関数を登録して実行する方法です。この登録した関数は「remove_filter()」を利用することで削除できます。

remove_filter( $hook_name, $callback, $priority );

使い方はシンプルで、第一引数に「フックの名前」第二引数に「登録した関数名」を指定するだけです。

remove_filter( 'フックの名前', '登録済みの関数名' );

// 例)フック「the_content」に登録済みの関数「my_function()」を削除したい場合
remove_filter( 'the_content', 'my_function' );

こちらを利用すれば、WordPressで既に登録されている関数を削除して再登録することも可能です。

apply_filters()でフィルターフックのポイントを作る

一般的には、WordPressで定義されたフィルターフックを使うことが多いですよね。ただし、汎用的に使うテーマやプラグインを開発している場合など、自分のシステムに専用のフックを用意したい時があります。

そんな時は「apply_filters()」で、フィルターフックを自分で作ってみましょう。(フック名は自分で好きな名称を設定できます。)

apply_filters( $hook_name, $value, ...$args );

第一引数に「フック名」、第二引数に「フィルターの対象とする値」、第三引数以降に「コールバック関数に渡したい引数」を指定して利用します。

// my_hookという名称のフックポイントを作成
echo apply_filters( 'my_hook', $value, $args1, $args2, $args3 );

// my_hookを利用する場合
add_filter( 'my_hook', function( $value, $args1, $args2, $args3 ){
  // 内容を変更する処理をここ
  return $value;
} );

ここでコールバック関数内で最後に「return」するのが、第二引数になります。第三引数以降は特に必須ではございません。

apply_filters()を書く場所については、どのPHPファイルでも構いません。自分が実行したいタイミングがあれば、その場所に記入してみてください。

まとめ

今回は、フィルターフックの基本的な仕組みと使い方についてご紹介しました。結局のところ、フィルターフックは「apply_filters()」が書かれた箇所に「add_filter()」で処理を加えるという構図で出来上がっています。

ここを理解できれば、WordPressで既に定義されたシステムを自由に書き換えれますので、ぜひ覚えておきましょう。なお、セットで覚えておきたいのがアクションフックです。

フィルターフックと似たような仕組みで、使いこなせばカスタマイズの自由度が上がること間違いなしです。以下で解説してますので、ぜひ参考にしてください。