お仕事で、WP の自作テーマをアップデートするとき、毎回 FTP で接続して、手動アップロードするのは面倒です。基本機能を抑えたベーステーマを複数のサイトで利用しているならなおさら。もう WP の自動更新でやっちゃいたい。でもプライベートリポジトリの自作テーマを自動更新に対応!なんて情報、ネットにない、ぜんぜんない…
仕方ないので、GitHub Releases にテーマを置いて、WordPress の自動アップデート機能で更新できる仕組みを実装してみました。
- GitHub プライベートリポジトリ対応
- Fine-grained Personal Access Token を利用(権限は「Contents: Read」だけ)
- WP の
update_themes_{$hostname}
フックを利用
クライアント案件でも安心です(たぶん)。
GitHub トークンの準備
テーマの更新 ZIP をダウンロードするには、GitHub API にアクセスする必要があります。このとき Personal Access Token (PAT) を発行し、WP 側で認証に利用します。
GitHub → Settings → Developer Settings → Personal access tokens
今回は Fine-grained token を利用しました。権限は最小限で十分なので、以下のように設定します。
- Resource owner : 自分
- Expiration : No expiration
- Repository access : Only select repositories (更新対象のリポジトリ)
- Permissions : Contents (Read only)
これだけで Release API と Asset API にアクセス可能です。
発行したトークンは wp-config.php
に定義して利用します。後から実装する functions.php
に書いてもちゃんと動作しますが、リポジトリ外で管理したい、というのが理由です。
define( 'GITHUB_TOKEN', 'github_pat_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' );
テーマ実装の流れ
以下のコードは、
- GitHubのユーザ名 : yakiniku48
- リポジトリ名 : wp-github-updater
という前提で記述しています。適宜、書き換えて試してみてください。
テーマ名は自由ですが、テーマのディレクトリ名はリポジトリ名と同じにしてください (後述の ZIP アーカイブ生成を楽にするため)。
1. テーマの style.css に Update URI を追加
/*
Theme Name: WP Github Updater
Version: 0.1.0
Update URI: https://github.com/yakiniku48/wp-github-updater
*/
2. functions.php
にコードを読み込む
require_once 'inc/github-updater.php';
3. inc/github-updater.php
に以下のコードを配置
<?php
// GITHUB_TOKEN: wp-config.php で定義する
// define( 'GITHUB_TOKEN', 'github_pat_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' );
define( 'GHU_OWNER', 'yakiniku48' );
define( 'GHU_REPO', 'wp-github-updater' );
// API/ダウンロードへの認証ヘッダを差し込む
add_filter( 'http_request_args', function ( $args, $url ) {
// GitHub API へのリクエストかどうかを確認
if ( str_starts_with( $url, sprintf('https://api.github.com/repos/%s/%s', GHU_OWNER, GHU_REPO ) ) ) {
if ( preg_match('#/releases/assets/\d+$#', $url ) ) {
$args['headers']['Accept'] = 'application/octet-stream';
} else {
$args['headers']['Accept'] = 'application/vnd.github+json';
}
$token = defined( 'GITHUB_TOKEN' ) ? constant( 'GITHUB_TOKEN' ) : '';
if ( $token ) {
$args['headers']['Authorization'] = 'token ' . $token;
}
if ( empty( $args['headers']['User-Agent'])) {
global $wp_version;
$args['headers']['User-Agent'] = 'WordPress/' . $wp_version . '; ' . home_url();
}
$args['timeout'] = max( (int) ( $args['timeout'] ?? 5 ), 15 );
}
return $args;
}, 10, 2 );
add_filter( 'update_themes_github.com', function( $update, $theme_data, $theme_stylesheet ) {
// 対象テーマ以外は何もしない
if ( $theme_stylesheet !== GHU_REPO ) {
return $update;
}
// 最新リリース取得
$response = wp_remote_get( sprintf('https://api.github.com/repos/%s/%s/releases/latest', GHU_OWNER, GHU_REPO ) );
if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) !== 200 ) {
return $update;
}
$response_body = json_decode( wp_remote_retrieve_body( $response ), true );
// リリース情報に必要なデータが存在するか確認
if (
! $response_body
|| empty( $response_body['tag_name'] )
|| empty( $response_body['html_url'] )
|| empty( $response_body['assets'][0]['url'] )
) {
return $update;
}
// テーマ更新メタ情報
return array(
'theme' => $theme_stylesheet,
'version' => $response_body['tag_name'],
'url' => $response_body['html_url'],
'package' => $response_body['assets'][0]['url'],
);
}, 10, 3 );
GitHub の Release Asset に ZIP アーカイブを登録
テーマが実装できたら、Git にコミットして、タグをつけて、ZIP アーカイブを GitHub Release に登録します。
バージョンをタグとして登録する
コミットにタグをつけます。その際は、スタイルシートに記載したバージョンをタグ名に指定します。このタグ名と、WP で利用中のテーマバージョンとを比較するように実装していますので、ここは必ず 0.0.0
という形式にします。
準備ができたら GitHub に コミット と タグ の 両方とも push します。
2. Release に登録する ZIP アーカイブを作成
git archive HEAD --output=/{ローカルの任意のディレクトリ}/wp-github-updater.zip
ZIP ファイル名は、必ずテーマのディレクトリ名と合わせてください。実際に WP でアップデートしたとき、大変なことになります。やってないけどたぶんなります。
【余談】 普通にアーカイブのアプリを使って ZIP アーカイブ作ればいいじゃん!ってなると思いますが、その場合は .git
ディレクトリも同梱されてしまう可能性があります(ツールによります)。 git archive
を利用した方が安全です。
3. GitHub Release に登録
GitHub のリポジトリにアクセスして、 Releases というリンクをクリックします。初めてリリースを作る場合には、別のリンクになってた気がします。( Create Release みたいだった気がする)
ごめんなさい。ここから先のスクリーンショットは、実際のリポジトリのものなので、バージョンが違います。
次のページで Draft a new release ボタンで新しいリリースを作成します。
そして実際に登録します。
- Select tag : 先ほど git に付与したタグを選択
- Release title : 任意。有名なリポジトリでは、3.1.4 とか、 3.2.0 RC2 とかいう名前になってます
- Set as the latest release : チェック
- Attach binaries by dropping them here or selecting them : 先ほど作成した ZIP アーカイブを登録
問題なければ Publish Release で登録完了です。
4. 更新通知を確認
0.1.0 の状態からは確認できませんが、このテーマのアップデート2回目以降は、WP の更新通知が確認できますよ。