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

関連タグ:

公開日:

最終更新日:

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

前編に引き続いてSimple GA Rankingをカスタマイズした話です。
PV数についてはプラグインでは取得できないので、具体的な解決策について書いていこうと思います。

ページごとに異なるランキングが表示される件についてはおそらく設定だけでも何とかなりそうですが、今回のカスタマイズ内容で設定を変更することなく解決可能です。

実装した当時の環境と必要なものとしては以下です。
composerについてはインストールしていなくても問題はないですが、もし2.x系に更新するとなった場合は再度githubからダウンロードして更新・・・と少し手間になるので、これを機にインストールして利用するのもありかと思います。

  • PHP 7.4
  • WordPress 5.8
  • Simple GA Ranking API連携設定済み(実装時のバージョンは2.1.6)
  • composer 2.x(1.x系でも問題ないと思いますがアップデート推奨)

追記(2023/06 時点)
Simple GA Rankingの公式サイトは閉鎖になったようです。
次回以降に書きますが「Simple GA4 Ranking」へ移行を推奨します。

PHP用のGoolgleAPIライブラリをcomposerで取得する

composerをインストールしている前提として進めます。
composerを利用しない場合でもこちらに提示されている方法で利用が開始できるみたいです。

ちなみに、Simple GA Rankingの内部ではまた別のライブラリが利用されていて、「GapiWP」というものが利用されていました。
こちらのライブラリが管理画面のAPI連携画面を生成し、その設定を保存するような処理を担っているようです。

GapiWPで利用しているGoogleAPIライブラリが1.1.x系となっているので、それを元にcomposer.jsonを設定します。

{
  "require": {
    "google/apiclient": "1.1.*"
  },
  "scripts": {
    "pre-autoload-dump": "Google\\Task\\Composer::cleanup"
  },
  "extra": {
    "google/apiclient-services": [
      "Analytics"
    ]
  }
}

requireについては取得するライブラリのバージョンを指定するだけなので特に問題ないと思いますが、あとに続くscriptsとextraについては、リポジトリのREADME.mdを参考に設定を追加します。

指定をしなくても大きな問題というのはないですが、API連携できるサービスはanalytics以外にもかなりの数があるので、ファイル数が肥大化します。

その対策として、必要なサービスのみをextraに記述して不要なファイルを含まないように設定できるようです。
実際に私が確認した際は”Analytics”のみで動作したので、おそらく上記の指定で問題ないかと思います。

追記
上記のextraの設定については2.x系から追加されているようで、1.1.xでは関係なさそうでした。(src/Google/Service 以下を見てみると全サービスのファイルがあるような・・・となりました。)

どのようにデータを取得しているのか確認

では実際にコードを記述していきます。
本来であれば公式のチュートリアルがあるので、こちらを参考に記述していけば問題はないですが、現在はバージョンが1.x系のものはないようです。

情報がないものは仕方ないので、GapiWPからAPI認証やAnalyticsのデータ取得の処理を確認してみます。
まずは「simple-ga-ranking\functions.php」をみると「sga_ranking_get_date」の処理内容が書いてあり、これ自体の処理はただ「sga_ranking_ids」を返しているだけですね。

肝心の「sga_ranking_ids」の処理を見ると、上の方はほとんど引数のオプションを判定・代入したりといったところでしょうか。
どこでGAから情報を取得しているかというと「$simple_ga_ranking = \Hametuha\GapiWP\Loader::analytics();」のあたりからです。

「simple-ga-ranking\vendor\hametuha\gapiwp\src\Hametuha\GapiWP\Loader.php」など・・・長々と書くことになるので省略しますが、見ている限りは単純に「simple-ga-ranking\vendor\hametuha\gapiwp\src\Hametuha\GapiWP\Service\Analytics.php」に記述されている「Analytics」クラスを生成していると思われます。

次に続く「$simple_ga_ranking->fetch()」でGAアカウントとの連携→GAのデータを取得するサイト別のIDを設定→取得した結果を返すという処理をしているようです。
このクラス内に書いてある「$this->ga」や「$this->client」は存在しないように思いますが、マジックメソッドの「__get」によって解決されているみたいですね。(勉強不足ゆえ理解するまでに少々手こずりました。)

それぞれ処理をたどってみましたが、結果的に必要になるのは「__get」に書いてある「case ‘client’」と「case ‘ga’」の部分で、他はプラグインの処理を事前にはさんで、面倒な部分は省略できそうな感じではないかと想定して進めました。
面倒な処理が何かというと、APIを利用する際の認証トークンを更新しているようで処理も別に長くないのですが、「sga_ranking_get_date」の関数をはさむことで解決できるならあえて書く必要もないのかなと思い省略しました。

データを取得するスクリプトを作成

といっても難しいものではなく、基本的に処理内容をコピペして少し書き換える程度のものです。
ただ、先ほど書いたように面倒な部分やあまり理解が及んでいない部分もかなりありますが、最終的にこのような内容になりました。

実際に私が書いたものは異なりますが、処理内容としてはほぼ変わりません。(ファイルを分けたり、関数化したり程度です。)
「$ranking_data」には配列でデータが返り、その中に連想配列で「url => URL, title => 実際のページのtitleタグにあたる部分, pv => PV数」となっています。

引数などのオプション部分やHTMLなどはご自身の環境に合わせて更新してください。

