WordPressテーマをカスタマイズする際のメモです。
既存テーマのカスタマイズは子テーマを作成して行うと、元ファイルを一切いじらずに済み、テーマのバージョン更新時に変更が上書きされる心配などがなくなります。
子テーマの作成方法は簡単で、wp-content/themes以下に子テーマ用のフォルダを作成し、カスタマイズ用のstyle.cssを入れるだけです。これでテーマの一覧に子テーマが追加され選べるようになります。
子テーマのstyle.cssの中身はこんな感じになります。
/* Theme Name: twentyten_child Template: twentyten */ @import url('../twentyten/style.css'); /* 以下、カスタマイズ内容を書く */コメント内の「Theme Name」「Template」は必須で、それぞれ子テーマ名・親テーマのフォルダ名を指定します。挙動上、子テーマのstyle.cssは親テーマのstyle.cssを上書きするので、@importで親テーマのstyle.cssをインポートすることで継承を行い、その後にカスタマイズしたい要素の記述をしていくのが良いようです。
style.cssのカスタマイズは以上です。他のテンプレートファイル(php)も基本的に同様で、子テーマに同名ファイルがあればそちらで上書きされた挙動をします。例えば子テーマフォルダにheader.phpやfooter.phpがあると、それらがヘッダやフッタに反映されます。ただしfunctions.phpだけは特別で、これは同名ファイルで上書きされず、子テーマのfunctions.php → 親テーマのfunctions.phpの順に両方読み込まれます。ここが本日の重要なポイントです。
さて、テーマによってはサブフォルダを持ちその中に独自のphpファイルが置かれている場合があります。これらも子テーマ側に同名のフォルダとファイルを置いておけば上書きされるのでしょうか。結論から言うと、多分されません。それらはテーマのphpファイルからインクルードされて使われますが、その際に大抵親フォルダのパスが記述されているからです。
それではそれらの中身をちょっとカスタマイズして置き換えたい場合はどうするのがベストでしょうか。長くなりましたが、これが本日の本題です。
この場合、基本的にやることは「親テーマの関数を無効化(remove)」し、「子テーマの関数を有効化(add)する」という対処になります。整理すると以下のような感じです。
- 変更したい親テーマの関数を子テーマのfunctions.phpにコピペする。
- コピペした関数の中身と関数名を変更し、別の関数とする。
- 親テーマの関数をremoveする。
- 子テーマの新関数をaddする。
まずはこの関数を丸ごと子テーマのfunctions.phpの下の方にでもコピペします。そして関数名を変更します。ここではtheme_layouts_child()とでもしておきましょう。そして中身を書き換えます。ちょっとしたカスタマイズなら大抵1行~数行程度の変更になるでしょう。大幅に書き換える場合は、バグの発生に注意しましょう。
次に親関数のremoveですが、子functions.phpは親functions.phpの直前に実行されるため、子functions.phpの実行時点では親の関数をremoveすることができません。そこで「親テーマの関数のremoveを行う関数を定義」し、「WordPressのinit時にremove関数が実行されるよう登録」することで目的を果たします。
テーマ用関数は大抵、宣言の前後にadd_actionの記述があり、これによって呼び出しが登録されているので、remove_actionを使ってadd_actionと逆のことを行います。例えばtheme_layouts()関数が以下のようにadd_actionされていたとします。
add_action('header','theme_layouts',3);この場合、theme_layouts()をremoveするコードは以下のようになります。
// 親テーマの関数をremoveする関数 function remove_parent_theme_actions() { remove_action('header','theme_layouts',3); } // 上記の関数をWordPressのinitに登録 add_action('init','remove_parent_theme_actions');remove_action()の引数は、親テーマのadd_action時と同じにしてください。3番目の引数は優先度で、add_action時に省略されている場合もあります。省略されていない場合は同じ値をremove_action時に指定します。
次に最初に作った子テーマの関数をaddします。これもadd_actionによって同じように行います。
add_action('header','theme_layouts_child', 3);まとめると、子テーマのfunctions.phpは以下のようになります。
// 親テーマの関数をremoveする関数 function remove_parent_theme_actions() { remove_action('header','theme_layouts',3); } // 上記の関数をWordPressのinitに登録 add_action('init','remove_parent_theme_actions'); // カスタマイズした関数を有効化する add_action('header','theme_layouts_child', 3); // カスタマイズした関数 function theme_layoutsa_child(){ // 関数の中身 }以上の方法で、親テーマのファイルに一切手を加えることなく、theme_layouts()の挙動をtheme_layoutsa_child()で定義された内容に変えることができます。書き換える関数が複数あっても、やり方は同じです。
参考:
子テーマ – WordPress Codex 日本語版
http://wpdocs.sourceforge.jp/子テーマ