子テーマを作成した後に、親テーマからファイルをコピーして子テーマで修正しても、修正が反映されないということがおきます。そういう場合にどうやって確認すればよいかとその場合の対策についてです。
echoなどを使って確認していく方法を解説するので、本番稼働のWordPressで確認するのはおススメしません。テスト環境で確認してください。
修正したファイルが読み込まれているかどうか
下記のコードを子テーマ側functions.phpに書いて、子テーマでファイルの中の関数が読み込まれているかどうかを確認します。
//「phpファイル内の関数名」には、修正したファイルの中の関数名を指定 if(!function_exists('phpファイル内の関数名')) { echo '読み込まれている'; } else { echo '読み込まれてない'; }
子テーマ側にファイルをコピーしただけでは、読み込まれていない場合があります。読み込まれていない場合は、子テーマのfunctions.phpにrequire_onceで読み込ませます。
読み込まれているけど修正が反映されない
require_onceで読み込ませたらエラーになった場合は、「親テーマのrequire_onceで読み込んでいるファイルを子テーマで上書き(オーバーライド)したい」を参考。
require_onceで読み込ませ、エラーの出力はなく、上記のfunction_existsでも関数が存在しているのを確認済みの場合は、「キャッシュが読み込まれている」または「プライオリティ(関数の読み込み順)」をチェックします。
キャッシュの場合は、管理画面からログアウトして確認してみます(ほとんどおきないと思われる)。
プライオリティの場合とは、子テーマを作成すると、子テーマ、親テーマの順に読み込まれますが、親テーマの関数のプライオリティが高いために、子テーマの関数が無視されてしまうという状態です。
※関数が親テーマと子テーマで重複エラーにならない場合は、親テーマは親テーマディレクトリのファイルを読み込み、子テーマは子テーマディレクトリのファイルを読み込んでおり、スコープが違うため。
解決するためには、親テーマがadd_actionなどでフックしている該当の関数の場所(大抵の場合はfunctions.phpにある)を見つけ、それをremoveして子テーマで関数をadd_actionします。
親テーマ側の関数をremoveして子テーマでadd_actionする
子テーマ側のfunctions.phpに下記のコードを記載します。
コードは、after_setup_themeを使って、親テーマを読み込んだ状態を作り、親テーマを読み込んだら指定の関数をremoveして、子テーマの関数を実行するという内容になっています。
function remove_function_from_parent() { //親テーマで読み込んだ関数が存在する場合、removeして子テーマの関数をフックさせる if(!function_exists('関数名')) { remove_action('親テーマでフックしているアクション名','関数名'); add_action('親テーマでフックしているアクション名','関数名'); } } //after_setup_themeで親テーマを読み込んだら実行するという指定を行っている。 add_action('after_setup_theme','remove_function_from_parent');
これで大切なのは、「親テーマでフックしているアクション名」を探すことができるかどうかです。他の関数の読み込みと一緒になっていたりすると厄介で修正が難しくなります。
その場合は、「親テーマのrequire_onceで読み込んでいるファイルを子テーマで上書き(オーバーライド)したい」を検討したほうがよいです。