テーマの関数ファイル(functions.php)には、大きく2つの用途があります。
(主に、テンプレートファイル上で使用するものを定義)
・関数の呼び出しとフィルタ・アクション関数の設定をする
(主に、機能の追加やカスタマイズを行う)
これらを順に解説していきます。
関数、グローバル変数、クラスを定義する
関数の定義
関数ファイル内で定義した関数は、全てのテンプレートファイル内で呼び出す事ができます。
テンプレートファイル上で何度も行う処理などを、関数化しておくと便利です。
1 2 3 |
function my_theme_function() { // 処理 } |
1 |
<?php my_theme_function(); ?> |
また、関数を子テーマでオーバーライドできるようにするには、以下のように記述しておきます。
1 2 3 4 5 |
if ( ! function_exists( 'my_theme_function' ) ) { function my_theme_function() { // 処理 } } |
グローバル変数の定義
テンプレートファイル上で使用する値や配列などは、グローバル変数で定義しておく事が可能です。
1 |
$content_width = 600; |
関数ファイル内で定義した変数は、グローバル変数としてテンプレートファイル内で使用できます。
1 |
<div id="main" style="width: <?php echo $content_width; ?>px"> |
ただし、header.php、footer.phpなどの部分テンプレートでは、global宣言を行うか、$GLOBAL変数を使用します。
1 2 3 |
global $content_width; ... <div id="main" style="width: <?php echo $content_width; ?>px"> |
または、
1 |
<div id="main" style="width: <?php echo $GLOBALS['content_width']; ?>px"> |
変数を、子テーマからも定義できるようにするには、以下のように記述しておきます。
1 2 3 |
if ( ! isset( $content_width ) ) { $content_width = 600; } |
このように記述する事で、子テーマの関数ファイルで定義した値が、親テーマよりも優先されるようになります。
クラスの定義
関数ファイル内では、クラスを定義する事も可能です。
定義したクラスのインスタンスは、関数ファイル内でも、テンプレートファイル内でも、生成できます。
ただし、関数ファイル内でインスタンスを生成した場合、前出のグローバル変数の場合と同様に、部分テンプレートではglobal宣言を用いて使用します。
関数・グローバル変数の定義のまとめ
関数ファイル内で、関数やグローバル変数を定義する場合のまとめです。
関数の呼び出しとアクション・フィルタフック
関数の呼び出し
関数ファイル内では、関数を呼び出して、処理を実行する事ができます。
ただし、多くのWordPress関数は、関数ファイル内で直接呼び出しても、正常に動作しません。
WordPress関数には、それぞれ呼び出すのに適切なタイミングがあり、多くの場合、関数ファイルのロード時点では、まだ早過ぎるのです。
関数ファイルでは、アクションフックやフィルタフックという機能を利用して、適切なタイミングで関数の処理が実行されるように設定します。
アクションフックとは?
アクションフックは、決められたタイミングで処理を実行できるように、予約をする仕組みです。
例えば、register_sidebar
関数を使用してサイドバーの設定をするには、以下のように記述します。
1 2 3 4 5 6 |
function my_widgets_init() { register_sidebar( array( /* ... 中略 ... */ )); } add_action( 'widgets_init', 'my_widgets_init' ); |
register_sidebar
関数を実行するためのmy_widgets_init
という関数を定義して、さらにwidgets_init
というアクションフックのキューに登録することで、関数の呼び出しを予約します。
この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>
タグが挿入されるデフォルトの機能を取り消します。
1 2 |
// WordPressバージョン表記のmetaタグを出力しない remove_action( 'wp_head', 'wp_generator' ); |
条件分岐タグの使用
多くの条件分岐タグは、wp
アクションフック以降でしか使用できません。
1 2 3 4 5 6 7 8 9 10 11 12 |
// ↓ 関数ファイル内では正常に動作しない if ( is_single() ) { // 処理 } // ↓ wpアクションフックで使用すれば正常に動作する function my_wp() { if ( is_single() ) { // 処理 } } add_action( 'wp', 'my_wp' ); |
フィルタフックとは?
フィルタフックは、WordPressのシステムの挙動を変更したい時、管理画面の設定変更などでは対応できない場合などに使用します。
仕組みはアクションフックと似ていますが、アクションフックは一定のタイミングで処理を挿入するイメージなのに対し、フィルタフックではシステムの特定の処理を改変します。
例えば、newsカテゴリの記事を単独表示する場合、single-news.phpというテンプレートファイルを使用するようにカスタマイズします。
1 2 3 4 5 6 7 8 9 10 11 |
function custom_template_include( $template ) { if ( is_sigle() && in_category( 'news' ) ) { $new_template = locate_template( array( 'single-news.php' ) ); if ( '' != $new_template ) { return $new_template ; } } return $template; } add_filter( 'template_include', 'custom_template_include', 99 ); |
フィルタフックの仕組みを図で示すと、このようになります。
関数の呼び出しのまとめ
→基本的に、アクションフックまたはフィルタフックを使用する
・条件分岐タグも正常に動作しない物が多いので、適切なアクションフック、フィルタフック内で使用する。