2026年8月30日
2026年8月30日
WordPressで「Cannot redeclare」エラーが出たときの原因と修正方法
「Cannot redeclare」は、同じ名前のPHP関数が2回定義されたためにPHPが処理を止めたことを示す致命的エラーです。メモリ不足やサーバー障害とは関係がなく、エラーメッセージに書かれている2つのファイルのどちらか(または両方)を直せば解消します。この記事では、メッセージの読み方、重複が起きる典型的なパターン、原因ファイルの特定方法、再発させない書き方までを順に説明します。
エラーメッセージの意味
PHPのエラーログや画面には、次のような形で記録されます。
PHP Fatal error: Cannot redeclare mytheme_setup() (previously declared in /home/user/public_html/wp-content/themes/mytheme-child/functions.php:15) in /home/user/public_html/wp-content/themes/mytheme/functions.php on line 42
PHPのバージョンによって Cannot redeclare function mytheme_setup() のように「function」が入る書き方もありますが、意味は同じです。読み取るべき情報は3つです。
- 関数名(例では
mytheme_setup()):重複した関数の名前 - previously declared in:先に定義した側のファイルと行番号
- in ... on line:あとから同じ名前で定義しようとして失敗した側のファイルと行番号
PHPでは、同じ名前の関数を2回定義できません。名前空間を使わない限り関数名はサイト全体で共有されるため、テーマ・プラグイン・WordPress本体・PHP本体のどこかと名前がぶつかると、このエラーになります。
WordPress側では、フロントに「このサイトで重大なエラーが発生しました」という趣旨の画面が出て、管理者宛てにリカバリーモードのリンクを含むメールが届くことがあります。そのメールにもエラー内容が書かれているので、まず確認してください。
よくある原因
メッセージの2つのファイルパスを見ると、次のどれに当たるかがほぼ分かります。
子テーマに親テーマの関数をコピーした
もっとも多いのがこのパターンです。子テーマの functions.php は、親テーマの functions.php より先に読み込まれます。親テーマの関数を修正しようとして子テーマに同じ名前のまま貼り付けると、あとから読み込まれた親テーマ側で重複が発生します。親テーマがその関数を function_exists() で囲んでいれば子テーマ側の定義が優先されますが、囲んでいない関数は上書きできません。
同じコードを2か所に追加した
functions.php に追加したスニペットを、あとから Code Snippets などのスニペット管理プラグインにも登録した、というケースです。ネット上の同じ記事から2回コピーして、ファイルの上と下に同じ関数が残っていることもあります。
同じプラグインが2つ入っている
ZIPファイルから再インストールした際に、plugin-name と plugin-name-1 のように別フォルダとして入ってしまい、両方を有効化している状態です。無料版と有料版を同時に有効化した場合も、共通の関数がぶつかることがあります。
PHPやWordPressの更新で名前が衝突した
古いプラグインが、PHP 8で標準になった str_contains() などの関数を、存在チェックなしで自前定義していると、PHPを8系に上げた途端にこのエラーになります。同様に、テーマやプラグインが独自に定義していた関数名と同じ名前の関数がWordPress本体に追加された場合も衝突します。
include を使って同じファイルを2回読み込んでいる
自作コードで include や require を使い、同じファイルが条件次第で2回読まれる構造になっていると発生します。
原因ファイルを特定する手順
1. エラーログを確認する
画面に詳細が出ない場合は、wp-config.php でログ出力を有効にします。作業前に wp-config.php のコピーを取っておいてください。
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
この記述は /* That's all, stop editing! */ の行より上に置きます。エラーを再現させると wp-content/debug.log に記録されます。サーバーのコントロールパネルにある PHP エラーログにも同じ内容が出ていることが多いです。原因が分かったら、本番サイトでは WP_DEBUG を false に戻します。
2. 関数名でファイルを検索する
SSHが使える場合は、関数名で wp-content 配下を検索すると、どこで定義されているかが一覧できます。
grep -rn "function mytheme_setup" wp-content/
2件以上ヒットすれば、それが重複箇所です。SSHが使えない場合は、FTPソフトで該当ファイルをダウンロードし、テキストエディタで関数名を検索します。
3. 管理画面に入れないときの切り分け
エラーでサイト全体が止まっている場合は、FTPやファイルマネージャーで原因側のフォルダ名を一時的に変えると、その部分だけ読み込まれなくなります。たとえば wp-content/plugins/plugin-name-1 を plugin-name-1_off にすると、そのプラグインは無効化されます。テーマが原因なら、子テーマのフォルダ名を変えると WordPress は既定のテーマに切り替えようとします。
WP-CLIが使える環境なら、次のように操作できます。
wp plugin list --status=active
wp plugin deactivate plugin-name-1
管理画面に入れる場合は、Health Check & Troubleshooting プラグインのトラブルシューティングモードを使うと、自分のログインセッションだけでプラグインとテーマを止めて確認できるため、訪問者への影響を抑えられます。
修正方法
重複している定義を削除する
同じコードを2か所に貼っただけなら、片方を削除すれば終わりです。functions.php を直接編集する場合は、編集前に元のファイルを手元に保存しておき、構文ミスで別のエラーを起こしたときにすぐ戻せるようにします。
子テーマでは別名の関数で上書きする
親テーマの関数を function_exists() で囲まずに定義している場合、子テーマで同じ名前を使うことはできません。親テーマがその関数をフック経由で呼んでいるなら、子テーマでは別名の関数を作り、フックを付け替えます。
add_action( 'after_setup_theme', 'mychild_replace_setup', 11 );
function mychild_replace_setup() {
remove_action( 'wp_head', 'mytheme_custom_head' );
add_action( 'wp_head', 'mychild_custom_head' );
}
function mychild_custom_head() {
// 子テーマ側で出力したい内容
}
remove_action() は、登録時と同じフック名・関数名・優先度を指定しないと外れません。親テーマ側の add_action() の記述を確認してから書いてください。フックで呼ばれていない関数を変えたい場合は、テンプレートファイル自体を子テーマにコピーして、その中の呼び出し先を別名の関数に差し替えます。
自作コードは存在チェックと接頭辞で守る
自分で書く関数には、テーマ名やサイト名などの接頭辞を付けるのが基本です。他と共有する可能性がある関数は、function_exists() で囲むと二重定義を避けられます。
if ( ! function_exists( 'mysite_format_price' ) ) {
function mysite_format_price( $price ) {
return number_format( (float) $price ) . '円';
}
}
ただし、存在チェックは「あとから読み込まれる側」に書かないと効果がありません。また、同じ名前で中身の違う関数が先に定義されていた場合、自分の関数は黙って使われなくなる点にも注意が必要です。ファイルの読み込みは require_once を使うと、同じファイルを2回読むことを防げます。
プラグイン同士の衝突は更新か入れ替えで対応する
プラグインの内部で衝突している場合、プラグインのファイルを直接編集すると次回の更新で元に戻ります。両方を最新版に更新し、それでも解消しなければ、どちらか一方を停止して代替プラグインを検討します。作者のサポートフォーラムに、エラーメッセージの全文と PHP・WordPress のバージョンを添えて報告するのも有効です。
PHPの更新後に起きた場合は、該当プラグインが新しいPHPに対応しているかを確認します(2026年10月現在、WordPressの推奨環境はPHP 8系です)。対応版が出ていないなら、一時的にPHPのバージョンを戻すことも選択肢になります。
修正後の確認
修正したら、次の点を確かめます。
- エラーが出ていたページと管理画面が表示される
- debug.log に同じエラーが追記されていない
- 変更した機能(子テーマで差し替えた出力など)が意図どおり動いている
- 一時的に名前を変えたプラグインやテーマのフォルダを元に戻したか、不要なら管理画面から削除した
まとめ
- 「Cannot redeclare」は同じ名前の関数が2回定義されたときに出る致命的エラーで、メッセージ中の2つのファイルパスが原因の手がかりになります。
- 典型的な原因は、子テーマへの関数コピー、同じスニペットの二重登録、重複インストールされたプラグイン、PHP・WordPress更新による名前の衝突です。
- debug.log と関数名の検索で重複箇所を特定し、片方の削除、別名関数とフックの付け替え、接頭辞と
function_exists()による保護で直します。 - ファイルを編集する前にはバックアップを取り、プラグイン本体の直接編集は避けます。