WordPressのプラグインやテーマの利用者数ってどうやって調べているのかとか、裏で行われている更新情報のチェック間隔を調べてみた。

,

  1. Staff Blog
  2. WordPress
  3. 制作・運用ノウハウ
  4. WordPressのプラグインやテーマの利用者数ってどうやって調べているのかとか、裏で行われている更新情報のチェック間隔を調べてみた。

アドベントカレンダー参加中!

この記事は「Vektor WordPress Solutions Advent Calendar 2022」の12月12日の記事になります。

みなさん、こんにちは。ベクトルのお茶汲み兼飼育係のまるやまです。

先日ですね、社内のDiscordでこんな話題がありました。

「WordPressテーマの有効インストール数ってそもそもなんなのだろう。どうやって数えているの?」

このページのこれですね。(下図赤線)

Lightningが12月7日現在 80,000+ とのこと。いやいや、みなさまご利用ありがとうございます。お茶汲み兼飼育係として厚く御礼申し上げます。

WordPressのディレクトリではこのようにプラグインやテーマのインストール数が公表されているのですが、これは一体どうやって数えているんでしょうか。

というわけで、いろいろ調べた記録です。調べていくうちに、裏であんなことやこんなことが行われているんだと勉強になりました。

まずは検索ですよね。

まず、いろいろ検索してみたらこんな記事に出会いました。

「どうやってWordPressでアクティブインストールされたプラグインの数を数えてるの?」って感じですが、この中の重要な部分を抜き出しましょう。

After some quick research the answer to how WordPress is figuring out active installs for plugins came up on the WPChat forum. A user there, Samuel “Otto” Wood, from the WordPress development team broke it all down for us.

Whenever a WordPress site is actively used it pings the WordPress plugin database to see if any of the installed plugins have new releases available to download. This is what happens when you load up your WordPress admin to write a post or do another task and you see an alert next to the “Plugins” menu telling you how many plugins you have that need updated. WordPress.org is simply collecting and updating its internal count of installs for each activated plugin you use during this check.

https://theplugineconomy.com/wordpress-plugin-active-installs/

これを翻訳したのがこちらです。

WordPressがどのようにプラグインのアクティブインストールを計算しているのか、いくつか調べてみたところ、WPChatフォーラムで答えが見つかりました。WordPress 開発チームの Samuel “Otto” Wood 氏が説明してくれました。

WordPressのサイトがアクティブに使用されるたびに、WordPressのプラグインデータベースにpingを送り、インストールされているプラグインの中に新しいリリースがあるかどうかを確認します。WordPressの管理画面で記事を書いたり、他の作業をしたりするときに、「プラグイン」メニューの横に更新が必要なプラグインの数を示すアラートが表示されるのは、このためです。WordPress.org は、このチェックの間、あなたが使用している有効なプラグインのインストール数を内部的に収集し、更新しているだけです。

www.DeepL.com/Translator(無料版)で翻訳しました。

https://theplugineconomy.com/wordpress-plugin-active-installs/

DeepL先生ありがとうございます。

ほほう、そうなんですね!

WordPressは各プラグインやテーマの更新情報をに取得する際にそのサイトで使われているプラグインやテーマの数を内部的に収集して、WordPressのAPIサーバーに送信しています。

いかがでしたか?

・・・で終わってしまうと、「あー、まるやまさん手抜きしたなー」と思われるのが癪なので、実際にWordPressでそれをやってるところを探してみました。

実際にソースコードで確認!

まずプラグインのインストール情報を送信している箇所です。

wp_update_plugins() とか wp_update_themes() といった関数が wp-inculudes/update.php で定義されています。

この関数で、WordPressはサイトにインストールしているプラグインの情報をWordPressのAPIに送信しつつ、プラグインの更新情報を取得しています。

実際のソースコードで確認してみましょう。

https://github.com/WordPress/WordPress/blob/018d10cafeae082aae83c5affdb7261278db7bc9/wp-includes/update.php#L415-L438

	$options = array(
		'timeout'    => $timeout,
		'body'       => array(
			'plugins'      => wp_json_encode( $to_send ),
			'translations' => wp_json_encode( $translations ),
			'locale'       => wp_json_encode( $locales ),
			'all'          => wp_json_encode( true ),
		),
		'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url( '/' ),
	);


	if ( $extra_stats ) {
		$options['body']['update_stats'] = wp_json_encode( $extra_stats );
	}


	$url      = 'http://api.wordpress.org/plugins/update-check/1.1/';
	$http_url = $url;
	$ssl      = wp_http_supports( array( 'ssl' ) );


	if ( $ssl ) {
		$url = set_url_scheme( $url, 'https' );
	}


	$raw_response = wp_remote_post( $url, $options );

