記事一覧に人気順位を星で表示する
CATEGORIES CSS PHP WORDPRESS
記事タイトル(1位)★★★
2026-10-01 CATEGORY #TAG
記事タイトル(7位)★★☆
2026-09-20 CATEGORY #TAG
記事タイトル(18位)★☆☆
2026-08-15 CATEGORY #TAG
記事タイトル(31位以下)
2026-07-03 CATEGORY #TAG

記事一覧のタイトルの右(または日付の行の右)に、GA4 の人気順位を星で表示する方法。星の段階・集計期間は数字の変更だけで調整できる。

順位表示
1〜3位★★★
4〜10位★★☆
11〜30位★☆☆
31位以下・ランキング外表示しない

※星にマウスを乗せると「POPULAR 5位」のように順位が表示される。

GA4 との連携が済んでいて、Backon GA4 Ranking プラグインで人気記事(POPULAR POSTS)が表示できていることが前提。jQuery・Font Awesome は使わない。

PHP

テーマの inc/ga4-rank-stars.php として格納。inc フォルダがない場合は作成する。

<?php
/**
 * 記事一覧に GA4 の人気順位を星で表示する
 *
 *   1〜3位:★★★ / 4〜10位:★★☆ / 11〜30位:★☆☆ / 31位以下・ランキング外:表示しない
 *
 * 前提:Backon GA4 Ranking プラグイン(bgr_ga4_get_ranking_ids())が有効で、GA4 との接続テストが通っていること
 * 格納先:テーマの inc/ga4-rank-stars.php(functions.php から require_once で読み込む)
 *
 * ・集計期間は MY_RANK_STARS_PERIOD(昨日までの○日間)。POPULAR POSTS のページと同じ日数にそろえる
 * ・1ページの中で何回呼んでも、ランキングの取得は最初の1回だけ(static で使い回す)
 *   一覧の記事ごとにランキングを取得すると、記事の数だけ同じ処理をくり返すため
 * ・GA4 への問い合わせはプラグインのキャッシュ(12時間)を使う。ページを開くたびには問い合わせない
 * ・プラグインが止まっているときは何も表示しない(エラーにならない)
 *
 * テンプレートでの使い方(ループの中):
 *   <?php echo my_ga4_rank_stars(); ?>
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

// ★ 集計期間(昨日までの○日間)。POPULAR POSTS のページと同じ日数にする
if ( ! defined( 'MY_RANK_STARS_PERIOD' ) ) {
	define( 'MY_RANK_STARS_PERIOD', 90 );
}

/**
 * 星の HTML を返す(31位以下・ランキング外は空文字)。
 *
 * @param int $post_id 投稿ID。省略時はループ中の投稿。
 * @return string 星の HTML(エスケープ済み)。
 */
function my_ga4_rank_stars( $post_id = 0 ) {
	static $ranks = null;

	// 最初の1回だけランキングを取得して「投稿ID => 順位」の表を作る
	if ( null === $ranks ) {
		$ranks = array();
		if ( function_exists( 'bgr_ga4_get_ranking_ids' ) ) {
			$ids = bgr_ga4_get_ranking_ids(
				array(
					'period' => MY_RANK_STARS_PERIOD,
					'limit'  => 30, // ★ 星を表示するのは30位まで
				)
			);
			foreach ( $ids as $index => $id ) {
				$ranks[ (int) $id ] = $index + 1;
			}
		}
	}

	$post_id = $post_id ? (int) $post_id : (int) get_the_ID();
	$rank    = isset( $ranks[ $post_id ] ) ? $ranks[ $post_id ] : 0;

	// ★ 順位から黒星の数を決める(31位以下・ランキング外は表示しない)
	if ( $rank >= 1 && $rank <= 3 ) {
		$filled = 3;
	} elseif ( $rank >= 4 && $rank <= 10 ) {
		$filled = 2;
	} elseif ( $rank >= 11 && $rank <= 30 ) {
		$filled = 1;
	} else {
		return '';
	}

	// マウスを乗せると順位が表示される(title)。読み上げにも同じ文言(aria-label)
	$label = sprintf( 'POPULAR %d位', $rank );
	$stars = str_repeat( '★', $filled ) . str_repeat( '☆', 3 - $filled );

	return sprintf(
		'<span class="rank-stars" title="%1$s" aria-label="%1$s">%2$s</span>',
		esc_attr( $label ),
		esc_html( $stars )
	);
}

