WordPressのテーマである「Attitude」の独自のPHPファイルを子テーマでカスタマイズしたい時、単純に子テーマのfunctions.phpから読み込ませてもうまくいきませんでした。header.phpやsingle.phpなどといったPHPファイルであれば、子テーマにそのままコピーして持ってくることで上書きされます。しかし、独自のPHPファイルは個別にインクルードしていく必要があり、特に「Attitude」テーマのPHPファイルは単純にインクルードしてもうまくいきませんでした。
親テーマのfunctions.phpを覗くと、attitude_initアクションにテーマに必要なPHPファイルが読み込まれるように登録され、その直後にattitude_initアクションが発動されていました。
まずは親テーマのattitude_load_filesアクションを削除をしたいのですが、削除するためには、親テーマが読み込まれた後、かつ、attitude_initが発動する前のタイミングになります。
親テーマが発動した後のフックに使うafter_setup_theme()関数では、attitude_initが発動した後になってしまいます。そのため今回は、attitude_initが発動したタイミングで親テーマのattitude_load_filesを削除することにしました。さらに、子テーマのfunctions.phpでattitude_load_files_childを新たに定義し、子テーマのPHPファイルを読み込まれるようにしています。
//親テーマfunctions.php/attitude_load_filesをフックから削除
function remove_attitude_load_files(){
remove_action( 'attitude_init', 'attitude_load_files', 15 );
}
add_action( 'attitude_init', 'remove_attitude_load_files', 1 );
// attitude_initに新しく定義した関数を登録
add_action( 'attitude_init', 'attitude_load_files_child', 15 );
function attitude_load_files_child() {
/**
* attitude_add_files hook
*
* Adding other addtional files if needed.
*/
do_action( 'attitude_add_files' );
/** Load functions */
require_once( ATTITUDE_FUNCTIONS_DIR . '/i18n.php' );
require_once( ATTITUDE_FUNCTIONS_DIR . '/custom-header.php' );
require_once( ATTITUDE_FUNCTIONS_DIR . '/functions.php' );
require_once( ATTITUDE_FUNCTIONS_DIR . '/customizer.php' );
require_once( ATTITUDE_ADMIN_DIR . '/attitude-themeoptions-defaults.php' );
require_once( ATTITUDE_ADMIN_DIR . '/attitude-metaboxes.php' );
require_once( ATTITUDE_ADMIN_DIR . '/attitude-show-post-id.php' );
/** Load Shortcodes */
require_once( ATTITUDE_SHORTCODES_DIR . '/attitude-footer_info.php' );
/** Load Structure */
require_once( ATTITUDE_STRUCTURE_DIR . '/header-extensions.php' );
require_once( ATTITUDE_STRUCTURE_DIR . '/searchform-extensions.php' );
require_once( ATTITUDE_STRUCTURE_DIR . '/sidebar-extensions.php' );
require_once( ATTITUDE_STRUCTURE_DIR . '/footer-extensions.php' );
// カスタマイズしたいファイルを子テーマから参照.
require_once( ATTITUDE_CHILD_DIR . '/library/structure/content-extensions.php' );
/** Load Widgets and Widgetized Area */
require_once( ATTITUDE_WIDGETS_DIR . '/attitude_widgets.php' );
}