Analyticsのデータと同期してランキングを表示させることができるようになるWordPressのプラグインです。Ranking今回はバージョン2.1.6利用時に起きた、ランキングが突然表示されなくなった不具合についての対応をメモします。Rankingのメリット・デメリットについても触れておきます。APIという簡単なキャッシュ機構を使ってDBに一時保存することで、負荷も少なく軽快に正確なランキングを表示できる、というものです。Posts」というものがあります。こちらも手軽に人気記事ランキングを作ることができるのですが、仕組み的にサーバー負荷の問題があり、アクセスする度にDBにアクセス数を書き込む処理が走るので、アクセス数が多くなるほど負荷が大きくなりページの表示速度が落ちます。Ranking」は基本的にAPIからデータを取得するだけで、アクセス数を毎回DBに書き込む処理はありません。APIから取得した情報を任意の期間キャッシュできるので、余計なリクエストもありません。1日1回更新したとしても月30アクセス程度なのでAPIの利用制限に引っかかることもないと思います。APIのfilterパラメータを使うことができるので、カスタムディメンションを使って集計した複雑な条件のデータを取得することも可能です。Ranking」を選びます。Rankingのデメリットバージョンアップの度に不具合が起きることも多いので、突然表示されなくなったり、エラーメッセージが出て来たりと何かと問題が多いプラグインでもあります。これが最も厄介なところです。毎回更新時に何か起きたら、Githubリポジトリを見に行って更新箇所を確認して、コードを覗いて地道に不具合の特定をしています。Twitterでも、新しいアップデートがある度に「アップデートすると表示されなくなった」「致命的なエラーが出てサイトがバグった」などの報告が上がっています。サイトによって環境差がありますし、そもそも導入手順をミスっている方も中にはいるでしょう。そのため一概にプラグインのアップデートだけが悪いとは言えませんし、後述しますが今回遭遇した問題もプラグインだけの問題ではありませんでした。ピンポイントでここが悪いとは言い切れるようなデメリットはありませんが、ただ全体的な所感として、便利だが少し扱いが難しいというところがデメリットになるかなと思います。バージョン2.1.6で表示されないここからが本題です。2.1系になってからいくつか不具合が続いているみたいですが、2.1.6にバージョンアップしてから、特定のブログだけ人気記事が表示されなくなってしまいました。人気記事が表示されるブログと表示されないブログが出ている状況。そこでプラグイン内を調べてみました。GAとのOAuth認証は問題ない。GAのデータもちゃんと取得できてる。sga_ranking_get_date()の戻り値は空の配列。通常はランキングに含まれる投稿ページのIDが1位から順番に配列で返ってくるはずが、空の配列。GAのデータが取れているのにIDが返って来ないということは、プラグイン内のPHPの処理の問題があるということがここでわかりました。コードを詳しく調べていくと、どうやらプラグイン内で使っているsga_ranking_url_to_postid()という関数の戻り値がおかしいことがわかりました。取得したGAのデータURLをWordPressの投稿IDに変換する部分です。);この部分で返ってくるIDの値がおかしい。引数のURLはGAから取得したものなので間違えていません。ここではフィルターフックが使えないので直接編集して下記のように変更。);url_to_postid()関数は、URLから投稿記事のIDを取得するWordPressの関数です。APIのキャッシュをクリアすると・・・表示されました!!sga_ranking_url_to_postid()という関数は、どうやらURLから記事のIDを取得するプラグイン独自の関数なのですが、表示されなくなった環境ではうまく処理できていないみたいでした。・・・でも、ランキングがちゃんと表示されてる記事もあるし、今まで表示されていたのになぜ?AMPの作り方に問題があったランキングが表示されなくなったブログはAMP対応しているのですが、かなり前にプラグインは使わず独自対応したもので、URLの末尾に?amp=1といったパラメータが付く仕様にしていました。そのためGAでも末尾に?amp=1が付いたURLでアクセスが記録されています。ランキングが表示されているブログでは、そもそもAMPページを作っていないか、作っている場合はURLの末尾に/amp/が付く様にしていて、GAでは末尾に/amp/が付いたURLでアクセスが記録されています。調べると?amp=1となっているブログ記事に限っては、sga_ranking_url_to_postid()という関数の戻り値が、投稿ページではなく関係のない別の固定ページのIDが戻り値で返ってきていました。投稿ページがパラメータ付きURLの場合に処理がうまくいってないっぽい。ブログ記事のランキングを表示させたいだけだったので、URLから投稿ページのIDを取得できるWPの関数url_to_postid()に書き換えて対処しました。url_to_postid()は投稿・固定記事のIDしか取得できません。ランキングにカテゴリーページやタグページなどが含まれている場合は、また別の処理に置き換えるか、sga_ranking_url_to_postid()関数の中身を調べて根本的な部分を修正する必要がありそうです。今回不具合が起きたサイトでは投稿ページのランキングしか必要なかったため、そこまでの対応しませんでした。この時点で解決したので、今まで表示されていたのに急に表示されなくなった理由に関してはわかりませんでした。API側ではなくPHPコード側の問題なので、Githubでバージョンを遡って調べていけば何かしら理由はわかると思いますが、今回はひとまず解決したので保留としました。Rankingが表示されなくなった時に自己解決した方法について書きました。結果的に特定の環境で起きたことだったため、プラグイン側の原因だけでなくWordPressの作り方も含めて複合的な原因が起こした不具合となりました。Rankingに限らず、プラグインを使う時はある程度その中身を把握しておいた方が、不具合が起きた時に対処しやすいです。サイトによってWordPressの環境や他のプラグインとの競合など調べる点が変わってくるので、同じような不具合の対処法を検索してあれやこれやと試すよりも、根本的な原因を探すためにコードを読むことが1番近道ですね。