ランキングの取得は、1ページの中で最初の1回だけにしている。一覧の記事ごとに取得すると、記事の数だけ同じ処理をくり返すため。

GA4 への問い合わせは、プラグインのキャッシュ(12時間)を使う。ページを開くたびに GA4 へ問い合わせると、表示が遅くなるため。

プラグインが止まっているときは、星を表示しないだけでエラーにはならない。

functions.php

functions.php の末尾に追記。functions.php が ?> で終わっている場合は、?> の手前に追記する。

/**
 * 記事一覧の人気順位の星(GA4。Backon GA4 Ranking プラグインを使う)
 * 本体:inc/ga4-rank-stars.php
 * 使わなくなったら、下の1行とテンプレートの my_ga4_rank_stars() をコメントアウトする
 */
require_once get_template_directory() . '/inc/ga4-rank-stars.php';

テンプレート

記事一覧のテンプレートの、ループの中に追記。対象はトップ(front-page.php・home.php)、カテゴリ・タグ・年別(archive.php・category.php・tag.php・index.php など)、検索結果(search.php)。

※テーマによってファイル名・HTML は異なる。the_title() と日付を表示している行を探して追記する。下記の entry-title・entry-meta は説明用の例。

タイトルの右に表示する場合 タグが多く、日付の行が長くなるテーマに向いている。</a> の直後に追記する。

変更前

<h2 class="entry-title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>

変更後

<h2 class="entry-title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a><?php echo my_ga4_rank_stars(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- 関数内でエスケープ済み ?></h2>

日付・カテゴリ・タグの行の右に表示する場合 日付の行の最後に追記する。

変更前

<p class="entry-meta">
	<span><?php the_time( 'Y-n-j' ); ?></span>
	<span><?php the_category( ' ' ); ?></span>
	<?php the_tags( '<span>', ' ', '</span>' ); ?>
</p>

変更後

<p class="entry-meta">
	<span><?php the_time( 'Y-n-j' ); ?></span>
	<span><?php the_category( ' ' ); ?></span>
	<?php the_tags( '<span>', ' ', '</span>' ); ?>
	<?php echo my_ga4_rank_stars(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- 関数内でエスケープ済み ?>
</p>

※POPULAR POSTS のページには追記しない。順位の順に並んでいるページなので、星は不要。

CSS

テーマの CSS(style.css など)の最後に追記。各自デザインに合わせて。

/* ===== ここから CSS(記事一覧の人気順位の星) ===== */
.rank-stars {
	margin-left: 0.4em;      /* ★ タイトル・日付との間 */
	font-family: sans-serif; /* ★☆ が無いフォント(英字専用の Web フォントなど)でも表示されるように、記号は標準のフォントで */
	font-size: 80%;          /* ★ 星の大きさ(周りの文字に対して) */
	font-weight: 400;
	letter-spacing: 0.05em;
	color: inherit;          /* ★ 星の色。周りの文字と同じ。たとえば #3c3c3b のように指定もできる */
	white-space: nowrap;     /* 星3つの途中で折り返さない */
	cursor: default;
}
/* ===== ここまで CSS ===== */

※font-family を sans-serif にしているのは、英字専用の Web フォントには ★☆ の記号が入っていないことがあるため。

集計期間の設定

集計期間は、POPULAR POSTS のページと同じ日数にする。日数が違うと、POPULAR POSTS の順位と星が合わなくなるため。

アクセスが少ないサイトは、90日くらいの長めの期間がいい。7日だと PV のある記事が30本に届かず、11〜30位の星がほとんど表示されないため。また、1〜2PV の差で順位が入れ替わり、公開した直後に自分で開いた記事も上位に入りやすい。

期間が足りているかは、GA4 の「レポート」→「エンゲージメント」→「ページとスクリーン」で期間を設定して、記事が30本以上並ぶかで確認できる。

変更する場合

変えたいもの変更箇所
集計期間ga4-rank-stars.php の MY_RANK_STARS_PERIOD(昨日までの日数)
星を表示する順位の範囲ga4-rank-stars.php の 'limit' => 30 と、if の 3・10・30
星の色・大きさCSS の color・font-size
表示位置テンプレートの追記位置(タイトルの右/日付の行の右)

表示環境によって動きの見え方が異なる場合があるため、本番に反映する前に確認してね。

NOTICES

  • 記事内容は実装させたものがほとんどですが自己責任で参考にしてください。