2014年06月17日(Tue)
WordPressの記事一覧で投稿毎に表示するSNSのカウント数を「Transients API」を利用して保存する方法
前回、各SNSサイトのAPIを利用してカウント数を取得し表示するところまでは出来たのですが、表示速度に問題があったので取得したデータを「Transients API」を利用して保存する対策を考えました。
WordPress Transients API について
データに名前と有効期限を設定して、データベース内に保存するWordPressで用意されている関数です。
保存先は、MySQLデータベースのwp_optionsという名前のテーブルに保存されます。
指定した有効期限を過ぎると勝手に削除されるみたいです。
TransientsApi
//データを保存 set_transient(データ名, データ, 有効期間(秒数指定); //データの取得 get_transient(データ名); //データを削除 delete_transient(データ名);
TransientsApiを使ってみる
SNSカウント数の取得は、2パターン用意しましたが今回は、SharedCountを利用した方法で進めていきます。
やりたい事は、各SNSのカウント数を取得し配列変数に格納して、そのまま保存し呼び出して使うという流れです。
取得したSNSのカウント数をTransientsApiを利用して保存
//SharedCountを利用して取得する方法 function shared_count(){ //transientデータの取得:データが無い場合は処理実行 if(false === ($cnt = get_transient('sns_cnt_' . get_the_ID()))){ //sharedcount $json = file_get_contents('http://api.sharedcount.com/?url='.get_the_permalink()); $counts = json_decode($json, true); $cnt = array( "tw" => $counts["Twitter"], "fb" => $counts["Facebook"]["total_count"], "gp" => $counts["GooglePlusOne"] ); //Hatena $hb_url = 'http://api.b.st-hatena.com/entry.count?url='.get_the_permalink(); $cnt["hb"] = file_get_contents($hb_url) ? file_get_contents($hb_url) : 0; //データの保存(有効期限:6時間) set_transient('sns_cnt_' . get_the_ID(), $cnt, 60 * 60 * 6); } //返り値 return $cnt; }
TransientsApiを使ってみた結果
実際に取得したデータを保持して使ってみると、APIから直接取得して表示するのに比べ圧倒的に早いですね!
ストレスを感じることなく表示されます
ただ、最初に保存するときはAPIから取得する事には変わりは無く保存する手間が増えた分、更に遅くなる可能性もあります。
なので、次にAPIからデータを取得する時間をどうにかして短縮できないか色々考え試してみました。
TransientsApiを使って色々試し分かった事
色々試していて分かったのですが、どうやら既に保存されているデータと同じ名前で保存すると上書きされるようです。 それを踏まえて以下の対策を考えだしました。
- SNSで取得したデータは1週間保存
- 投稿一覧とシングルページの両方でデータを取得
- シングルページで取得する場合は、既に保存されているデータが1日より古い場合はSNSからデータを取得し上書き保存
上記は、取得するタイミングを少しでもずらし負担を分散させることにより表示速度が改善されるのが狙いです。
データの保存期間は、そんなにカウント数が増える事もないし、取得するタイミングをずらす時間を稼ぐためにも1週間という長めの期間に設定しています。
そのため、シングルページでは1日以上経っていたら更新する設定になっています。
なので、よくアクセスがあるページは、投稿一覧でも常に最新のカウント数が表示されるようにと考えました。
functions.php に追記
//sharedcountを使った場合 function sns_count($date){ //transientデータが無い場合 又は 時間が指定されていて指定された時間より古い場合 if(false === ($cnt = get_transient('sns_cnt_' . get_the_ID())) || ($date && $cnt["date"] < strtotime($date))){ //sharedcount if($json = @file_get_contents('http://api.sharedcount.com/?url='.get_the_permalink())){ $counts = json_decode($json, true); $cnt = array( "tw" => $counts["Twitter"], "fb" => $counts["Facebook"]["total_count"], "gp" => $counts["GooglePlusOne"], "date" => time() ); //Hatena $hb_url = 'http://api.b.st-hatena.com/entry.count?url='.get_the_permalink(); $cnt["hb"] = @file_get_contents($hb_url) ? @file_get_contents($hb_url) : 0; //データの保存(有効期限:7日) set_transient('sns_cnt_' . get_the_ID(), $cnt, 60 * 60 * 24 * 7); } } //返り値 return $cnt; }
投稿一覧の表示したい箇所へ記述
//SNSカウント数の取得 $cnt = sns_count(""); //配列変数の確認 if(is_array($cnt)){ //配列変数から削除 unset($cnt["date"]); ループ処理 foreach($cnt as $key => $val){ echo '<div class="'.$key.'">'.$val.'</div>'; } }
シングルページ用ヘッダーに記述
<?php sns_count("-1 days"); ?>
自分は、シングルページ用ヘッダーの一番上に記述しました。
時間の指定方法は、phpのstrtotime関数を使っています。
「SNSのカウント数を表示」についてのまとめ
ソーシャルボタンの貼り付けの様に簡単にすぐ終わると思っていたのですが、思いっきり手こずりました…
カウント表示が遅くてもjQueryを使ったりJetpackの共有ボタンをカスタマイズした方が楽かもしれませんね。
今回は「WEBフォントを使ったアイコン表示」や「WordPress Transients API」について勉強できたのが収穫です。
次は、Jetpackを使ってSNSボタンを表示させる方法を色々試したいと思います。
補足
今回、取得時間をカウント数を格納する配列関数にdateという形で加えていますが、データベースをよく見てみるとカウント数が保存されている「_transient_保存名」というレコードの他にもう一つ「_transient_timeout_保存名」というレコードがあり有効期限のタイムスタンプが保存されていました。
【参考Webサイト】
コメント(0件)
WordPressの記事一覧で投稿毎に表示するSNSのカウント数を「Transients API」を利用して保存する方法に対するご意見、ご感想、情報提供など皆様からのコメントをお待ちしております。 お気軽にコメントしてください。
コメントフォーム