WordPressの投稿のカテゴリー/タグ/作成者をGoogleタグマネージャーとGoogleアナリティクス（GA4）で集計する

# やりたいこと
前提で WordPress のサイトにGoogle タグマネージャー（GTM）、Google アナリティクス（GA4）のタグは設置済み。

投稿のページビュー（表示数）に基づく
* 投稿作成者
* 投稿カテゴリー
* 投稿タグ→複数ある場合は個別に集計

を **WordPress に PHP などでコードは設置せず**、GTMだけで実装したい。

# Google アナリティクスでカスタムディメンションを準備
受ける側となるカスタムディメンションを設定しておく。
GA4 のダッシュボードを開いて設定→カスタム定義から以下を設定。
イベント パラメータは任意の名称で良い。パラメーター名はGTMで利用する。

| ディメンション名 | 範囲 | イベント パラメータ　|
|:-:|:-:|:-:|
| 投稿作成者 | イベント | author |
| 投稿カテゴリー | イベント | category |
| 投稿タグ | イベント | post_tag |

![gaカスタムディメンション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18348/41cf3fae-15d6-782d-11f9-67bf5e66278a.png)

# Google タグマネージャー での設定

## ユーザー定義変数の作成
投稿詳細ページで、作成者、カテゴリ-、タグがHTMLとして出力されている事が条件となります。
例: スクリーンショットとHTMLはイメージです
```
<div class="post-author">Kazue Igarashi</div>
<div class="post-categories">
    <a class="post-category" href="#">Technology</a>
    <a class="post-category" href="#">Blog</a>
</div>
<div class="post-tags">
    <span class="post-tag"><a href="#">タグ1</a></span>, 
    <span class="post-tag"><a href="#">タグ2</a></span>, 
    <span class="post-tag"><a href="#">タグ3</a></span>, 
    <span class="post-tag"><a href="#">タグ4</a></span>
</div>
```

![スクリーンショット 2022-11-04 10.12.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18348/ddbc42a4-efdd-6526-b513-6d7dcfb97883.png)

ワークスペース→変数→新規で作成。
<table>
<tr><th>変数のタイプ</th><td>DOM要素</td></tr>
<tr><th>選択方法</th><td> ID または CSSセレクタ</td></tr>
<tr><th>要素ID もしくはセレクタ</th><td>HTMLタグに合わせて指定</td></tr>
</table>

前述のHTMLで投稿タグの場合
| 名前 | 変数のタイプ | セレクタ　|
|:-:|:-:|:-:|
| 投稿作成者 | DOM要素 | `.post-author` |
| 投稿カテゴリー | DOM要素 | `.post-categories` |
| 投稿タグ | DOM要素 | `.post-tags` |

【注意点】
GTMで変数でDOM要素を指定した場合、要素内にHTMLタグが含まれている場合は削除されます。
前述のHTMLマークアップでの投稿タグの場合、格納されるテキストは下記の通り
| 名前 |値　|
|:-:|:-:|
|{{投稿作成者}} | `Kazue Igarashi` |
| {{投稿カテゴリー}} | `TechnologyBlog` |
| {{投稿タグ}} | `タグ1, タグ2, タグ3, タグ4` |

投稿カテゴリーのようにHTMLマークアップによっては後述するカスタムHTMLで配列に加工する処理が難しくなるので、その場合はGTMの変数を利用せずJSで加工する。

## 単一要素の計測
投稿作成者のように投稿で単一になっている要素の計測はタグの「GA4設定」でページビューの計測を行うときに、同時に値を送信できます。
![ga4ページビュー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18348/0d1821c4-d01a-cf6e-fa2e-b5935b18184a.png)

1 「この設定が読み込まれるときにページビュー イベントを送信する」にチェック
2. 送信したい内容を設定フィールドを設定しておく
フィールド名: カスタムディメンションの名前。ここでは `author`
値: ユーザー定義変数で作成したDOM要素。ここでは `{{投稿作成者}}`

## 複数の値の計測
投稿に複数あるカテゴリー、タグはページビューの計測と同時の場合、値は1つしか送信できません。
とはいえ値を配列や `,` で区切ったテキストで送信すると集計が大変です。
このようなに一つのカスタムディメンションで値を複数回送信したいときはイベントを利用します。

### ユーザー定義変数でデータレイヤー変数の作成
変数のタイプでデータレイヤーの変数を選んで設定。
データレイヤーの変数名はGA4のカスタムディメンションの名前にする。
![ga4dl変数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18348/d9c3015f-0d4b-d3ad-5642-dd127573c2a9.png)

ここでは以下とします。
| 変数名 | 内容 | データレーヤーの変数名　|
|:-:|:-:|:-:|
| DL - category | 投稿カテゴリー | category |
| DL - post_tag | 投稿タグ | post_tag |

