テーマの関数ファイル(functions.php)には、大きく2つの用途があります。

関数、グローバル変数、クラスを定義する
(主に、テンプレートファイル上で使用するものを定義)
関数の呼び出しとフィルタ・アクション関数の設定をする
(主に、機能の追加やカスタマイズを行う)

これらを順に解説していきます。

関数、グローバル変数、クラスを定義する

関数の定義

関数ファイル内で定義した関数は、全てのテンプレートファイル内で呼び出す事ができます。
テンプレートファイル上で何度も行う処理などを、関数化しておくと便利です。

また、関数を子テーマでオーバーライドできるようにするには、以下のように記述しておきます。

グローバル変数の定義

テンプレートファイル上で使用する値や配列などは、グローバル変数で定義しておく事が可能です。

関数ファイル内で定義した変数は、グローバル変数としてテンプレートファイル内で使用できます。

ただし、header.php、footer.phpなどの部分テンプレートでは、global宣言を行うか、$GLOBAL変数を使用します。

または、

変数を、子テーマからも定義できるようにするには、以下のように記述しておきます。

このように記述する事で、子テーマの関数ファイルで定義した値が、親テーマよりも優先されるようになります。

クラスの定義

関数ファイル内では、クラスを定義する事も可能です。
定義したクラスのインスタンスは、関数ファイル内でも、テンプレートファイル内でも、生成できます。

ただし、関数ファイル内でインスタンスを生成した場合、前出のグローバル変数の場合と同様に、部分テンプレートではglobal宣言を用いて使用します。

関数・グローバル変数の定義のまとめ

関数ファイル内で、関数やグローバル変数を定義する場合のまとめです。

abc-4-2

関数の呼び出しとアクション・フィルタフック

関数の呼び出し

関数ファイル内では、関数を呼び出して、処理を実行する事ができます。

ただし、多くのWordPress関数は、関数ファイル内で直接呼び出しても、正常に動作しません
WordPress関数には、それぞれ呼び出すのに適切なタイミングがあり、多くの場合、関数ファイルのロード時点では、まだ早過ぎるのです。

abc-4-3

関数ファイルでは、アクションフックフィルタフックという機能を利用して、適切なタイミングで関数の処理が実行されるように設定します。

アクションフックとは?

アクションフックは、決められたタイミングで処理を実行できるように、予約をする仕組みです。

abc-4-4

例えば、register_sidebar関数を使用してサイドバーの設定をするには、以下のように記述します。

register_sidebar関数を実行するためのmy_widgets_initという関数を定義して、さらにwidgets_initというアクションフックのキューに登録することで、関数の呼び出しを予約します。

abc-4-5

このwidgets_initのように、実行されるタイミングを示すアクションフックは、数多く用意されています。
詳しくは、プラグインAPI/アクションフック一覧 – WordPress Codex 日本語版を参照してください。

WordPress関数を呼び出すタイミングは、早過ぎても遅過ぎても正常に動作しませんが、「この関数は必ずこのアクションフック」というように決まっているわけではありません。
関数の種類と状況に応じて、アクションフックを選択します。

例として、よく使用されるアクションフックとWordPress関数の組み合わせをまとめました。

アクションフック 関数名 関数の用途
after_setup_theme add_theme_support テーマに機能を設定
add_editor_style ビジュアルエディタのスタイルシートを設定
add_image_size 画像サイズを登録
set_post_thumbnail_size アイキャッチ画像のサイズを設定
register_nav_menus カスタムメニューを追加
widgets_init register_sidebar サイドバーを追加
register_widget ウィジェットを追加
wp_enqueue_scripts wp_enqueue_style 生成したページ内でCSSファイルをロード
wp_enqueue_script 生成したページ内でJavascriptファイルをロード
admin_menu add_menu_page 管理画面のメニューに項目を追加
add_submenu_page 管理画面のサブメニューに項目を追加

アクションフックを使わなくても動作する関数

上記の表で、after_setup_themeの項に列記した関数は、アクションフックを使わずに直接呼び出しても正常に動作するようです。
after_setup_themeは、関数ファイルがロードされた直後に動作するアクションフックなのです。
多くの解説書やサイトでは、上記のafter_setup_themeの項の関数は、アクションフックを用いずに使用しています。

ただ、WordPress標準テーマのtwentyfourteenなどではafter_setup_themeアクションフックを使用しています。 関数ファイル内では、常にアクションフックかフィルタフックを使用して、間接的に処理を実行するのが良さそうです。

アクションフックの削除

アクションフックは、システム側が標準で登録している物もあります。 テーマ独自のカスタマイズとして、システムが登録しているアクションフックを削除する事もできます。

以下の例では、<head>内にWordPressのバージョンを表記した<meta>タグが挿入されるデフォルトの機能を取り消します。

条件分岐タグの使用

多くの条件分岐タグは、wpアクションフック以降でしか使用できません。

フィルタフックとは?

フィルタフックは、WordPressのシステムの挙動を変更したい時、管理画面の設定変更などでは対応できない場合などに使用します。
仕組みはアクションフックと似ていますが、アクションフックは一定のタイミングで処理を挿入するイメージなのに対し、フィルタフックではシステムの特定の処理を改変します。

例えば、newsカテゴリの記事を単独表示する場合、single-news.phpというテンプレートファイルを使用するようにカスタマイズします。

フィルタフックの仕組みを図で示すと、このようになります。

abc-4-6

関数の呼び出しのまとめ

・関数ファイル内で正常に動作しないWordPress関数が多い
→基本的に、アクションフックまたはフィルタフックを使用する
・条件分岐タグも正常に動作しない物が多いので、適切なアクションフック、フィルタフック内で使用する。