WordPressの子テーマで起きたfunctions.phpの問題

以前書いた記事トTwenty Ten 1.1で子テーマに挑戦で、子テーマ内のfunction.phpについてこんなことを書いていた。

唯一の例外はfunction.phpで、このファイルは、子テーマのfunction.phpが優先的に実行された後、親テーマのfunction.phpが実行される。

この記事を書いたとき、子テーマのfunction.phpで新しい関数を定義することは確認したが、親テーマのfunction.phpで定義された関数の変更を検証していなかった。

このため、子テーマに親テーマのfunctions.phpをコピーしておいて、変更したい箇所だけ書き換えれば良いのではないかと、単純に考えていた。ところが、実際にやってみると、こんなエラーが生じてしまう。

error-message

ちょうど、WordPress3.10RC3が出たばかりだったので、同じことをRC3でも行ってみたが、結果は同じだった。

ということは、子テーマのfunctions.phpというのは、自分で定義した関数を追加するだけの機能しかなく、親テーマで定義されている関数を変更することはできないということになってしまう。

そりゃいくらなんでも不便だと思って、いろいろと弄ってみたら、最後にこんな結論に至った。

親テーマと子テーマに同じ名前で内容も同じ関数が、ひとつでもあった場合、WordPressはどちらを実行してよいのか分からなくなって、パニックに陥ってしまう。

だから、この問題を回避するためには、変更したいと思う親テーマの関数のみを子テーマで再定義すればよい(考えてみると当たり前だったかもしれない)ということになる。実際にやってみるとこれでうまく行く。書式はいたってシンプルで、こんな感じだ。

<?php
function 関数名 {
}

なお、一行目が抜けるとエラーになるので注意が必要。私はこれで、時間を無駄にしてしまった。また、functions_exists判定のある関数の場合、functions_existsを含めても含めなくても動作するが、functions_exists判定から書く場合は、最後はendif;で終わることをお忘れ無く。