「Fatal error: Cannot redeclare class WC_Cart」とWordPressプラグイン競合の修正方法

intermediate📝 WordPress2026-06-17| WordPress 5.0以上, PHP 7.4/8.x, WooCommerce環境, Linux/UnixまたはWindowsサーバー。

Error Message

Fatal error: Cannot redeclare class WC_Cart (previously declared in /wp-content/plugins/woocommerce/includes/class-wc-cart.php) in /wp-content/plugins/woocommerce/includes/class-wc-cart.php on line 1
#プラグイン競合#致命的エラー#php#wordpress#クラス再定義

背景「Cannot redeclare」エラーが表示される場合、通常、サイトが「死の真っ白な画面(WSOD)」でクラッシュしたことを意味します。これはPHPが限界に達したために発生します。システムメモリ内に既に存在するクラスや関数を再度ロードしようとした際、PHPは重複を許可しないためです。

正確なエラーメッセージは通常以下のようになります:

Fatal error: Cannot redeclare class WC_Cart (previously declared in /wp-content/plugins/woocommerce/includes/class-wc-cart.php) in /wp-content/plugins/woocommerce/includes/class-wc-cart.php on line 1

上記の WC_Cart の例のように、エラーが同じファイルを2回指している場合は少し厄介です。通常、これはシンボリックリンクなどが原因で、ファイルが2つの異なるパスからロードされたことを意味します。また、プラグインがWooCommerceのコアクラスを不適切に「モック」したり上書きしようとしている可能性もあります。

デバッグプロセスおそらくWordPressのダッシュボードにアクセスできない状態ですので、FTPの認証情報を用意するか、ホスティングのファイルマネージャーを開いてください。何が起きているかを確認するために、ファイルを直接調査する必要があります。

1. WordPressのデバッグを有効にするルートディレクトリにある wp-config.php ファイルを開きます。define( 'WP_DEBUG', false ); という行を探し、以下の3行に置き換えます:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', true );

これにより、衝突の原因となっている完全なファイルパスが表示されます。多くの場合、2つの異なるプラグインが同じ共通ライブラリ(例えば、古いバージョンの class-tgm-plugin-activation.php など)を使用しようとしていることがわかります。

2. 原因を特定するエラーメッセージのパスを確認してください。パスが異なる場合、2番目に記載されているパスが、直前にインストールまたは更新したプラグインであるのが一般的です。それが「原因」です。パスが同一の場合、コード内で require_once ではなく require が使用されている可能性があります。

ステップバイステップの解決策### 方法1:「名前変更」によるショートカットプラグインの更新直後にクラッシュが発生した場合は、FTPを使用して /wp-content/plugins/ に移動します。疑わしいプラグインのフォルダ名を変更します(例:jetpackjetpack-off に変更)。これにより、プラグインが即座に無効化されます。サイトが正常に表示されるようになれば、原因が特定されたことになります。

方法2:require_once への切り替えカスタムコードで同じファイルを複数回ロードすると、このエラーが発生することがよくあります。ループ内や複雑なテーマで requireinclude を使用するのは危険です。既にロードされている場合はファイルをスキップするようPHPに指示する「once」バリアントを使用するのが最善です。

非推奨:

require( plugin_dir_path( __FILE__ ) . 'includes/helpers.php' );

推奨:

require_once( plugin_dir_path( __FILE__ ) . 'includes/helpers.php' );

方法3:防御的なラッパーチェックを使用するプロの開発者は、名前を使用する前に必ずその名前が既に使用されていないかを確認します。このシンプルな「if」文により、WordPressエコシステムにおける再定義エラーの99%を防ぐことができます。

関数の場合:

if ( ! function_exists( 'my_unique_prefix_utility' ) ) {
    function my_unique_prefix_utility() {
        // ここにコードを記述
    }
}

クラスの場合:

if ( ! class_exists( 'My_Plugin_Handler' ) ) {
    class My_Plugin_Handler {
        // ここにコードを記述
    }
}

方法4:WC_Cart 固有の競合を修正するWC_Cart エラーは、「Must Use(必須)」プラグインや強力な最適化スクリプトを使用しているサイトでよく知られています。/wp-content/mu-plugins/ の中を確認してください。WooCommerceの準備が完全に整う前にセッションを開始したりカートを呼び出そうとしたりするスクリプトが見つかった場合、それがこの致命的なクラッシュを引き起こします。これらのレガシースクリプトを削除または更新して問題を修正してください。

検証- ホームページと /wp-admin/ をリフレッシュします。真っ白な画面にならずにすべてがロードされるはずです。- /wp-content/debug.log を開きます。将来の競合を示唆する「Notice(通知)」や「Deprecated(非推奨)」メッセージがないか確認してください。- プラグインを一つずつ有効に戻します。特定のプラグインを有効にしたときにエラーが再発する場合、そのプラグインには開発者による修正が必要なハードコードされた競合があります。## 学んだ教訓- すべてに接頭辞(プレフィックス)を付ける: 関数に get_data() と名付けてはいけません。安全を期すために acme_get_data() のような一意の接頭辞を使用してください。- 名前空間(Namespace)を採用する: 現代のPHP開発者は namespace MyPlugin\Utilities; を使用します。これによりコードに一意のコンテナが作成され、「Cannot redeclare」エラーの発生をほぼ不可能にします。- シンボリックリンクに注意する: 一部のホストでは、共有ライブラリにシンボリックリンクを使用しています。PHPがこれらを異なる絶対パスとして認識し、同じファイルを2回ロードしてしまうことがあります。常に __FILE__dirname() を慎重に使用してください。

Related Error Notes