テーマやプラグインに独自のアップデートチェッカーを適用させる方法
文章を書くのが久しぶりな気がしますが、ブログも更新しようと思います。
テーマやプラグインを配信したい場合、ワードプレスのリポジトリを利用するのが一番だとは思いますが、リポジトリを利用したくない方やリポジトリに適さないテーマやプラグインを扱う方もいらっしゃる筈ですので、少し違った方法で更新通知ができ、他のテーマやプラグインと同じように、管理画面から更新できるようにする方法を紹介していきます。
プラグイン「Package Update Server for WooCommerce」を作成していたのでついでのような感じです。
自分だけの「Update Checker」を作成
自分で少しコードを書かなくてはいけませんが、メリットは後に紹介する「Plugin Update Checker」に要する「更新情報用のJSONファイルを用意する必要が無い」ことにあります。
ただ、知っていれば難しい方法ではありませんし、ワードプレスが用意しているフックを利用し、更新リストに差し込む形で通知することができます。
テーマの場合
フィルターフック「pre_set_site_transient_update_plugins」「pre_set_transient_update_plugins」を使います。
更新通知用のデータはtransientとして保存されており、上記の2つのフィルターフックにより、通知情報を追加することが可能です。
// テーマ add_filter( 'pre_set_site_transient_update_themes', 'your_update_themes' ); add_filter( 'pre_set_transient_update_themes', 'your_update_themes' ); function your_update_themes( $transient ) { // バージョン $theme_file_data = wp_get_theme( THEME_DIR_NAME ); // テーマのディレクトリ名 $current_theme_version = '1.0.0'; if ( method_exists( $theme_file_data, 'get' ) ) { $current_theme_version = $theme_file_data->get( 'Version' ); } // 新しいバージョンが存在する場合 if ( version_compare( $current_theme_version, // 現在のバージョン NEW_THEME_VERSION, // 新しいバージョン '<' ) ) { // Set $transient->response[ THEME_DIR_NAME ] = array( 'theme' => THEME_DIR_NAME, // テーマのディレクトリ名 'new_version' => NEW_THEME_VERSION, // 新しいバージョン 'url' => YOUR_WEB_SITE_URL, // ウェブサイトのURL 'package' => UPDATE_PACKAGE_URL, //パッケージのダウンロード先URL(重要) ); } return $transient; }
「NEW_THEME_VERSION」など定数で書いている部分はそのテーマに適するものを使います。
あとは更新通知が管理画面に届くのを待つだけです。
「ダッシュボード」->「更新」のページに更新通知が来るようになれば、あとは一度アップデートが可能か確認しておきましょう。
新しいパッケージのURLがアクセス不可だったり、ダウンロードが失敗して更新できなかったり、間違ったファイルをダウンロードしてしまう場合も考えられます。
プラグインの場合
フィルターフック「pre_set_site_transient_update_plugins」「pre_set_transient_update_plugins」を使います。
テーマの場合と同様に更新通知用のデータはtransientとして保存されており、上記の2つのフィルターフックにより、通知情報を追加することが可能です。
挿入するデータが少し異なるだけですが、流れは殆ど同じです。
add_filter( 'pre_set_site_transient_update_plugins', 'your_update_plugins' ); add_filter( 'pre_set_transient_update_plugins', 'your_update_plugins' ); function your_update_plugins( $transient ) { // プラグインデータを取得 $plugin_file_data = get_plugin_data( YOUR_PLUGIN_FILE_PATH ); // 新しいバージョンが存在する場合 if ( version_compare( $plugin_file_data['Version'], // 現在のバージョン NEW_PLUGIN_VERSION, // 新しいバージョン '<' ) ) { // 更新通知リストに挿入するプラグインデータ $_plugin = array( 'slug' => PLUGIN_DIR_NAME, // プラグインのディレクトリ名 'plugin' => $plugin_file_data, // プラグインファイルデータ 'new_version' => NEW_PLUGIN_VERSION, // 新しいバージョン 'url' => YOUR_WEB_SITE_URL, // 帰属するウェブサイトなどのURL 'package' => UPDATE_PACKAGE_URL, // パッケージのダウンロード先URL(重要) ); // トランジェントにセット $plugin_file = PLUGIN_DIR_NAME . '/' . basename( YOUR_PLUGIN_FILE_PATH ); $transient->response[ $plugin_file ] = ( object ) $_plugin; } return $transient; }
テーマ同様「NEW_PLUGIN_VERSION」など定数で書いている部分はそのプラグインに適するものを使いましょう。
その他の情報
紹介したコードに書かれている定数は、どれもプラグイン内などで自分で設定すべき項目ですので 、オプションなどを使って保存したり、外部へデータをリクエスト・取得して、受け取ったデータを参照しながら、更新通知のデータに挿入していくといいでしょう。
また、プラグインの場合フィルターフック「plugins_api」というものにデータを挿入することで、ポップアップ時に表示される詳細も追加できるなど、詳細な更新通知情報を追記していくことも可能です。
独自配信型のデメリット
ワードプレスのリポジトリを利用していないテーマやプラグインの一番のデメリットは、有効化していないと更新通知が届かないことです。
おそらく上記の更新通知を受け取るためのコードは、更新通知を届けたいテーマやプラグインに直接書く場合が殆どだとは思いますが、アクティブでないテーマやプラグインの場合は、更新通知用のコードも読まれませんので、更新通知は一切届かなくなります。
特に理由が無いのであれば、更新通知用のプラグインを作成しておくのがベターというのが個人的な見解です。
ダウンロード先が同サイトのRestAPIなどの場合は要注意
個人的に大変でなかなか上手く行かなかった失敗例なのですが、というよりは、僕自身忘れていたせいで凄く時間を無駄に費やしてしまっただけなんですが、上で紹介した挿入データの「package」として設定するURL値は要注意です。
ワードプレスはテーマやプラグインを更新する際、完了するまでそのウェブサイトが「メンテナンスモード」に自動的に移行します。
そうするとダウンロード先としてRestAPIによるファイルダウンロードを設定していた場合、更新中のウェブサイトがメンテナンスモードのためにリクエストしたものを返してくれなくなり、エラーとなりますので、ダウンロード先となるURLは「アクセス可能で正しいURL」を設定するようにしてください。
ええ、最初テスト環境でローカルホスト上の同じサイトのRestAPIにアクセスし、原因が分からず何度も失敗して悩んでおりました。グハッ。。。
「Plugin Update Checker」
2つ目の方法としてですが、「Plugin Update Checker」という更新通知用の便利な機能がついたパッケージが配信されていますので、これをそのまま使うのが一番楽だと思います。
「Plugin」という単語が名前に入っていますが、テーマとプラグイン両方に使用できます。
これを利用するのに必要なものは、
- Plugin Update Checker
- 更新情報用のJSONファイル
- 配信したいZIPファイル
の3点のみですので、簡単に始めることができます。
使い方は以下の通りです。
1.テーマやプラグインを任意のリポジトリにアップロード
更新させたい新しいバージョンのコンテンツはZIPファイルにして、URLからアクセスできる任意のリポジトリにアップロードします。
自分の利用しているサーバーでも構いませんし、サポートされているサービス(「GitHub」「BitBucket」「GitLab」)と合わせての利用も可能です。
後者の「GitHub」などを利用する場合だと、バージョンなどをリポジトリから読みますので、次のステップで用意するJSONファイルは不要になり、JSONファイルの代わりにリポジトリのURLをパラメータとして使用することになります。
2.更新情報用JSONファイルの作成
こちらは任意のリポジトリから配信する場合に必要になるステップです。
アクセス可能なリポジトリに更新情報を記載したJSONファイルをアップロードします。ZIPファイルとは別に用意しておいた方が良いかもしれません。
プラグインとテーマではJSONデータの必要な項目が少し異なりますのでご注意を。ダウンロードしたパッケージ内のサンプルに、テーマとプラグイン用にそれぞれ同じ型のファイルがありますので、他の項目の詳細も参照可能です。
テーマ:
{ "version": "2.0", "details_url": "http://example.com/version-2.0-details.html", "download_url": "http://example.com/example-theme-2.0.zip" }
プラグイン:
{ "name" : "Plugin Name", "version" : "2.0", "download_url" : "http://example.com/plugin-name-2.0.zip", "sections" : { "description" : "Plugin description here. You can use HTML." } }
といった感じで、JSONファイルに
- 新しいバージョン
- ダウンロードできるファイルのURL
- 詳細情報
といった情報を載せることができます。
3.テーマやプラグインに「Plugin Update Checker」を実装
次にダウンロードした「Plugin Update Checker」のフォルダを、更新機能を与えたいテーマやプラグインで以下のように書きます。
require 'path/to/plugin-update-checker/plugin-update-checker.php'; // 「Plugin Update Checker」をインクルード $myUpdateChecker = Puc_v4_Factory::buildUpdateChecker( 'http://example.com/to/details.json', // 作成したJSONファイルの __FILE__, // プラグインのメインファイル、もしくはテーマ内のファイル「functions.php」のフルパス 'unique-plugin-or-theme-slug' // プラグインもしくはテーマのスラッグ );
あとは更新通知に反映されるのを待つだけです。
すぐに反映されていない場合でも、数十秒も待てば更新通知が届いている筈ですが、それでも更新通知が届かない場合は作成したJSONファイルがアクセス可能なリポジトリに配置されていていて、上記のコードに正しいURLが記載されているかをご確認ください。JSONファイルに書かれている「ダウンロードのURL」に問題がある場合でも、その他のデータが正しければ通知はされるはずですから。
お問い合わせよりご質問がありましたので、その不明瞭だった件に関してです。
メールアドレスが見つからなかったということで返信できなかったため、こちらに要件についての返信を記しておきます。
「$current_theme_version」は現在ユーザーが使用しているテーマのバージョンとなり、「1.0.0」は初期値として用意したに過ぎません。
次の行で「$theme_file_data->get( ‘Version’ )」で「TEME_DIR_NAME」に適合するディレクトリのテーマのバージョンをセットしています。
私の書いたコードではあくまでサンプルみたいなものですので、「THEME_DIR_NAME」などの定数はワードプレスのコアファイルにより定義されているものではありませんので、実際にアップデートチェッカーとして使用するには、ご自身で要所を定義していただく必要があります。
例えば、定数「NEW_THEME_VERSION」はアップデートの情報を配信するサーバー側が最新バージョンのデータを配信することが必要になります。
これはサーバー側でREST APIなどで最新バージョンのデータ(バージョン値:2.0.0など)が配信されるようにし、クライアント側がそのデータを取得できるような仕組みが両サイドで必要です。
「Plugin Update Checker」というサードパーティ製のパッケージでは、これを任意のURLにJSONファイルを配置して、そのファイルにアクセスすることで最新バージョン値やパッケージのダウンロード先URLなどの情報を取得できるようにしています。
参考になるかは分かりませんが、僭越ながら「Package Update Server for WooCommerce」というプラグインをリポジトリにアップロードしていますので、サーバー側での処理に関してはご参考にしていただければと思います。
また、「package-update-server.com」でこのプラグインに対応するクライアント側のパッケージを無料配信していますので、そちらもご参考になれば幸いです。
すみません、 私のは完全に個人でアップロードしているプラグインですので、アップデートに十分に手が回っているとは言えないかもしれませんが、私も使用してテーマを販売するのに利用しておりますので、エラー報告なども私の気付いていない点などがありましたら非常に助かります。