blog ブログ
こんにちは 、asaです。
今回は、WordPressの開発とカスタマイズに重要なアクションフックとフィルターフックの使い方を解説します。WordPressのコア、テーマ、プラグインを改造しないといけなくなったという時に、「フック」を理解していればコア、テーマ、プラグインに手をいれなくても、機能を足したり削除したりできるようになります。
目次
フックとは?フックの重要性
フックとは、後から別のプログラムによって処理を追加し、そのような機構を用いて独自のコードを元のプログラムに割り込ませることをいいます。
カスタマイズ性があり、機能を足したり削除したりできるとともに、WordPressのコア、プラグイン、テーマの機能を実行する際に修正できます。プラグインやテーマを書いたとき、後から、他の開発者がコアソースコードまで編集することなく、改善や変更、カスタマイズができるようになります。
これらがないと、テーマやプラグインのカスタマイズ性が大きく低下します。
実装方法は、主にfunctions.phpに下記のように記述します。
function 実行する関数名(){
// 実行する処理内容;
}
add_action( 'フック名', '実行する関数名' );
アクションフック、フィルターフックとは?
WordPress APIの基礎的な部分でコア、テーマ、プラグイン、PHPによって実行させる、基礎的なイベントのトリガー(引き金を引く)というフックです。
トリガーにより、イベントが発生したとき、すべての関数、またはクラスメソッド、もしくはその両方が、正しい順序で実行されます。
アクションフック
アクションフックは特定のタイミングでユーザ独自の処理を実行させることができます。
主にページの読み込み、ユーザーのログイン、テーマやプラグインで定義されている、カスタムアクションなど何かが起こったイベントのときに処理を行いフックすることで、さまざまな場面で機能を追加したり削除したりすることができます。
アクションフックポイントを登録するためのメソッドとして、 do_actionメソッドを使います。do_action()の最初の引数はアクションフックポイントの名称であり、それ以降の引数はアクションをフックさせる変数です。
使用
以下はhead内にOGタグのタイトルタグを出力する例です。
function example01(){
echo '<!-- [ OGタイトル ] -->'."n";
echo '<meta property="og:title" content="アクションフックでOGタイトルを出力する" />'."n";
echo '<!-- [ /OGタイトル ] -->'."n";
}
add_action('wp_head', 'example01');
<head>タグに書いてある<?php wp_head(); ?>のタイミングで出力されます。
アクションフックの優先順位
wp_head()に対してアクションはいくらでも追加できますが、その実行順番を指定したい場合は、add_action()関数の第三引数が優先順位になります、値が小さい方が先に実行されます。未記入の場合は10で処理されます。
function example02(){
echo '<!-- 優先度 10 の出力順 -->';
}
add_action( 'wp_head', 'example02', 10 );
function example03(){
echo '<!-- 優先度 5 の出力順 -->';
}
add_action( 'wp_head', 'example03', 5 );
優先度5の方が先に出力されます。
アクションフックは外部から外せる
アクションフックのもう一つ大きなメリットは、追加してあるアクションフックの処理を外部から削除することができます。
// wp_head にアクセス解析タグを追加
function example01(){
echo '<!-- [ アクセス解析タグ ] -->';
}
add_action( 'wp_head', 'example01' );
// 登録済みのアクションを外す
remove_action( 'wp_head', 'example01' );
アクセス解析のタグを追加してありますが、その後ですぐに削除しています。
どんな場面で使用するかといえば、コアやプラグインがもうすでに書かれているアクションフックの処理を、使う人が必要に応じて外したい時などに使用できる機能です。
フィルターフック
フィルターフックは特定のタイミングで特定の変数を変更させるためにユーザ独自の処理を実行させることができます。
例えば、メタデータを特定の形式で出力したり、プラグインが出力するテキストを上書きしたり、何かが全く表示されないようにフィルターをかけることができます。
アクションとは異なり、フィルターのコードは元の値を修正したコピーを、WordPressの処理の途中で出力されるものであり、カスタマイズして返り値とします。
フィルターフックポイントを登録するためのメソッドとして、apply_filtersメソッドを使います。既存のコードにフィルターを適用します。
apply_filters()の最初の引数はフィルターフックポイントの名称で、それ以降の引数は、フィルターにフックされた関数が修正されたり適用されたりする際に使われるデータや値です。
使用
長文を省略する時に出力される文字列(デフォルトでは「…」)を修正するカンタンな処理の例です。
//末尾の文字列を設定
function new_excerpt_more($more){
global $post;
return '...;<a href="' . get_permalink($post->ID) . '">続きを読む';
}
add_filter( 'excerpt_more', 'new_excerpt_more' );
excerpt_moreフィルターフックにnew_excerpt_more関数を登録しています。
カスタマイズした値がreturnされています。
これで長文を省略した際にデフォルトでは「…」ではなく、投稿ページへの「続きを読む」リンクが出力されるようになります。
アクションフックと同様に第三引数に整数を入れれば同フック内の優先順位を指定することができます。
使用2
デフォルトの記事抜粋の文字数を50文字に変更してみました。ちなみにデフォルトは110文字です。
//抜粋する文字数を設定
function new_excerpt_mblength($length){
return 50;
}
add_filter( 'excerpt_mblength', 'new_excerpt_mblength' );
アクションフックとフィルターフックの違い
アクションフックはコールバックの返り値を利用してませんが、フィルターフックはコールバックの返り値を利用していることがわかります。
アクションとフィルターの違いを次の表にまとめました。
項目 | アクション | フィルター |
---|---|---|
目的 | 特定のタイミングでユーザ独自の処理を実行させる。 | 特定のタイミングで特定の変数を変更させるために ユーザ独自の処理を実行させる。 |
コールバックの戻り値 | なし | あり |
フックポイントを登録 するためのメソッド |
do_action() do_action_ref_array()/td> |
apply_filters() apply_filters_ref_array() |
フックするためのメソッド | add_action() | add_filter() |
終わりに
WordPressが世界で一番使われているCMS(コンテンツマネジメントシステム)であり続ける理由は、そのカスタマイズ性にあるといえます。
最初はわかりにくいフィルター、アクションフックですが、使用できるようになればWordPressのもつカスタマイズ性が大きく広がり、とても便利なので是非使ってみてください。
Webサイト制作のご依頼、ご相談等お気軽にお問い合わせください!