WordPress のカスタマイズ中に必然と出会う「フック」について

WordPress をカスタマイズしていると、必ず 「アクションフック( = add_action )」 と 「フィルターフック( = add_filter )」 という関数に出くわします。

この出会いは、確率200%

WordPress のカスタマイズを始めた頃は、何気なく理解した面でやり過ごしてきましたが、このアクションフックとフィルターフックを極められれば、WordPress 中級者へとステップアップできるそうなので、夜な夜な調べたことをまとめてみました。

WordPress 本体(コアファイル)のカスタマイズについて

WordPress 自体は PHP でできたオープンソースの CMS なので、 WordPress の本体(コアファイル)を直接イジってカスタマイズすることもできますが、本体を直接イジってコーディングすると、些細なミスで予期せぬ部分に影響を与えたり、そもそも本体をアップデートする時には上書きされてしまうので、独自にカスタマイズした内容が全てリセットされるリスクがあります。

なので、まず WordPress 本体(コアファイル)には手をかけないこと。そっとしておくこと!! っていうのが、WordPress 界では暗黙の了解になっているのではないかと思います ( ˘ω˘)

WordPress の本体(コアファイル)は、イジれるけどイジるなら覚悟してイジってね!!?

っていう話しです。

【WordPressのファイル群】 WordPressのファイル群

上のリストが WordPress 直下に配置されているファイル群になりますが、テーマファイルを格納する 「 wp-content 」 以下のディレクトリ以外は基本的に素通りする。

「wp-config-sample.php」だけは、インストール時に「wp-config.php」にリネームして必要な情報を入力する必要があります。

プラグインAPI

では、 WordPress 本体をカスマイズ(デフォルトの振る舞いを変更)したい場合にはどうしたらいいか? というと、 WordPress には予めプラグイン API (Application Programming Interface) という、本体をイジらずにカスタマイズする仕組みが用意されています。

これを公式オンラインマニュアルでみると、以下のように記載されていました。

WordPress プラグインを使うと、WordPress サイトの変更、カスタマイズ、機能強化を簡単に行うことができます。WordPress のコアプログラムに手を入れる代わりに、プラグインで機能を付け加えることができるのです。

WordPress Codex|プラグインの作成

因みに、プラグインというと身構えてしまいそうですが、プラグインとは何もプラグインレポジトリにあるようなものだけを指している訳ではなく、以下のように、 WordPress では1つの関数でもプラグインと呼んでいます。

WordPress プラグインは PHP 言語で記述された、プログラムないし1つ以上の関数の集まり…

WordPress Codex|プラグインの作成

なので、 WordPress の振る舞いをカスタマイズするには、1つ以上の関数の組み合わせを、プラグイン API という WordPress 本体との窓口を通じて実行するかたちになっていて、 「フック( = hook )」 という概念で WordPress に組み込まれています。

アクションフックとフィルターフック

「フック」を直訳すると、引っ掛けるものとかそんな意味だと思いますが、今回の意味合いも同じで、特定のタイミングでプラグインを引っ掛けて実行するためのもので、本題である 「 アクションフック 」 と 「 フィルターフック 」 という、2種類の API のことになります。

では、この「アクション」で引っ掛ける場合と、「フィルター」で引っ掛ける場合の違いは!?

またまた、 WordPress Codex からの引用になりますが、アクションフックとフィルターフックには以下のような違いがあるようです。

アクションフック
アクションは、実行中の特定のポイントもしくは特定のイベント発生時に WordPress のコアが起動させるフックです。アクション API を使用して、これらのポイントで実行中の PHP 関数を一つ以上指定することができます。

アクションは、WordPress で発生する特定のイベント、例えば投稿の公開、テーマの変更、管理画面の表示などによって始動させらせます。プラグインは PHP 関数を実行することによってこのイベントに反応することができます。


フィルターフック
フィルターは、データベースに追加する前やブラウザのスクリーンに送り出す前にさまざまなタイプのテキストを改造するために WordPress が起動させるフックです。プラグインは、フィルター API を使用して、これらのタイミングで特定のタイプのテキストを改造するために一つ以上の PHP 関数の実行を指定することがきます。

フィルターは、実行中の特定のポイント、データに何かのアクション(データベースへの追加やブラウザスクリーンに送り出すなど)を行なう前にデータが通過する関数です。フィルターはデータベースとブラウザの間に位置し(WordPress がページを生成するとき)、ブラウザとデータベースの間にも位置します(WordPress が新しい投稿やコメントをデータベースに追加するとき)。WordPress のほとんど入力と出力は最低ひとつはフィルターを通過します。WordPress はデフォルトでいくつかのフィルタリングを行なっていて、プラグインで追加することができます。

