WordPressの子テーマ編集でfunctions.phpを上書きする方法

Tips

WordPressで既存のテンプレートを使う場合は、子テーマを作成して子テーマにカスタマイズを施します。
子テーマの作り方はこちらのページを参考にしてください。

さて、子テーマを作成していて困る点は親テーマのfunctions.phpを簡単に上書きできないことです。
また、親テーマと同じ名前の関数を定義しようものならエラーが出てWordPressを表示できない状態に陥ります。

けれども子テーマのfunctions.phpで上書きする方法はあります。

親テーマのfunctions.phpに下記の例のように、if ( ! function_exists( ‘example_template’ ) ) {}の記述があると、子テーマで上書きが可能です。

if ( ! function_exists( 'example_template' ) ) { 
          function example_template (){} //functionの記述 
 }

けれども、この記述がない場合に問題が起こります。関数名が同じだとエラーになり、関数名を変更しても子テーマのfunctions.php→親テーマのfunctions.phpの順で読み込まれて、結局は親テーマのfunctions.phpの内容に戻されてしまいます。
そこで読み込みの順番を変える仕掛けが必要になります。

次の記述で親テーマのfunctions.php→子テーマのfunctions.phpの順で読み込まれて、functions.phpを子テーマに記述した内容に書き換えることができます。

下記例は抜粋文字の文字数を変更する例

function fly_excerpt_length2( $length ) {
	$excerpt = get_theme_mod( 'exc_lenght', '120' );
	return $excerpt;
}
function setup_after_parent_theme() {
add_filter( 'excerpt_length', 'fly_excerpt_length2', 999 );
 // 親テーマでフックしているアクションを削除
remove_action( 'excerpt_length', 'fly_excerpt_length' );
}
 
// 親テーマの後に実行
add_action( 'after_setup_theme', 'setup_after_parent_theme', 20 );

これは親テーマのfunctions.phpでfly_excerpt_length()を定義してフィルターフックを使って抜粋文字数を決めているものを、子テーマのfunctions.phpで別名のfly_excerpt_length2()を定義して、その後フィルターフックを使って抜粋文字数を決めています。そしてその後、親テーマでフックしているアクションを削除しています。
さらに親テーマのfunctions.php実行後に子テーマのfunctions.phpを実行するようにアクションフックを使って記述したものです。

add_filter()やadd_action()の第3引数は、 特定のアクションに関連づけられている関数が実行される優先順序を指定するものです。少ない数であれば早く実行され、同じ数の優先度である関数はアクションに追加された順序で実行されます。省略した場合の初期値は10です。

タイトルとURLをコピーしました