Simple GA Rankingを使ったけどあれこれカスタマイズした話 前編【WordPress】

関連タグ:

公開日:

最終更新日:

Simple GA Rankingを使ったけどあれこれカスタマイズした話 前編【WordPress】

つい最近の案件で人気ページのランキングを表示したいという要望があり、ページアクセスがあるたびにカスタムフィールドの値を更新するいつもの実装をしようかと思っていました。
ただ、以下のような要件がでてきたので、単純な実装ではうまくいかなさそうな雰囲気に・・・

  • Googleから直近1週間のアクセスを取得してランキングにしたい
  • 直近1週間のPV数を表示したい
  • トップページでは1〜5位まで表示して、ランキング個別ページでは1〜20位まで表示したい
  • 1〜3位まではサムネイルを表示したい

当初はSimple GA Rankingの表示を少し調整すれば全般的に解決できそうな内容でしたが、このプラグインだとPV数を取得するような関数やフックが用意されておらず、プラグインの記述内容を調べてもPVに関しては取得できない仕様になっていました。(もしかしたらプラグインの内容を深く読み取れていない可能性もありますが)

他にも調べてみると、プラグインの組み合わせで実現できるという情報もあったのでGoogle Anaytics Post Pageviewsというプラグインも試したのですが、設定をしてみたもののうまく動作せず・・・

Google Anaytics Post Pageviewsに関してはGitHubからダウンロードするしか方法がないのと、かなり前からファイルの更新が止まっているのも少し不安だったので、PV数表示の部分はスクラッチでなんとかしようという結論にいたりました。

その他にもトップページと固定ページで反映されるランキングが微妙にずれるという事象が発生していたので、結果的になんだかんだAPI経由でカスタマイズしたことを書きたいと思います。
今回も長くなりそうなので、前編では軽くプラグインの説明と起きた現象の考察で、後編は実装した内容と説明を書いていきます。

Simple GA Rankingで人気ページランキングの表示

初期設定やGoogle AnalyticsとのAPI連携についてはプラグインの作成元のサイトこちらのページを参考に設定すれば問題なくできると思います。
後に紹介したページではGoogle Anaytics Post Pageviewsとの連携についても説明されていますが、今回作成した環境では動作せずだったので利用はしていません。

人気ページランキングの表示については作成元サイトの関数の案内に従ってsga_ranking_get_date()でページIDを配列で取得し、ページID分だけループさせるシンプルな方法です。(HTMLについては適当です。)
結果的にこの方法だと解決できない部分があったので、API連携のつなぎ以外利用しないということになりましたが・・・。

<?php
    $sga_options = get_option('sga_ranking_options');
    $ranking_params = [
      'display_count' => 5,
      'period' => $sga_options['period'],
      'post_type' => 'post,page',
      // 'force_update' => true,
    ];
    $ranking_data = sga_ranking_get_date($ranking_params);
    $ranking_number = 1;
    if( empty($ranking_data) ):
      echo '<p>現在利用できません。</p>';
    else:
      foreach( $ranking_data as $post_id ):
        $post_link = esc_url(get_permalink($post_id));
        $post_title = esc_html(get_the_title($post_id));
        $post_thumbnail_url = (has_post_thumbnail()) ? esc_url(get_the_post_thumbnail_url($post_id)) : '';
  ?>
  <article>
    <a href="<?php echo $post_link; ?>">
      <?php
        if( !empty($post_thumbnail_url) && $ranking_number <= 3 ):
      ?><div><img src="<?php echo $post_thumbnail_url; ?>" alt=""></div><?php
        endif;
      ?>
      <p>
        <span><?php echo $ranking_number; ?></span>
        <span><?php echo $post_title; ?></span>
      </p>
    </a>
  </article><?php
        $ranking_number++;
      endforeach;
    endif;
  ?>

パラメータのperiodについてはプラグイン内の lib > functions.php を見る限りは設定しなくても問題なさそうですが、念のため追加しています。
また、関数の内容を見ている限りではforce_updateというパラメータも設定できるのではと思います。

force_updateについてはキャッシュに保存されているを結果を強制的に上書きする感じの処理ですかね。
公式に書かれているパラメータではなかったのでほとんど検証はしていないですが、見た感じの処理としてはforce_updateにfalse以外の値がセットされているとAPIから結果を取得する処理が通るようになっていました。

ページによってランキングが微妙に異なる問題とPV数が取得できない問題

ここからが割と難問なのですが、まずトップページとランキング個別ページで表示される結果が異なる問題です。

プラグインの処理内容を見ている限りでは、単純にset_transientでランキングのページIDを保存していて、get_transientで呼び出しをしているように思っていました。

ただ、よく見ると lib > functions.php の55行目にある$transient_keyにセットされる文字列にdisplay_countの値が使われているようでした。

となると必然的にキャッシュされる内容も呼び出される内容も変わってしまうので、トップページとランキング個別ページでは微妙にタイムラグが出てしまうのではという結果に・・・
今思い返せばdisplay_countについてはget_optionから取得して、foreachのループ回数を制限すれば問題は発生しなかったのかなと思うので、同じ現象で困っている方は一応検証してみてはどうかと思います。

次にPV数が取得できない問題です。
実際にはmetricsの部分にga:pageviewsを設定しているので本来は取得したデータに含まれているのですが、後に続く処理を見るとページURLのみを結果データから抽出しているようでした。

ページURLを取得→URLからページIDを取得→ページIDを配列形式で返すというような処理になっているようで、誰でも扱いやすいようにしているのだと思うのですが、贅沢を言うならdimensionsなどのオプションも上書きできたり、取得結果そのものを取得できるような処理もあったらいいなと・・・
と思いつつ、せっかくここまで調べたので、自作のスクリプトで挑戦してみるのもありかなと思い今回のカスタマイズに至った次第です。

ちなみに、プラグインで利用されているGoogle APIのクライアントはvendor > google > apiclient > composer.jsonから確認できましたが、かなり古い(なんと1.1.x系・・・)のでそのうち利用できなくなる可能性は高いです。
いちおう2.x系の連携も試してみたのですが、プラグインで保存していたトークンがおかしくなってしまい、力及ばずだったので断念しました。

まとめ

Simple GA Ranking自体はGoogleの解析に基づいた正確なランキングを手早く実装できるので、非常にいいプラグインだとい思います。
ただ、どうしてもブラックボックスな部分が多くなってしまうので、バグやかゆいところに手が届かない部分が発生した際にはドキュメントにはない項目を探して対応したり、結局はスクラッチで対応しなければいけない部分があるなと感じたので、一長一短なところはあるかなと思いました。

とはいえ、まだまだプラグインのお世話になっている部分(特にカスタムフィールド系)が多く、難しい要件やカスタマイズを実現するには必要不可欠な存在なので、もっと勉強して自力で解決できるよう努力しないといけませんね。

とりあえず今回の場合は処理を読んでいけば解決できそうな感じだったので、後編でGoogle APIを扱うのに必要な情報やデータ取得についての説明を書きたいと思います。

関連記事