WordPress Codex|プラグインAPI – フック、アクションとフィルタ

と説明されていますが…。

要約すると、アクションフックは、WordPressにログインした時や、表示されている項目が変更された時などにフックするもので、フィルターフックは、データベースへの入出力があった時にフックするものということですか。

なるほど。 まだちょっと分かり辛い(´ . .̫ . `)

多分、習うより慣れろ! ということだと思うので、ユースケースで2種類のフックを試していきたと思います。

アクションフック

アクションフッック一覧

参考:アクションフック一覧
http://wpdocs.sourceforge.jp/プラグイン_API/アクションフック一覧

上記リンク先の一覧を覗くと、数多くのアクションフックが用意されているのが確認できます。全てを細かく調べた訳ではありませんが、一覧から使用頻度が高そうなものをピックアップして、特徴を掴んでみたいと思います。

アクションフックの使い方

アクションフックを実装するには、 add_action 関数を使い、パラメータにフックするアクションを指定します。

【add_action 関数】
<?php add_action( $hook, $function_to_add, $priority, $accepted_args ); ?>

それぞれのパラメータは下記の通りになります。

$hook
(文字列)(必須)アクション名を指定。(アクションフック一覧から)|初期値: なし
$function_to_add
(コールバック)(必須)フックする関数名。|初期値: なし
$priority
(整数)(オプション)関数が実行される優先順序を指定|初期値: 10
$accepted_args
(整数)(オプション)フックした関数が受け入れられる引数の数。|初期値: 1
戻り値(boolean)
常に true。

アクションフックの使用例

それでは、上記の通り指定するパラメータを確認しながら、アクションフックを実行させてみましょう!


EX-1|複数の JavaScript ファイルをアクションフックで読み込む

サイト内で共通して読み込みたい JavaScript が複数ある場合は、 functions.php で一括管理する方がベターなので、アクションフックで JavaScript ファイル を読み込んでみます。

実行するアクションフック名
 wp_enqueue_scripts 
実行されるタイミング
テンプレートにJavaScriptを挿入する前に実行される。

実装方法は、functions.php(wordpress/wp-content/themes/hogehoge/functions.php)へ、下記のようにコーディングします。

<?php

// JS ファイルをエンキュー
function theme_add_scripts(){
  wp_enqueue_script('hogehoge', get_theme_file_uri().'/js/hogehoge.js', array(), '1.0.0', true );
  wp_enqueue_script('fugafuga', get_theme_file_uri().'/js/fugafuga.js', array(), '1.0.0', true );
}

// アクションフックで読み込む
add_action('wp_enqueue_scripts','theme_add_scripts');

?>

ブラウザに吐き出された HTML の出力結果を確認したら、以下の通りきちんとできました!

上の例では、 hogehoge.js と fugafuga.js の2つの JavaScript ファイルを、 wp_enqueue_script() 関数でエンキューしておいて、アクションフックの wp_enqueue_scripts に引っ掛けて読み込みました。

同様の振る舞いをするアクションフックに、 wp_print_scripts がありますが、wp_enqueue_scripts はフロントエンドにのみ処理が適用される(管理画面には影響しない)ため、 こちらの方が適切な使用方法のようです。
wp_enqueue_script 関数と、アクションフックの wp_enqueue_scripts の最後の(s)のコーディングミスに注意!!

EX-2|新しい投稿を公開したらメールで知らせる

以下は、WordPress Codex にある用例ですが、アクションフックの代表的な用例として散見するので、載せておきたいと思います。

実行するアクションフック名
 publish_post 
実行されるタイミング
投稿が公開された時と編集されたステータスが「公開済み」に変わった時に実行される。

function email_friends($post_ID)  {
    $friends = 'bob@example.org,susie@example.org';
    mail($friends, "sally's blog updated", 
        'I just put something on my blog: http://blog.example.com');
    return $post_ID;
}
add_action('publish_post', 'email_friends');

email_friends() と定義した関数(内部で PHP の mail関数を実行する。)を、アクションフックの publish_post に引っ掛けて実行していますね。

フィルターフック

参考:フィルターフック一覧
http://wpdocs.sourceforge.jp/プラグイン_API/フィルターフック一覧

フィルターフックも数多くのフックが用意されていることが確認できます。アクションフック同様に、一覧から使用頻度が高そうなものをピックアップして、特徴を掴んでみたいと思います。

フィルターフックの使い方

フィルターフックを実装するには、 add_filter 関数を使い、パラメータにフックするフィルター関数を指定します。

【add_filter 関数】
<?php add_filter( $tag, $function_to_add, $priority, $accepted_args ); ?>

それぞれのパラメータは下記の通りになります。

$hook
(文字列)(必須)フィルターフックの名前。(アクションフック一覧から)|初期値: なし
$function_to_add
(コールバック)(必須)フックする関数名。|初期値: なし
$priority
(整数)(オプション)関数が実行される優先順序を指定|初期値: 10
$accepted_args
(整数)(オプション)フックした関数が受け入れられる引数の数。|初期値: 1
戻り値(boolean)
フィルターフックに関数を登録できると true を、そうでなければ false を返す。
*ただし、その関数が存在することや、$function_to_add が文字列かどうかもテストしない。

アクションフックと比べると、パラメーターの指定を含め add_action 関数と add_filter 関数は全く同じコーディングで、ただ1つ、戻り値にだけ違いがあることが分かります。

フィルターフックの使用例

では、次はフィルターフックを使ってみましょう。


EX-1|タイトルのプレースホルダを変更する

新規投稿時のタイトルのプレースホルダは、デフォルトで 「ここにタイトルを入力」 になっていますが、このプレースホルダを任意のものに変更したいと思います。

今回は、 「ふまなんたいとるいりちたぼーり」 に変更したいと思います。よく分かりませんが、これでいきましょう! ヾ(*´∀`*)ノ

