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:15functions.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'))で囲むか、関数名にプレフィックスを付けて重複を避けましょう。

関連記事:

お気軽にご相談ください

お見積りへ お問い合わせへ