<?php
  $sga_options = get_option('sga_ranking_options');
  $ranking_params = [
    'display_count' => $sga_options['display_count'],
    'period' => $sga_options['period'],
  ];
  $ranking_data = sga_ranking_get_date($ranking_params);
  // ランキングの返りが空配列の場合
  if( empty($ranking_data) ):
    echo 'データがありません。';
  else:
    // composerでinstallしたライブラリを読み込み(ディレクトリは環境に合わせて変更してください。)
    require_once(dirname(__FILE__) . '/vendor/autoload.php');
    // simple ga rankingの認証情報を流用して接続
    try{
      $g_client = new Google_Client();
      $g_client->setClientId(get_option('gapiwp_key'));
      $g_client->setClientSecret(get_option('gapiwp_secret'));
      $g_client->setScopes([
        'https://www.googleapis.com/auth/analytics.readonly'
      ]);
      $g_client->setAccessType('offline');
      $g_view_id = get_option('gapiwp_view_id');
    }catch ( Exception $error ){
      echo 'Google_Clientに接続できませんでした。';
    }
    // 認証情報にエラーがなければanalyticsに接続
    try{
      if( get_option('gapiwp_token') && $g_client && empty($g_analytics) ){
        $g_client->setAccessToken(get_option('gapiwp_token'));
        $g_analytics = new Google_Service_Analytics($g_client);
      }
    }catch ( Exception $error ){
      echo 'Google_Service_Analyticsに接続できませんでした。';
    }
    // anayticsにエラーがなければデータ取得
    if( !empty($g_view_id) && !empty($g_analytics) ){
      $g_date_now = date('Y-m-d H:i:s');
      $g_date_format = 'Y-m-d';
      $g_date_end = date($g_date_format);
      $g_date_start = strtotime($g_date_end . ' -' . $sga_options['period'] . 'day');
      $sga_options['start_date'] = date($g_date_format, $g_date_start);
      $sga_options['end_date'] = $g_date_end;
      $ga_args = [
        'start-index' => 1,
        'max-results' => $sga_options['display_count'],
        'dimensions' => 'ga:pagePath,ga:pageTitle',
        'sort' => '-ga:pageviews',
        'filters' => 'ga:pagePath!=/;ga:pagePath!@preview_id',
      ];
      $g_results = $g_analytics->data_ga->get(
        'ga:'.$g_view_id,
        $sga_options['start_date'],
        $sga_options['end_date'],
        'ga:pageviews',
        $ga_args
      );
      // ランキングデータの初期化
      $ranking_data = [];
      if( !empty($g_results['rows']) ){
        foreach( $g_results['rows'] as $g_result ){
          $url = $g_result[0];
          $title = $g_result[1];
          $pv = $g_result[2];
          $ranking_data[] = [
              'url' => $url,
              'title' => $title,
              'pv' => $pv,
            ];
        }
      }
    }
    foreach( $ranking_data as $ranking_key => $data ):
      $url_exp = explode('?', $data['url']);
      // 必要であればURLを置換して「url_to_postid」で投稿IDを取得できる形式に修正
      // $data['url'] = str_replace('', '', $url_exp[0]);
      $data['url'] = esc_url(home_url().'/'.$data['url']);
      // URLから投稿IDを取得する(取得できない場合は 0 になる)
      $ranking_id = url_to_postid($data['url']);
      if( !empty($url_exp[1]) ):
        $data['url'] = $data['url'].'?'.$url_exp[1];
      endif;
      //投稿IDが取得できている場合はタグ, カテゴリ, サムネイルなども取得可能です。(下記はデフォルトのタグの取得)
      $post_tags = get_the_terms($ranking_id, 'post_tag');
?>
  <article class="c-card">
    <div class="c-card__inner">
      <a href="<?php echo $data['url']; ?>" class="c-card__title"><?php echo $data['title']; ?></a>
      <?php
        if( !empty($post_tags) ):
      ?><div class="c-list"><?php
          foreach( $post_tags as $post_tag ):
            $add_query = [
              'tag' => $post_tag->slug,
              's' => 'tag_search',
            ];
      ?>
        <a href="<?php echo esc_url(add_query_arg($add_query, ROOT.'/')); ?>" class="c-list_item"><?php
          echo (!empty($post_tags)) ? esc_html($post_tag->name) : '';
        ?></a><?php
          endforeach;
      ?>
      </div><?php
        endif;
      ?>
    </div>
    <div class="c-card__pv">
      <p class="c-card__pv_num"><?php echo $data['pv']; ?> view</p>
    </div>
  </article><?php
    endforeach;
  endif;
?>

追記
これまた書いていた後に気づいたので追記です・・・。
Simple GA Rankingのプラグインを読み込んだ時点で「simple-ga-ranking\simple-ga-ranking.php」もすでに読み込んでいると思いますが、「GapiWP」がautoloadで読まれているので、そもそも最初に書いたcomposerでの作業はいらないのでは?と思いました。

まとめにも追記していますが、結局次のプラグインに移行を検討した形になったので、上のコードはちょっと信憑性にかける可能性がありそうです。(といっても実際に書いたコードかつ問題なく動いていたようなので、動作は問題ないはずですが・・・)

まとめ

冒頭の追記にもありますが、実はこの記事を書いている時点でGA4対応によってプラグインがリニューアルしたようです。
次世代の「Simple GA4 Ranking」ではPV数が標準で取得できるようになっているみたいです。

まだ試している段階なので何とも言えませんが、プラグインの処理内容を確認した限りでは「sga_ranking_ids」に引数が追加されていて、返される値にPV数が追加されるような内容でした。

というわけでこの記事の内容もかなり限定的なものになってしまいましたが・・・。
何かのお役に立てば幸いです。

関連記事