実行するフィルターフック名
 enter_title_here 
実行されるタイミング
プレースホルダを出力する直前に実行される。

実装方法は、アクションフックの時と同じように、functions.php(wordpress/wp-content/themes/hogehoge/functions.php)にコーディングしたいと思います。

<?php

function theme_enter_title_here( $title ){
    return $title = 'ふまなんたいとるいりちたぼーり';
}

add_filter( 'enter_title_here', 'theme_enter_title_here' );

?>

以下の通り、実行結果を WordPress の管理画面で確認したら上手く反映されていました!

【フィルターフック実行前】 フィルターフック enter_title_here 実行前
【フィルターフック実行後】 フィルターフック enter_title_here 実行後

実際には、カスタムポストタイプを実装した時に、通常の投稿と区別するために、今回のようにタイトルのプレースホルダを変更したりしています。


EX-2|投稿一覧の記事抜粋の末尾を変更

使用しているテーマにもよりますが、記事投稿一覧の記事抜粋の末尾部分は、表示しきれなくなると […] と、3点リーダーで表示されていることが多いと思います。

これを、[…] から [Leer más >>] と、スペイン風にしてみましょう。

実行するフィルターフック名
 excerpt_more 
実行されるタイミング
記事抜粋を出力する直前に実行される。

引き続き、functions.php(wordpress/wp-content/themes/hogehoge/functions.php)に以下のように追加コーディングします。

<?php

function spanish_excerpt_more($more) {
	return $more = '&nbsp;Leer&nbsp;más&nbsp;&gt;&gt;' ;
}

add_filter('excerpt_more', 'spanish_excerpt_more');

?>

以下、ブラウザでの確認結果ですが、いい感じでスパニッシュ風の「続きを読む」に変更されていました!!

【フィルターフック実行前】 フィルターフック excerpt_more 実行前
【フィルターフック実行後】 フィルターフック excerpt_more 実行後

また、記事の抜粋箇所は excerpt_length フックを使用することで、抜粋する文字数を変更するもできます。

<?php

// return で、出力する文字数を返す。
function my_excerpt_length($length) {
	return 70;
}

add_filter('excerpt_length', 'my_excerpt_length');

?>

コーディングの要領は同じですね。


最後に

説明が不足している箇所や表現が分かり辛い箇所もあったと思いますが、 WordPress をスタマイズしていくと必ず出会う、アクションフックとフィルターフックがどういうものなのか?

2種類のフックの違いや、使い方について、頑張ってまとめたつもりですが…。

最終的なまとめ方をすると、アクションフックは、何か新しい処理を追加する時に、フィルターフックは、何か別のものと処理を差し替える時に使う。というイメージで捉えればいい感じがします。

そして、最後の最後に1つだけ。

実は、 「アクションフック( = add_action )」 と 「フィルターフック( = add_filter )」 は同じものです。 ( ゚Д ゚;)

以下のように、 WordPress Codex の、「関数リファレンス/ add action 」のページにもはっきりと書かれています。

この関数は add_filter() のエイリアスです。

WordPress Codex|関数リファレンス/add action

アクションフックは、内部でフィルターフックを呼び出してるだけなので、アクションフックはフィルターフックでした!!

。゚ι。゚•̀.̫•́✧

一応、これがオチです。 以上。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする