こないだ、WordPressのfunction.phpにコードを追加したら「Fatal error:Cannot redeclare add_stylesheet()」というエラーが出てサイトが表示されなくなりました。
追加したコードを消したファイルを再アップロードしたら問題なくサイトが閲覧できたことを考えると、追加したコードに問題があった事がわかります。
という事で「Fatal error:Cannot redeclare」エラーが何なのか調べてみました。
今回追加したコード
CSSとJavaScriptを読み込むために、function.phpに以下のようなコードを追加しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?php // CSSの読み込み function register_stylesheet() { wp_register_style('animate', get_stylesheet_directory_uri().'/css/animate.min.css'); } function add_stylesheet() { register_stylesheet(); wp_enqueue_style('animate', '', array(), '1.0', false); } add_action('wp_enqueue_scripts', 'add_stylesheet'); // スクリプトの読み込み function register_script(){ wp_register_script('wow', get_stylesheet_directory_uri().'/js/wow.min.js'); } function add_script(){ register_script(); wp_enqueue_script('wow', '', array(), '1.0', false); } add_action('wp_print_scripts','add_script'); ?> |
Animate.css と wow.js を読み込むコードを追加したつもりだったけど一体何が問題なのか。
理由がわからなかったので、同じコードを別のサイトに追加してみたところ、普通にサイトが表示されたしアニメーションも問題なく動いていました。
まぁ悩んでいても答えが出ないので、ちょいと調べてみることにします。
「redeclare」の意味って何だろう
あれこれ調べる前に、とりあえず「redeclare」の意味って何?と疑問に思いGoogle先生に聞いてみたところ…
なるほど「再宣言」とな?
再宣言…再宣言…
「Fatal error:Cannot redeclare add_stylesheet()」というエラーだったから、どこかで add_stylesheet()関数が使われてるって事かい?
当然、子テーマのfunction.phpには同じコードは記述してないので、親テーマのfunction.phpに同じ関数がないかチェックしてみます。
add_stylesheet()関数がありました!
同様にadd_script()関数もみてみると…
やっぱりありました。
既に親テーマの方で、add_action関数を使って外部ファイルを読み込んでいたんですね。
という事で、Animate.css と wow.js を読み込むための関数が、親テーマと子テーマで重複していた事が原因だったようです。
自分はPHPに関してあまり詳しくないので、「Fatal error: Cannot redeclare」について他サイトさんから引用させていただきます。
PHPの「Fatal error: Cannot redeclare 関数()…」のエラー解消方法
要するに、親テーマと子テーマで同じ関数名は使えないって事ですか。知らんかった。
子テーマから親テーマのfunctions.phpを変更する
子テーマから関数を上書きする方法について紹介している別のサイトさんがあったので、親テーマ側で記述の変更をしたくないという方は参考にしてください。
[WordPress] 子テーマから親テーマのfunctions.phpを変更する
同じ関数名を子テーマに書いて上書きを試みると、「Fatal error: Cannot redeclare」エラーになります。
参考:Overriding WordPress Functions | venutip.com
エラーを回避するには、親テーマでadd_actionされている関数を子テーマでremove_actionしてから別名でadd_actionします。
WEBPAPRIKAさんの記事をみる限り、子テーマ側から重複している関数を削除し、別名で定義した関数をadd_actionするという認識であっていると思います。
親テーマで既に定義してある関数をい変更してもいいんですが、やっぱり子テーマから上書きできた方が安心できますね。
まとめ
結論として「Fatal error: Cannot redeclare<」は同名の関数を使っていると出るエラーで、同名の関数を使用しない事が解決方法という事ですね。
HTMLとCSSに関しては慣れているので、何となく問題の原因がわかるのですが、PHPはまだまだ理解していないことも多いので、突然エラーコードが出ると焦ります。
もっと勉強しなければ…
『WordPressの「Fatal error: Cannot redeclare」エラーって何だろう?』でした。
よって、同名の関数を使用していないかどうかをチェックしてみよう。