2026年5月20日
2026年5月20日
Cannot redeclare functionエラーを解決する方法【PHP関数重複エラー】
はじめに
「Fatal error: Cannot redeclare my_function() (previously declared in ...)」——同じ名前の関数が2回定義されている場合に発生します。プラグインのアップデートやコピー、テーマとプラグインで同名関数を使っている場合によく起きます。
症状・原因
Cannot redeclareエラーの主な原因:
- 同じプラグインが2つのフォルダにインストールされている
- functions.phpにコードを追加したら既存の関数名と重複した
- プラグインをアップデートした際に古いバージョンのコードが残っている
- 子テーマと親テーマで同名の関数を定義している
解決手順
ステップ1:エラーメッセージで重複箇所を特定
Fatal error: Cannot redeclare my_function()
(previously declared in /wp-content/plugins/plugin-a/plugin-a.php:15)
in /wp-content/themes/my-theme/functions.php on line 42
→ plugin-a.php:15とfunctions.php:42の両方にmy_functionが定義されています。
ステップ2:function_exists()で関数定義を保護する
最も確実な対処法:関数を定義する前に存在チェックを行います。
// ❌ エラーが出るコード
function my_helper() {
return 'hello';
}
// ✅ function_exists()で保護
if (!function_exists('my_helper')) {
function my_helper() {
return 'hello';
}
}
functions.phpやプラグインで関数を定義する場合は常にこのパターンを使いましょう。
ステップ3:重複プラグインを確認・削除
/wp-content/plugins/
├── my-plugin/ ← バージョン2.0
└── my-plugin-copy/ ← バージョン1.0(古いコピーが残っている)
FTPで/wp-content/plugins/を確認し、重複しているプラグインフォルダを削除します。
ステップ4:プラグインを一時的に無効化して原因を特定
管理画面にアクセスできない場合:
FTPで問題のプラグインをリネーム:
/wp-content/plugins/my-plugin/ → /wp-content/plugins/my-plugin_off/
管理画面にアクセスできる場合は「プラグイン」→ 一つずつ無効化してエラーが解消するか確認します。
ステップ5:テーマとプラグインの関数名衝突を解決
// ❌ 汎用的な名前は衝突しやすい
function get_data() { ... }
// ✅ プレフィックスを付けて衝突を避ける
function mytheme_get_data() { ... }
function myplugin_get_data() { ... }
自作コードでは必ずテーマ名やプラグイン名をプレフィックスとして付けます。
ステップ6:クラスで名前空間を分離する(上級者向け)
// 名前空間を使うと衝突を完全に防げる
namespace MyPlugin\Helpers;
function get_data() { ... }
// 呼び出し側
\MyPlugin\Helpers\get_data();
まとめ
Cannot redeclareエラーはfunction_exists()でのガードが根本的な解決策です。エラーメッセージが示す2つのファイルを確認して、どちらかの関数定義をif (!function_exists('xxx'))で囲むか、関数名にプレフィックスを付けて重複を避けましょう。
関連記事: