Simple GA RankingでWordPressに人気記事を表示
2015/06/12
ブログの宿命として、古い記事はなかなかアクセスしにくい所に追いやられてしまいます。
検索エンジンもクロールしにくくなり、昔は上位表示された記事もそのうち検索順位も落ちてしまうかもしれません。
昔書いた記事を風化させないように、当ブログではサイドバーに人気記事を表示することにしました。
人気記事を表示させるにあたって検討した項目は以下です。
- 使っているテーマにあうよう、なるべく自由に表示をカスタマイズできる
- あまり重くない(Google Analyticsやデータベースへのアクセスは最小限)
- なるべく簡単にできること
最初は有名なWordPress Popular Postを少し使ってみました。カスタマイズ性もそこそこ高いのですが、関数の引数にパラメーターとしてリストの開始タグや終了タグ、サムネイルの有無やサイズ等々を渡して、HTMLを出力するという方式がどうも気に入らず。
Google Analytics APIを使って取得する方法も見つけました。が、毎回Analytics APIにアクセスして表示させるならともかく、一日一回キャッシュして、それを表示させるのはちょっと大変そうなのでパス。
そこで見つけたのがSimple GA Rankingです。
Simple GA Ranking
Google Analytics のデータをもとに、記事のランキングを取得できます。
ショートコードで記事をリストで出力することもできますし、記事のpost idを取得してそれを使って自分で好きなように表示をカスタマイズすることもできます。
さらにWordPressのTransient APIを使って、キャッシュまでしてくれます。
時間のかかる、Google Analyticsへの問い合わせは24時間に1度だけですみます。
Google Analytics APIには1日のアクセス数制限がありますが、それも気にする必要がなくなります。
注意点としてはPHP5.4以上でないとGoogle AnalyticsのOAuth用のプラグインが動かないようです。
PHP5.3以下を使っている場合はPHPのアップグレード、もしくはプラグインの編集が必要になります。
Simple GA Rankingの設定
Simple GA Rankingの設定自体はその名の通り、シンプルです。
ランキングを集計する日数と表示数を設定するだけです。
ですが、Google Analytics APIとの連携が少し分かりにくい(というか説明が無い)ので、ご紹介しようと思います。
Google Analytics APIとの連携
Analytics APIとの連携は設定メニューの「Analytics設定」から行います。
この画面のコールバックURLを設定した、クライアントIDとコンシューマーシークレットをGoogle Developersから取得する必要があります。
Google Developersでアカウントを作成し、Google Developers Consoleで、新規プロジェクトを作成します。
「APIと認証」の「API」からAnalytics APIを検索し、有効にします。
「APIと認証」の「認証」からOAuthの新しいクライアントIDを作成します。
ウェブアプリケーションを選択し、同意画面を設定します。
同意画面は認証の際に、自分に表示される画面なので、サービス名のみ適当に入力しておきます。
承認済みのリダイレクトURLのところに、「Analytics設定」メニューのコールバックURLを入力します。
これでクライアントIDとクライアント(コンシュマー)シークレットが作成されました。
この2つを「Analytics設定」メニューに入力し、トークンを取得します。
以上でGoogle Analyticsとの連携は終了です。
これでSimple GA Rankingを使って人気記事のランキングを取得できます。
Simple GA Rankingを使用した人気記事の表示
あとはsga_ranking_get_dateを使用して、ランキングを取得します。
(今気づきましたが、get_dataではなくget_dateなんですね。)
例えば、Stingerの新着記事と同じフォーマットにするには以下のようなPHPを作成します。
<div id="kanren"> <?php if (function_exists('sga_ranking_get_date')) $ranking = sga_ranking_get_date(); else $ranking = array(824,26,52,488,23); $args = array( 'post__in' => $ranking, 'posts_per_page' => 5, 'orderby' => 'post__in'); $my_query = new WP_Query($args); if($my_query->have_posts()): while ($my_query->have_posts()) : $my_query->the_post(); ?> <dl class="clearfix"> <dt><a href="<?php the_permalink() ?>" > <?php if ( has_post_thumbnail() ): // サムネイルを持っているときの処理 ?> <?php the_post_thumbnail( 'thumb150' ,array( 'alt' =>get_the_title())); ?> <?php else: // サムネイルを持っていないときの処理 ?> <img src="<?php echo get_template_directory_uri(); ?>/images/no-img.png" alt="<?php the_title(); ?>" width="100" height="100" /> <?php endif; ?> </a> </dt> <dd> <h5><a href="<?php the_permalink(); ?>"> <?php the_title(); ?> </a></h5> <div class="smanone"> <?php the_excerpt(); //スマートフォンには表示しない抜粋文 ?> </div> </dd> </dl> <?php endwhile; endif; ?> <?php wp_reset_postdata(); ?> </div>
簡単に解説すると、
<?php if (function_exists('sga_ranking_get_date')) $ranking = sga_ranking_get_date(); else $ranking = array(824,26,52,488,23);
でランキングを取得。
プラグインがオフになっていたりして、Simple GA Rankingが使用できない場合は、表示させたいpost idを使用しています。
$args = array( 'post__in' => $ranking, 'posts_per_page' => 5, 'orderby' => 'post__in'); $my_query = new WP_Query($args);
でランキングの順に記事を取得します。
ループで記事を毎回取得するのではなく、データベースのアクセスを減らすため、記事取得は一回のqueryで行った方がよいです。
まとめ
以上でSimple GA Rankingを使用して、人気記事の表示ができます。
当ブログではトップページの1ページ目は新着記事の替わりに、それ以外には新着記事の下に表示させることにしました。
テーマに合わせて人気記事を表示させたい場合には、動作も軽く、導入も比較的簡単なのでお勧めです。
Comment
いきなりコメントすいません!Stinger 5を使っていてこちらのPHPを拝借させて頂きました。ありがとうございます。
Simple GA Rankingを使って人気記事を表示させる際に「週間」や「日にちごと」に表示させるにはどう書き足せば可能なのでしょうか。
ご返事お待ちしております!
コメントありがとうございます。
集計期間を変更するのは、プラグインの設定画面からできますよ。
メニューの設定->Simple GA Rankingの「本日から何日前までのランキングを表示させるか」のところをかえてみてください。
また以下のように、phpでランキング取得の際にパラメータを渡せば、月間、週刊などの違う期間のランキングをとることも可能です。
$ranking = sga_ranking_get_date() //default
$ranking = sga_ranking_get_date(array('period' => 7)) //weekly
$ranking = sga_ranking_get_date(array('period' => 1)) //daily
ありがとうございます。設定からできるのですね!!
いきなりの質問で失礼いたします。最近ですがSimple GA Rankingを使用しております。
このプラグインでの、PV数の取得は可能なのでしょうか?
コメントありがとうございます。
残念ながら、現状このプラグインではpv数の取得はできないようです。
始めまして。
WordPress Popular Postプラグインを利用していましたが、重いのでsimpleGaRankingへ乗り換えを行っています。
人気記事はこの記事を参考に設定出来ましたが、カテゴリー毎の設定の仕方が解らないので、教えて頂けると幸いです。
宜しくお願い致します。
モカさん、コメントありがとうございます。
カテゴリ毎のランキングは、category__inというパラメータを渡すことで取得できます。
例えば
sga_ranking_get_date(array('category__in' => 'wordpress'))
とすれば、wordpressというslugのカテゴリのランキングが取得できます。
ご回答有難うございます。
何度も申し訳ございませんが、引き続きご教授頂けますと助かります。
上記ページでご紹介いただいています内容の以下を修正してみましたが、
表示している同一カテゴリー外の記事が表示されてしまいます。
$ranking = sga_ranking_get_date();
⇒$ranking = sga_ranking_get_date(array(‘category__in’ => ‘wordpress’));
もし、ご迷惑でなければメール等でやりとりさせて頂けますと助かります。
(コメントフォームにアドレス入れさせて頂きました)
宜しくお願い致します。