コンテンツにスキップ

プラグインの依存関係を指定する方法

メインイメージ

WordPress でプラグイン間の依存関係を指定する方法についてです。

ここで「依存関係」とは、プラグインが動作するために他のプラグインを必要とする関係のことを指します。 日本語での「依存」は一般に少し意味の強い言葉ですが、ソフトウェアの世界では「依存」は英語の dependencies や dependents や depend に対応する言葉としてよく使われます。

長い間 WordPress にはプラグインの依存関係を指定する標準的な方法がありませんでしたが、ついに 2024 年 4 月リリースの WordPress 6.5 で導入されました。

動作確認時のバージョン

  • WordPress 6.5

依存関係を指定する方法

プラグインヘッダー Requires Plugins を追加します。

例えば、カスタムプラグイン plugin-a を Akismet プラグインに依存させる場合、 plugin-a のヘッダーを次のように記述すれば OK です。

plugin-a.php:

/**
 * Plugin Name: Plugin A
 * Requires Plugins: akismet
 */

複数のプラグインに依存させる場合は , 区切りで記述します。

/**
 * Plugin Name: Plugin A
 * Requires Plugins: akismet, wordpress-seo
 */

プラグインの指定方法は akismetwordpress-seo のようなスラッグです。 WordPress.org でプラグインページの URL に含まれるものです。

例: wordpress-seo

https://wordpress.org/plugins/wordpress-seo/

人間向けのプラグイン名や akismet/akismet.php のようなプラグインのファイルパスはここでは使えません。

依存関係を確認する方法

プラグインの依存関係は管理画面のプラグイン一覧ページで確認できます。

他のプラグインに依存するプラグイン

プラグインが無効化されている場合:

プラグイン A が Akismet と Yoast SEO に依存

プラグインが有効になっているが必要なプラグインが無い場合:

プラグイン A が Akismet と Yoast SEO に依存

他のプラグインから依存されているプラグイン

Akismet に依存するプラグインがある

依存関係で生じる制約

他のプラグインとの間に依存関係があるプラグインには、管理画面上の操作において以下の制約が追加されます。

他のプラグインに依存するプラグイン

  • 依存先のプラグインがインストールされていないとインストールできない
  • 依存先のプラグインが有効でないと有効化できない

依存先のプラグインが無効なプラグインは有効化できない

他のプラグインから依存されているプラグイン

  • 依存する側のプラグインがインストールされていると削除できない
  • 依存する側のプラグインが有効だと無効化できない

依存する側のプラグインが有効なプラグインは無効化できない

ただし、管理画面外でプラグインファイルが削除された場合や、プラグインがアップデートで新たな依存関係を追加した場合など、それまで守れていた制約が崩れる可能性があります。 そのような場合に、自動的にプラグインが無効化されたりするようなことは無いとのことです。

コマンドラインツール WP-CLI でのプラグインの操作にも今回導入された依存関係は影響しないようです。

つまり、現状プラグインの依存関係はあくまでも WordPress の管理画面での操作にのみ影響するものであり、これまでの WordPress の挙動を大きく変えるものではありません(これは将来変わる可能性があります)。

ポイント

バージョンを指定する方法はある?

現状ありません。

テーマがプラグインに依存する関係は指定できる?

現状できません。

防御的コーディングはもう必要ない?

上述のとおり、プラグインのファイルが管理画面外で削除されたり、アップデートにより依存関係が変わったりすることは起こりうるため、プラグイン作者は引き続き依存先のプラグインが存在しない場合でもエラーを起こさないように(防御的に)プラグインのコードを書くべきであることは今後も変わらないとのことです。

依存関係を確認する方法(プログラマ向け)

管理画面以外でも WordPress 6.5 で追加された WP_Plugin_Dependencies クラスを使って確認できます。

WP_Plugin_Dependencies::initialize();

// 対象のプラグイン( Plugin A )が依存する先のプラグインを取得
$plugin_file = 'plugin-a/plugin-a.php';
WP_Plugin_Dependencies::get_dependencies( $plugin_file );
// => [
//   "akismet",
// ]

// 対象のプラグイン( Akismet )に依存するプラグインを取得
$slug = 'akismet';
WP_Plugin_Dependencies::get_dependents( $slug );
// => [
//   "plugin-a/plugin-a.php",
//   "plugin-b/plugin-b.php",
// ]

他にも多くのメソッドが用意されているので詳細に興味のある方は公式ブログをご覧ください。

公式ブログ

該当チケット