2026年6月16日
2026年6月16日
WordPressのプラグイン競合を解決する方法
はじめに
WordPressに新しいプラグインを追加したら管理画面のレイアウトが崩れた・「Fatal error: Cannot redeclare function」エラーが表示されてサイトが白い画面になった・2つのSEOプラグインを同時に有効にしたらどちらも正常に動作しなくなった・プラグインの更新後に別のプラグインが動かなくなったといった問題は、関数名・クラス名の重複・JavaScript/CSSの競合・フックの優先度衝突・PHPバージョンの非互換が原因です。
症状・原因
- 2つのプラグインが同じ関数名(例:
my_helper_function())を定義しておりCannot redeclareエラーが発生 - 複数のプラグインが同じjQueryプラグインを異なるバージョンで読み込んでJSエラーが発生
- セキュリティプラグインとキャッシュプラグインが
.htaccessを競合して書き込んでいる - PHPバージョンが上がったことでプラグインの古いコードが動作しなくなった
解決手順
ステップ1:競合しているプラグインを特定する
# 有効なプラグインを一覧表示
wp plugin list --status=active --format=table
# 全プラグインを無効化してから1つずつ有効化して切り分け
wp plugin deactivate --all
# プラグインを1つずつ有効化して問題を再現
wp plugin activate akismet
# → 問題なければ次のプラグインを有効化
wp plugin activate contact-form-7
# → エラーが出たら contact-form-7 が原因
# PHPエラーログでfatal errorの詳細を確認
wp eval "
\$log = ini_get('error_log');
if (\$log && file_exists(\$log)) {
\$lines = file(\$log);
\$recent = array_slice(\$lines, -20);
echo implode('', \$recent);
}
"
ステップ2:管理画面からアクセスできない場合の無効化方法
# WP-CLIでプラグインを無効化(白い画面の場合)
wp plugin deactivate problematic-plugin --skip-plugins --skip-themes
# FTP経由でプラグインフォルダをリネームする方法(WP-CLIが使えない場合)
# wp-content/plugins/problematic-plugin/ → wp-content/plugins/problematic-plugin-DISABLED/
# データベースから直接プラグインを無効化
wp eval "
\$active = get_option('active_plugins', []);
echo 'Active plugins: ' . PHP_EOL;
foreach (\$active as \$plugin) {
echo ' ' . \$plugin . PHP_EOL;
}
"
wp option update active_plugins '[]' --format=json
ステップ3:JavaScript競合を解決する
// functions.php: jQuery競合の解決
// jQueryをWordPress組み込みのものに統一
add_action('wp_enqueue_scripts', function(): void {
// 外部CDNのjQueryを登録解除してWordPress組み込みを使用
wp_deregister_script('jquery');
wp_register_script(
'jquery',
includes_url('js/jquery/jquery.min.js'),
[],
null,
false // headで読み込む(body最後だとjQuery依存のコードが壊れる場合)
);
wp_enqueue_script('jquery');
}, 100);
// 特定プラグインのスクリプトが特定ページで競合する場合に無効化
add_action('wp_enqueue_scripts', function(): void {
if (is_page('checkout')) {
// チェックアウトページで競合するプラグインのスクリプトを無効化
wp_dequeue_script('conflicting-plugin-script');
wp_dequeue_style('conflicting-plugin-style');
}
}, 99);
ステップ4:PHP関数名衝突を解決する
// プラグイン開発者向け: 関数名衝突を防ぐベストプラクティス
// ❌ 悪い例: グローバルな関数名
// function format_price($price) { ... }
// ✅ 良い例①: プレフィックスを付ける
function myplugin_format_price(float $price): string {
return number_format($price) . '円';
}
// ✅ 良い例②: 関数が存在しない場合のみ定義
if (!function_exists('format_price')) {
function format_price(float $price): string {
return number_format($price) . '円';
}
}
// ✅ 良い例③: クラスにまとめる(推奨)
class MyPlugin {
public static function format_price(float $price): string {
return number_format($price) . '円';
}
}
// ✅ 良い例④: 名前空間を使う(PHP 5.3以上)
namespace MyPlugin;
function format_price(float $price): string {
return number_format($price) . '円';
}
ステップ5:プラグインの依存関係とロード順を制御する
// functions.php: プラグインのロード順を制御
// 特定のプラグインを他のプラグインより先にロード
add_action('activated_plugin', function(string $plugin): void {
// 'my-core-plugin' を常に最初にロード
$plugin_to_move = 'my-core-plugin/my-core-plugin.php';
$active = get_option('active_plugins', []);
if (in_array($plugin_to_move, $active, true)) {
$key = array_search($plugin_to_move, $active, true);
if ($key > 0) {
array_splice($active, $key, 1);
array_unshift($active, $plugin_to_move);
update_option('active_plugins', $active);
}
}
});
# プラグインのPHPバージョン互換性を確認
wp eval "
\$plugins = get_plugins();
foreach (\$plugins as \$file => \$plugin) {
\$requires_php = \$plugin['RequiresPHP'] ?? '';
if (\$requires_php && version_compare(PHP_VERSION, \$requires_php, '<')) {
echo 'PHP incompatible: ' . \$plugin['Name'] . ' (requires ' . \$requires_php . ', have ' . PHP_VERSION . ')' . PHP_EOL;
}
}
"
# 非推奨のPHP関数を使うプラグインを検出
wp eval "
set_error_handler(function(\$errno, \$errstr, \$errfile) {
if (str_contains(\$errfile, WP_PLUGIN_DIR)) {
error_log('Deprecated in plugin: ' . \$errfile . ': ' . \$errstr);
}
return false;
}, E_DEPRECATED);
do_action('plugins_loaded');
"
注意事項
- プラグインの競合を切り分ける際は必ず「二分探索法」を使ってください。全プラグインを無効化→半分を有効化→問題が再現すれば有効化した半分に問題がある、という手順で効率よく特定できます
wp plugin deactivate --allを実行するとEコマース機能やメンバーシップ機能も無効になります。本番環境では作業前にメンテナンスモードを有効化してくださいwp_deregister_script('jquery')はjQueryに依存するすべてのプラグインに影響します。使用する前にすべての依存関係を確認してください
まとめ
WordPressプラグイン競合の解決は①wp plugin list --status=activeで有効プラグインを確認・wp plugin deactivate --allから1つずつ有効化して競合箇所を特定・PHPエラーログでCannot redeclare等のエラーを確認、②WP-CLIで--skip-plugins --skip-themesオプションを使って安全に無効化・管理画面にアクセスできない場合はプラグインフォルダをリネーム・DBからactive_pluginsオプションを直接更新、③wp_deregister_script('jquery')でjQueryを統一・競合するプラグインのスクリプトを特定ページでwp_dequeue_script()・同一スクリプトの重複読み込みを排除、④関数名にプレフィックスを付ける・if (!function_exists())でガード・クラスや名前空間でカプセル化、⑤active_plugins配列の順序を変更して依存プラグインを先にロード・PHPバージョン互換性をRequiresPHPヘッダーで確認の手順で解決します。