1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WordPress 自作テーマを GitHub プライベートリポジトリの最新リリースから自動更新する方法

Last updated at Posted at 2025-08-25

お仕事で、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 を利用しました。権限は最小限で十分なので、以下のように設定します。

github.com_settings_personal-access-tokens_new.png

  • Resource owner : 自分
  • Expiration : No expiration
  • Repository access : Only select repositories (更新対象のリポジトリ)
  • Permissions : Contents (Read only)

これだけで Release API と Asset API にアクセス可能です。

発行したトークンは wp-config.php に定義して利用します。後から実装する functions.php に書いてもちゃんと動作しますが、リポジトリ外で管理したい、というのが理由です。

wp-config.php
define( 'GITHUB_TOKEN', 'github_pat_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' );

テーマ実装の流れ

以下のコードは、

  • GitHubのユーザ名 : yakiniku48
  • リポジトリ名 : wp-github-updater

という前提で記述しています。適宜、書き換えて試してみてください。

テーマ名は自由ですが、テーマのディレクトリ名はリポジトリ名と同じにしてください (後述の ZIP アーカイブ生成を楽にするため)。

1. テーマの style.css に Update URI を追加

style.css
/*
Theme Name: WP Github Updater
Version: 0.1.0
Update URI: https://github.com/yakiniku48/wp-github-updater
*/

2. functions.php にコードを読み込む

functions.php
require_once 'inc/github-updater.php';

3. inc/github-updater.php に以下のコードを配置

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 という形式にします。

tag_0.1.0.png

準備ができたら 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 みたいだった気がする)

ごめんなさい。ここから先のスクリーンショットは、実際のリポジトリのものなので、バージョンが違います。

github_repos.png

次のページで Draft a new release ボタンで新しいリリースを作成します。

github_release.png

そして実際に登録します。

github_release_entry.png

  • 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 の更新通知が確認できますよ。

wp_update.png

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?