最後の wp_remote_post( $url, $options ) で送信していますね。

第1引数の $url つまり http://api.wordpress.org/plugins/update-check/1.1/ 宛に、第2引数の $options に詰め込んだ内容を送信しています。

上の方で、$options['body']['plugins']wp_json_encode( $to_send ) を格納していますが、ソースコードをさらに読み込んでいくと、$to_send にプラグイン情報を詰め込んでいるのが見て取れると思います。

テーマのインストール数も同様です。

https://github.com/WordPress/WordPress/blob/018d10cafeae082aae83c5affdb7261278db7bc9/wp-includes/update.php#L697-L713

ここでプラグインと同様の処理をしています。

そこで疑問が湧きます。

こんなAPIに情報送信したり取得するような処理が、WordPressにアクセスするたびに行われているのだろうかと。

その部分も調べてみました。

プラグインやテーマの更新チェック間隔をついでに調べる

プラグインの場合、こんな感じでAPIへ情報を送受信する間隔を制御しています。

https://github.com/WordPress/WordPress/blob/018d10cafeae082aae83c5affdb7261278db7bc9/wp-includes/update.php#L342-L359

	switch ( current_filter() ) {
		case 'upgrader_process_complete':
			$timeout = 0;
			break;
		case 'load-update-core.php':
			$timeout = MINUTE_IN_SECONDS;
			break;
		case 'load-plugins.php':
		case 'load-update.php':
			$timeout = HOUR_IN_SECONDS;
			break;
		default:
			if ( $doing_cron ) {
				$timeout = 2 * HOUR_IN_SECONDS;
			} else {
				$timeout = 12 * HOUR_IN_SECONDS;
			}
	}

これをみるとAPIへ更新の問い合わせ間隔がわかります。

WordPressの更新チェック間隔

  • 通常は12時間
  • cronで呼び出されたときは2時間
  • update-core.php(管理画面「ダッシュボード >更新」)にアクセスした時は1分
  • plugins.php「管理画面「プラグイン」)へのアクセス時、更新をかけた時は1時間

ということになります。テーマも同様の処理です。

したがって、速やかにプラグインやテーマの更新情報をチェックしたい場合は、「ダッシュボード >更新」にアクセスすると、間違いなく最新の情報に更新されます。

しかし、よほど緊急でもなければ、更新チェック12時間おきで十分だと思いますので、むやみやたらに「ダッシュボード>更新」にアクセスするのは、WordPressのサーバーに負荷をかけるので、最低限にいたしましょう。

まとめ

このようにして、WordPressはプラグイン・テーマの更新情報を取得する際に、サイトにインストールされているプラグインやテーマの情報をWordPressのAPIサーバーに送信していることがよくわかりました。

インストール数はこの時に送信された情報を元に算出されているようですね。

さて、最初にお茶汲み兼飼育係と書きましたが、ベクトルは今ではフルリモートの職場になりましたので、お茶も汲んでいないですし、飼育もしていません。嘘つきで申し訳ございません。

しかし、もしベクトルにオフィスが復活して、そこに出勤するならば、スタッフのみなさまのお茶を汲み、オフィスの片隅で柴犬を4匹ほど飼育したいという願望を込めております。

というわけで、明日のアドベントカレンダーはベクトルスタッフのうなさんの「404ページをクリスマスバージョンにしてみた」です! 楽しみですね!

この記事を書いた人

Taichi Maruyama
Taichi Maruyama
2021年3月からベクトルのお手伝いをしているレガシーエンジニア。最近const覚えました。

その裏で、BREADFISHというキリスト教会専門のウェブ制作事業を密かに展開しています。
フルサイト編集に対応したブロックテーマ X-T9

フルサイト編集対応ブロックテーマ

WordPress テーマ X-T9 は、WordPress 5.9 から実装されたフルサイト編集機能に対応した「ブロックテーマ」と呼ばれる新しい形式のテーマです。
ヘッダーやフッターなど、今までのテーマではカスタマイズが難しかったエリアもノーコードで簡単・柔軟にカスタマイズする事ができます。


PAGE TOP

このデモサイトは Vektor,Inc. のテーマとプラグインで構築されています。ご購入や詳細情報は下記のリンクもご参考ください。