デフォルト値はお好みですが、GA4側でフィルタリングできるよう `none` にしておくと便利。

### トリガーでDOM Ready、カスタムイベントを作成
#### DOM Readyイベント
後述するDOM要素から投稿のタグ名、投稿のカテゴリー名を取得して加工する時のトリガーになります。
![DOMイベント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18348/dce2d2f1-cede-aee8-a3f6-8ff8e40c613d.png)

#### カスタムイベント
後述するの複数の値を送信したい時のトリガーになります。
ここでは `contentTracker` としています。
![カスタムイベント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18348/a4122ff3-7634-8836-bdd6-6fc2219c9cca.png)

### タグのカスタムHTMLでイベント送信用のJavScriptを作成
![カスタムHTML.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18348/247582b8-d99e-2fcc-3cdd-8e06d9060f93.png)
ソースコードは下記を参考に。サイトに実装に合わせて加工すること。
配信トリガーに `DOM Ready` を指定し、DOMが準備できたら実行されるようにします。

```html
<script>
  window.dataLayer = window.dataLayer || [];
  // DOM要素から投稿タグのテキストを取得。GTMの変数を利用した場合。
  var tags = '{{投稿タグ}}';
  // 取得した投稿タグのカンマ区切りのテキストを配列に変換する
  var taglist = [];
      taglist = tags.split(/\s*,\s*/);
  for(var i = 0; i < taglist.length; i++) {
    dataLayer.push({
      'event': 'contentTracker', // カスタムイベント名
      'post_tag': taglist[i] // カスタムディメンションの名前と送信したい値
    });
  }

  // DOM要素から投稿カテゴリーのテキストを取得 querySelectorAll で複数取得して実施
  var cats　 = document.querySelectorAll(".post-category");
  cats.forEach(function (value) {
    dataLayer.push({
      'event': 'contentTracker', // カスタムイベント名
      'post_tag': '', // これしておかないと最後の投稿タグが何回も送信される　良い方法が浮かばない。
      'category': value.innerHTML.trim() // カスタムディメンションの名前と送信したい値
    });
  });
</script>
```

### GA4イベントを設定
カスタムHTMLで設定したカテゴリー/タグの値をGA4にイベントとして送信するために、GA4イベントを作成して設定します。

![ga4イベント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18348/770b43fe-4e2d-fb16-2201-40bc4d2f6f21.png)

タグの種類 Google アナリティクス: GA4　イベント
設定タグ: Google アナリティクス GA4 ページビュー
イベント名: カスタムHTMLで設定したカスタムイベント名 ここでは `contentTracker`
イベントパラメーター名/値はカスタムHTMLで作成した内容と先に作成したデータレイヤー変数を利用します。
ここでは以下とします。
| パラメーター名 | 値　|
|:-:|:-:|
| category | {{DL - category}} |
| post_tag | {{DL - post_tag}} |

配信トリガーはカスタムイベントで作成した `contentTracker` を選びます

**途中で必ずプレビューを実施して取得/送信ができそうか確認しましょう。**

デバッガー上で
- `contentTracker` イベントが追加されGA4イベントが実施されていること。
- GA4に`contentTracker` イベントで送信されているパラメーターと値
を確認しましょう

![スクリーンショット 2022-11-02 21.04.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18348/dbed8251-0ac0-3289-5427-7774f010e1c4.png)

![スクリーンショット 2022-11-02 21.06.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18348/14a1f503-7db4-d920-e836-5eb9c7e61ad8.png)

準備ができたらGTMを公開します。

# GA4 での見え方
リアルタイムのイベント数もしくはエンゲージメントのイベント内の `contentTracker` で内容を見られます。

このままで見づらい場合は探索でレポートを作成しましょう

1. 探索＞空白のレポート　で新規作成
1. ディメンションで作成したカスタムディメンションを使えるように取り込む
1. 指標でイベント数、表示回数を使えるように取り込む
1. タブの設定で行にカスタムディメンション名、値に表示数もしくはイベント数を設定
1. フィルタで(not set)などの投稿以外で取得できなかったデータを除外しておくと良いです。

![探索.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18348/64b06fc3-5c29-3dc0-8f5b-8d61fb880f60.png)

# WebサイトでGA4のデータを利用したい
集計さえしておけば Analytics Data API（執筆時点でベータ）を利用してWebサイト側で利用できます

- 人気の投稿作成者
- 投稿のPVに基づく人気のジャンル（カテゴリー、タグ）

Googleの提供しているGA4 Query ExplorerでGA4の探索と同じようにカスタムディメンションやイベント数を設定すると、APIで取得できる内容の検証ができます。

https://ga-dev-tools.web.app/ga4/query-explorer/

現場からは以上です。