WordPressでサイト構築の際、子テーマを使うケースが多々あります。
主な使用目的は、テーマをカスタマイズした際に、テーマのアップデートによりカスタマイズした内容が上書きで消えてしまうのを防ぐ場合です。子テーマは親テーマの内容を上書きするという仕様に基づいた方法です。
しかしこれが、functions.phpに限っては上書き関係ではなく、読み込みの優先順に基づいて処理され、処理される順番は「子→親」の順になります。このため、親子で同じアクションフックを使うと親のfunctions.phpの処理が優先されてしまいます。この記事は「子テーマのfunctions.phpの処理を優先させる」ための管理人忘備録です。
このページのコンテンツ
子テーマのfunctions.phpの処理を優先する方法
以下ではthe_exerpt()で文末に出力される[...]を...に変更するカスタマイズを例にして、子テーマの処理を優先させる方法をご紹介します。
function my_excerpt_more($more) { return '…'; } add_filter('excerpt_more', 'my_excerpt_more');
上記コードのアクションフックexcerpt_moreが、親テーマでも使われていると子テーマ側のfunction.phpでいくらカスタマイズしても、親テーマが優先されてしまい、カスタマイズ内容が反映されません。
子テーマ側のfunctions.phpの処理を優先させたい場合は、以下の様に変更してください。
function my_excerpt_more($more) { return '…'; } function my_after_parent_theme() { remove_action('excerpt_more', '親テーマでexcerpt_moreにアクセスしている関数名'); add_filter('excerpt_more', 'my_excerpt_more'); } add_action('after_setup_theme', 'my_after_parent_theme', 20);
コード解説
my_after_parent_themeという関数を新たに作成しafter_setup_themeのアクションフックで実行します。
remove_action()で、親テーマから出力される結果を削除して、子テーマの関数を実行します。
アクションフックafter_setup_themeは、全てのテーマが読み込まれた後に処理されます。なお、親テーマでも使われていた場合は'set_after_parent_theme', 20の20の数字を、親テーマの方より大きくすれば優先度を変えることができます。
この記事は以下のサイトを参考にさせていただきました。
この記事を書いた人管理人
SAKURAGRAPHICA代表
会社員の傍ら、フリーランスでWEBサイトの制作やWordPressによるCMSの構築・障がい者の就労支援としてホームページ制作の職業指導員も行っております。