WordPressプラグインの更新判定の謎:同
名の別プラグインに勝手に更新された事件

関連記事

1. はじめに

カスタムプラグインをWordPressサイトにインストールしたところ、ある日気づくと別のプラグインに変わっていました。同名プラグインに勝手に更新されていたのです。この経験から、WordPressのプラグイン更新判定がどのように行われているのかを調べました。この記事では、その仕組みと対策を共有します。

2. 事件の発端

ある日、サイト管理の作業中に「あれ?このプラグイン、前と違う機能になってる…」と気づきました。確認すると、同じ名前のプラグインに勝手に更新されていたようです。カスタムプラグインだったものが、公式ディレクトリにある同名プラグインに置き換わっていました。

2. 事件の発端
2. 事件の発端

3. WordPressプラグイン更新の判定基準

調査の結果、WordPressのプラグイン更新判定は、主にプラグインのフォルダ名を基準にしていることがわかりました。AuthorやURL情報は関係ありません。プラグインフォルダ名が同じであれば、WordPressはそれを同じプラグインとして認識し、バージョン番号を比較して更新の判断をします。

たとえるなら、同姓同名の別人を間違える状況に似ています。苗字と名前が同じなら、住所や職業が違っても同一人物と誤認されるようなものです。

技術的には、WordPressはplugin_basenameという関数を使ってプラグインの識別子を作成します。この識別子は基本的に「フォルダ名/メインPHPファイル名.php」の形式になります。この識別子を使って、プラグインのマッチングと更新判定が行われるのです。

4. PHPファイルのヘッダーと更新判定の関係

ここで大切なのは、プラグインのPHPファイル内にある「Plugin Name:」などのヘッダー情報は、更新判定には使われないということです。このヘッダー情報は管理画面での表示名として使われるだけです。

つまり、Plugin Nameをどう設定しようと、フォルダ名が同じなら別のプラグインに更新されてしまう可能性があります。

5. カスタムプラグインを守る対策

この問題を防ぐために、いくつかの対策方法があります。

5.1. 1. ユニークなフォルダ名を使う

最も確実な方法は、プラグインのフォルダ名をユニークにすることです。企業名や自分の名前をプレフィックスとして使うと良いでしょう。例えば「contact-form」ではなく「chiilabo-contact-form」のようにします。

これは、製品にシリアルナンバーをつけるようなものです。世界に一つだけの識別子を持たせれば、他と混同されるリスクは大幅に減ります。

5.2. 2. 更新をブロックする

特定のプラグインの更新を止めたい場合は、「Block Plugin Update」というプラグインを使って更新をブロックすることができます。

または、WordPressのfunctions.phpに以下のようなコードを追加することもできます:

function disable_specific_plugin_updates($value) {
  if (isset($value) && is_object($value)) {
    if (isset($value->response['your-custom-plugin/your-custom-plugin.php'])) {
      unset($value->response['your-custom-plugin/your-custom-plugin.php']);
    }
  }
  return $value;
}
add_filter('site_transient_update_plugins', 'disable_specific_plugin_updates');
Code language: PHP (php)

5.3. 3. WordPress 5.8以降の機能を活用する

WordPress 5.8以降では、プラグインのメインPHPファイルのヘッダーにUpdate URI: falseを追加すると、更新チェックから除外されます。

/**
 * Plugin Name: ChiiLabo Contact Form
 * Plugin URI: https://chiilabo.jp/plugins/contact-form
 * Description: カスタム問い合わせフォーム
 * Version: 1.0.0
 * Author: ChiiLabo
 * Author URI: https://chiilabo.jp
 * Update URI: false
 */
Code language: JSON / JSON with Comments (json)

6. 開発者が使う命名のベストプラクティス

一般には以下のような命名規則を使うことが多いです:

  • プレフィックスには企業名や開発者名を使用
  • 機能を明確に表す名前を付ける
  • ハイフンでワードを区切る
  • フォルダ名とメインPHPファイル名を一致させる

適切なファイル構成の例:

/wp-content/plugins/chiilabo-contact-form/
  chiilabo-contact-form.php  (メインファイル)
  README.txt
  /includes/
  /assets/
Code language: JavaScript (javascript)

7. 今回の対策

今回は、プラグインのフォルダ名を変更し、zipファイルとして圧縮し直すことで問題を解決しました。これにより、公式ディレクトリにある同名プラグインと区別され、勝手に更新されることがなくなりました。

8. まとめ

WordPressのプラグイン更新判定はフォルダ名を基準に行われ、Author情報やURLは考慮されません。カスタムプラグインを作る際は、他と重複しないユニークなフォルダ名を付けるか、更新チェックから除外する設定を行うことが重要です。実際の更新判定の鍵となるのはplugin_basename関数による識別子であり、プラグインの管理画面表示名ではないことを理解しておきましょう。