Skip to content

Category Ranking

Takahashi Fumiki edited this page Jan 12, 2024 · 6 revisions

Requires: Version 3.0.0 and over

本稿の内容はGoogle Analytics 4に対応したものになっています。

データの登録

カテゴリー別PVランキングを作るには、イベント(ページ閲覧)にカスタムディメンションを紐づける必要があります。「/article/1234というページを閲覧した」というイベントに「category=1」というカスタムディメンションを紐づけることで、「categoryが_1_のページ閲覧(ScreenView)イベント」をフィルタリング検索することができます。

カスタムディメンションの設定方法は公式ドキュメントを参考にしてください。本稿では、紐づけるための情報をどのように取得するかを2つの方法で説明します。

プレースホルダー機能を使う

Ga Communicatorの設定画面にはプレースホルダー機能があります。これは出力するスクリプトの一部を置換することで、JavaScriptから値を利用できるようにするものです。たとえば、%post_id% は現在のページの投稿IDに変わります。

設定するScriptに次のように書けば、カスタムディメンションを利用できます。

// gtag.jsの場合
// gtagConfigはプラグインが利用する変数で、GAへの通知に使われます。
// やや冗長ですが、このように2回指定する必要があります。
gatagConfig.custom_map = {
    dimension1: 'post',
    dimension2: 'post_type',
    dimension3: 'category',
};
gtagConfig.post = %post_id%;
gtagConfig.post_type = "%post_type%";
gtagConfig.category = "%post_terms%";


// GTM(JSを別の場所で管理している場合)
window.gacom = {
    post: %post_id%,
    post_type: '%post_type%',
    terms: '%post_terms%'
};
// 他のJS(e.g. GTM)からアクセス、JSの読み込み順に注意。
var dataLayer = dataLayer || [];
dataLayer.push({
    'post_id': window.gacom.post,
    'category': window.gacom.terms,
});

metaタグ機能を使う

metaタグ機能を利用すると、metaタグに値が出力されるので、それを利用します。

フィルターの登録

それでは、カテゴリー別のランキングを取得するために、ランキング取得のロジックを次のように決定しましょう。

  1. ページビューとパスの一覧を取得する(=通常のランキング)
  2. カスタムディメンションcategoryで _1_ が含まれているもの(タームID: 1のついた記事)でフィルタリングする

フィールド名の指定方法は 公式ドキュメント をご覧ください。

$ranking = Kunoichi\GaCommunicator::get_instance()->ga4_get_report( [
	'dimensionFilter' => [
		'filter' => [
			'fieldName'    => 'customEvent:category',
			'stringFilter' => [
				'matchType' => 'CONTAINS',
				'value'     => '_1_',
			],
		],
	],
] );

上記により、 [ パス, タイトル, ビュー数 ] の配列が入手できます。投稿タイプでの絞り込みや、著者別人気記事なども同様の方法で取得することが可能です。

Universal Analyticsでの実装(廃止済み)

データの登録

カテゴリー別一覧を作るには、カスタムディメンションを登録する必要があります。 今回はカスタム定義のスロット2にカテゴリーを登録します。 カスタム定義の登録の作業はGoogle Analytics上で行う必要があります。

フィルターの登録

いくつかのプレースホルダーが用意されていますが、カテゴリーは用意されていません。 プレースホルダーをフィルターで追加してください。今回のケースでは、重複を想定し、次のようなデータの形になることを目指します。

ga( 'set', 'dimension2', '_2_, _3_, _4_,_102_' );

この変わったデータ形式は、正規表現でうまくIDを扱うためです。たとえば、上記を 2,3,4,102 として登録してしまった場合、「カスタムディメンションに10を含む」で検索した場合、マッチしてしまいます。これを防ぐために _ を前後に付与しています。もちろん、これは一つの実装例ですので、もっとよい形式がありえるなら、それでも構いません。

登録は ga_communicator_placeholders フィルターフックを利用します。

add_filter( 'ga_communicator_placeholders', function( $placeholders ) {
    $placeholders[] = [
        'name'        => 'category_ids',
        'description' => 'CSV list of category ids.',
        'callback'    => function() {
            if ( ! is_singular() ) {
                return '';
            }
            $terms = get_the_category( get_queried_object_id() );
            if ( ! $terms || is_wp_error( $terms ) ) {
                return '';
            }
            return implode( ',', array_map( function( $term ) {
                 return sprintf( '_%d_', $term->term_id );
            }, $terms ) );
        },
    ];
    return $placeholders;
} ); 

設定

設定 > Googleアナリティクス設定 > 追加のスクリプト

で、次のように設定してください。

ga('set', 'dimension2', %category_ids%);

これですべてのページビューにカテゴリーのCSVが紐づけられます。

データの取得

カテゴリー別のページビューランキングを取得するには、ディメンションにカテゴリーIDを、メトリクスにPVとパスを指定します。

$authors = Kunoichi\GaCommunicator::get_instance()->get_report( [
	'dimensions' => [
		[
			'name' => 'ga:dimension2',
		],
		[
			'name' => 'ga:pagePath',
		],
	],
	'dimensionFilterClauses' => [
		[
			'operator' => 'AND',
			'filters' => [
				[
					'dimensionName' => 'ga:dimension2',
					'operator' => 'REGEXP',
					'expressions' => [
						'_1_', // カテゴリーID1を含むもののみ
					],
				],
			],
		],
	];
] );

上記により、カテゴリーID1に属する投稿のみのランキングが作成できます。 注意点としては、カテゴリーを途中で変更したときに重複したデータが作成されうることです。