0
0

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.org の active_installs が 0 でも、使っている人がいないとは限りません【自作プラグイン6本の週次記録から】

0
Posted at

週に一度、自作の 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/

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?