WordPressのフックについて ~基本編~

WordPressのフックについて ~基本編~ スタッフブログ

こんにちは、マークアップエンジニアの尾高です。

WordPressにはフックという仕組みがあり、WordPressコア・テーマ・プラグインなど、さまざまなところで利用されています。また、テーマやプラグインをカスタマイズする場合にも利用するので、WordPressを深く理解するにはフックの知識が欠かせません。

今回は、これからWordPressのカスタマイズについて学ぼうとしている方へ向けて、フックの仕組みと簡単な利用例をご紹介します。

フックとは

フックは、プログラムの特定の箇所に対して処理を追加できる仕組みです。

フックの種類

WordPressのフックにはアクションフックとフィルターフックの2種類あります。

アクションフックは「処理の追加」、フィルターフックは「データの加工」に利用されることが多いです。

処理を追加

アクションフックの場合はadd_action()、フィルターフックの場合はadd_filter()を呼び出します。このとき、処理を追加したいフックの名前と関数を指定します。オプションで、追加する処理の優先順序も指定できます。

追加した処理を実行

アクションフックの場合はdo_action()、フィルターフックの場合はapply_filters()に実行するフック名を指定して呼び出します。これにより、指定したフック名に対して指定した関数が実行されます。

カスタマイズするときに、アクションフックやフィルターフックを作成することは少なく、基本的には既存のアクションフックやフィルターフックに対して処理を追加することが多いです。

フィルターフックについて

フィルターフックはアクションフックと比べると少し複雑なので、フィルターフックの実行によってデータが加工される過程を説明します。

ここでは加工する元データを値A、追加された関数は実行順に、関数X関数Yとします。

  1. フィルターフックを実行。追加された関数の中で最初に実行される関数Xに値Aを渡す。
  2. 関数Xは受け取った値Aを値Axに加工して次の処理に渡す。
  3. 関数Yは受け取った値Axを値Axyに加工して次の処理に渡す。
  4. 追加された関数をすべて実行し終えたので、フィルターフックが値Axyを受け取る。

フィルターフックを実行すると、以上のような流れで処理が実行されます。

フィルターフックに追加された関数では、加工後の値をreturnして次の処理に値を渡しています。そして、最終的な加工結果がフィルターフックの戻り値になります。

フックの利用例

ここからは、アクションフックとフィルターフックの利用例をご紹介します。

スクリプトを読み込む - アクションフック

ここではスクリプトを読み込むためにアクションフックを利用します。

WordPressでのスクリプト読み込みはwp_enqueue_script()の使用が推奨されています。この関数はアクションフックのwp_enqueue_scriptsによって呼び出す必要があるので、wp_enqueue_scriptsに対してスクリプトを読み込む関数を追加します。

functions.php

function enqueue_my_script() {
    wp_enqueue_script( 'my_script', get_template_directory_uri() . '/js/script.js' );
}

add_action( 'wp_enqueue_scripts', 'enqueue_my_script' );

この例のように、WordPressの関数には呼び出すフックが指定されている場合があります。使用する前に関数のリファレンスを確認するようにしてください。

ちなみにアクションフックとフィルターフック共に、すでに追加された関数を除去できます。ここでは説明のために、先ほどのenqueue_my_script()を除去します。

functions.php

remove_action( 'wp_enqueue_scripts', 'enqueue_my_script' );

使用する場面としては、プラグインがフックに追加している関数を除去する時などが考えられます。アクションフックの場合はremove_action()、フィルターフックの場合はremove_filter()を使用します。

投稿タイトルを抜粋して取得 - フィルターフック

ここでは投稿タイトルを抜粋して取得するためにフィルターフックを利用します。

投稿のタイトルはget_the_title()で取得できます。関数内部で投稿タイトルの文字列($title)は、フィルターフックのthe_titleを通ってからreturnされています。

wp-includes/post-template.php:117

function get_the_title( $post = 0 ) {
    // 省略

    return apply_filters( 'the_title', $title, $id );
}

このフィルターフックを利用して、投稿タイトルを加工します。ここでは「個別ページ以外」かつ「投稿タイトルが20文字を超える」場合、先頭から20文字だけを取得するように加工します。

functions.php

function trim_title( $title ) {

    // 個別ページ以外であれば
    if ( ! is_singular() ) {
        // 文字列が20文字を超える場合、先頭から20文字を切り出す。
        $changed_title = wp_trim_words( $title, 20, '' );
        return $changed_title;
    }

    return $title;
}

add_filter( 'the_title', 'trim_title' );

このようにすることで、投稿タイトルの抜粋を取得できるようになりました。

おわりに

今回はWordPressのフックについてご紹介しました。基本的な内容ばかりでしたが、今回の内容を理解していればある程度のことはできると思います。
実際の作業は、カスタマイズの目的を実現できるアクションフックやフィルターフックを探すところから始めます。今後その辺りを「実践編」として記事にできたらいいなと考えています。