週に一度、自作の WordPress プラグイン6本の数字を WordPress.org のプラグイン情報 API から取ってきて、前の週と並べるスクリプトを回しています。ある週のレポートで、Rapls AI Chatbot の有効インストールが 60 から 40 に下がっていました。その次の週は 50、その次は 40、次は 30。4週で半分に見えます。
これは読み違いでした。この記事では、active_installs という数字がどう作られて、どう読めばいいのかを、自分の記録を材料にまとめます。
先に断っておくと、active_installs が10未満で 0 になることや、10刻みで丸められることは既知の話です。WordPress 本体の管理画面のコードにもそのまま出てきますし、Gutenberg にも 「0 active installations」ではなく「Less than 10」と出すべきだという issue があります。ここで足せるのは、実際の導入数が分かっているプラグインで、API の値がどう見えたかと、週ごとの上下の幅です。
12サイトに入れて、0 と出た
自作のキャッシュプラグイン Prime Cache は、自分が管理する12のサイトに入れています。顧客のサイトではなく、全部自分の管理下です。つまり実数が12だと分かっている状態です。
7月20日の計測では、API の active_installs は 0 でした。プラグインのページには「Fewer than 10」と出ます。
WordPress 本体で、プラグインの追加画面がこの値をどう表示しているかを見ると、こうなっていました(wp-admin/includes/class-wp-plugin-install-list-table.php)。
if ( $plugin['active_installs'] >= 1000000 ) {
// 「%s+ Million」
} elseif ( 0 === $plugin['active_installs'] ) {
$active_installs_text = _x( 'Less Than 10', 'Active plugin installations' );
} else {
$active_installs_text = number_format_i18n( $plugin['active_installs'] ) . '+';
}
0 は「0人」ではなく「10未満」として扱われています。API の値そのものには、0人と9人の区別がありません。
1週間以上遅れて、10 になった
8月10日の計測で、Prime Cache は 10 になりました。12サイトに入れてから、反映に1週間以上かかっています。
そして 12 は 10 と出ます。今(9月27日)もページの表示は「10+」のままで、記録の上でも、入っているのは自分の管理するサイトだけです。
ここまでで分かったことは3つです。
- 0 は 0〜9 のどれか
- 10刻みで切り捨てられる(12 → 10)
- 入れてから反映されるまで、1週間以上かかることがある
60 → 40 → 50 → 40 → 30 → 50
冒頭の AI Chatbot に戻ります。週次の記録を並べるとこうです(最後が9月24日)。
| 回 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| active_installs | 40 | 60 | 40 | 50 | 40 | 30 | 50 |
最後の回は、前の回から3日しか空いていません。その3日で 30 から 50 に戻っています。20サイトが3日で入れ直したとは考えにくいので、これは数字の揺れです。
同じ時期の別の数字も並べます。
| 指標 | 同じ期間の動き |
|---|---|
| Pro の販売数 | 8月末の8件 → 9月24日の11件 |
| 「openrouter」の検索順位 | 10位(前回から5つ上昇) |
| 「ai chatbot」の検索順位 | 14位(前回から4つ上昇) |
有効インストールだけが下がって見えていました。ほかの指標がそろって上を向いているときに、1つだけ逆を向いているなら、まずその1つを疑うべきでした。
この規模では、週ごとの ±10〜20 は揺れと見るのが妥当だと思います。10刻みの切り捨てだけでは 60 → 40 の幅は説明しきれないので、元になる集計自体も週ごとに揺れているのでしょう。そこは WordPress.org の内部の話なので、推測にとどめます。
順位が上がった週に、3割減った?
もう1本、Rapls Sitemap でも同じことが起きました。
9月21日から24日のあいだに説明文を書き直して、「サイトマップ」の日本語検索の順位が 37位から15位に上がりました。その同じ計測で、有効インストールは 30 から 20 に下がっています。
順位がこれだけ上がった週に、使っている人が3割減るとは考えにくいです。そして今日(9月27日)ページを見ると、「40+」になっていました。
| 時点 | Rapls Sitemap の表示 |
|---|---|
| 9月21日 | 30 |
| 9月24日 | 20 |
| 9月27日 | 40+ |
余談ですが、同じ日にパスキーのプラグイン Rapls Passkey を見たら「20+」でした。数週間ずっと「10未満」だったものです。Thanks Mail for Stripe は「Fewer than 10」のまま。10未満から抜けるときも、ある週に急に出てきます。
どう読めばいいのか?
自分では、次のように読むことにしました。
- 0 は「10未満」と表示する。0人とは書かない
- 100未満の製品では、1週の上下では判断しない。4週ぶんの中央値で見る
- 有効インストールが逆を向いたら、ダウンロード数・評価件数・検索順位・販売数と並べる
- 入れてから1週間以上は、反映されない前提で待つ
スクリプトに入れ終わっているのは、0 を「10未満」と出すところと、累計の数字が減ったら警告するところです。累計ダウンロード数や評価件数は減らない数字なので、減ったら記録か計測の異常とみなします。有効インストールは減りうる数字なので、同じ警告は出しません。4週の中央値は、これから足します。
中央値にしたのは、平均だと 60 のような外れた1回に引っ張られるからです。AI Chatbot の7回ぶんの中央値は 40 で、最初の回と同じ値でした。
残っている問い
有効インストールの数字は、小さいプラグインほど粗く、揺れが大きく見えます。そういう数字を毎週見ることに、どれくらい意味があるのか。自分はいま、4週ぶんをまとめて見ることで折り合いをつけていますが、100 を超えたら、1000 を超えたら、どの幅を揺れとみなすのか。そこはまだ決められていません。
皆さんは、自分のプラグインの有効インストールを、どの間隔で見ていますか。
スクリプトの該当部分
表示と警告の部分は、いま動いているものからの抜き出しです。中央値の関数は、これから足す予定のものです。
import statistics
def fmt_installs(n):
"""API の active_installs を表示用にする。0 は 0〜9 を意味する。"""
if n is None:
return "?"
return "10未満" if n == 0 else f"{n:,}"
def recent_median(history, slug, weeks=4):
"""直近 weeks 回の active_installs の中央値。記録が足りなければ None。"""
values = [
entry["plugins"][slug]["active_installs"]
for entry in history[-weeks:]
if slug in entry.get("plugins", {})
and entry["plugins"][slug].get("active_installs") is not None
]
return statistics.median(values) if len(values) >= 2 else None
MONOTONIC_KEYS = {"downloaded", "num_ratings", "sales_total"}
def delta(now, prev, key=None):
"""前回比。減らないはずの累計が減ったら警告する。"""
if prev is None or now is None:
return ""
d = now - prev
if d == 0:
return " (±0)"
if d < 0 and key in MONOTONIC_KEYS:
return f" ({d} ⚠ 累計が減少)"
return f" ({'+' if d > 0 else ''}{d})"
ふだんはraplsworks.comで、WordPressプラグイン開発やClaude Codeまわりのことを書いています。
https://raplsworks.com/