このブログで配っている自作のプラグインは WordPress.org に載せていないので、新しいバージョンを出すたびに、入れたサイトを 1 つずつ手で更新することになります。WordPress 5.8 からは、プラグインのヘッダーに Update URI を書くと、自分のサーバーから更新を配れる仕組みが用意されています。そのプラグインで実際に作った形を紹介します。
できるようになること
- 新しいバージョンを出すと、入れたサイトの「プラグイン」の画面に更新のお知らせが出る
- ほかのプラグインと同じく、ボタン 1 つで更新できる
- 「詳細を表示」に、説明や変更の履歴を出せる
1. プラグインのヘッダーに Update URI を書く
/** * Plugin Name: My Plugin * Version: 1.3.0 * Update URI: https://example.com/downloads/my-plugin/ */
Update URI のホスト名(ここでは example.com)が大事です。WordPress は、WordPress.org 以外のホスト名が書かれたプラグインについて、「update_plugins_{ホスト名}」というフィルターを呼んで、更新があるかを聞いてきます。
2. フィルターで、新しいバージョンの情報を返す
add_filter( 'update_plugins_example.com', function ( $update, $plugin_data, $plugin_file ) {
if ( 'my-plugin/my-plugin.php' !== $plugin_file ) {
return $update;
}
$res = wp_remote_get( 'https://example.com/downloads/my-plugin/info.json', array( 'timeout' => 5 ) );
if ( is_wp_error( $res ) || 200 !== wp_remote_retrieve_response_code( $res ) ) {
return $update;
}
$info = json_decode( wp_remote_retrieve_body( $res ), true );
if ( empty( $info['version'] ) || empty( $info['download_url'] ) ) {
return $update;
}
return array(
'slug' => 'my-plugin',
'version' => $info['version'],
'package' => $info['download_url'],
'url' => 'https://example.com/downloads/my-plugin/',
);
}, 10, 3 );
バージョンの比べ合わせは WordPress がしてくれるので、ここでは今のバージョンの情報を返すだけです。実際には、毎回取りに行かないよう transient で 12 時間ほど覚えておき、取れなかったときは 1 時間後にやり直すようにしています。
3. サーバーに更新の案内(JSON)と zip を置く
{
"version": "1.3.0",
"download_url": "https://example.com/downloads/my-plugin/my-plugin-1.3.0.zip",
"requires": "6.0",
"tested": "7.1",
"requires_php": "7.4"
}
zip の中は「my-plugin/my-plugin.php」のように、プラグインのフォルダごと入れます。このブログでは、テーマの中にファイルを置いて決まった URL で出すようにしたので、新しいバージョンはテーマを更新するだけで配れます。
気をつけること
- 更新の確認は、プラグインが有効のときだけ動く。無効のまま置いてあるサイトには、お知らせが出ない
- zip の URL は https で、自分のホストのものだけを受け付けるようにしておく(案内のファイルを書き換えられても、ほかの場所の zip を入れさせない)
- 覚えた案内は、「ダッシュボード → 更新」の「再確認」のときに捨てて読み直すようにすると、すぐに確認できる
- 「詳細を表示」を出したいときは、plugins_api のフィルターで説明や変更の履歴を返す
