【WordPressのTransientsが便利でした】twitter apiとか使用回数制限があるデータを一時保存する方法

このブログにもソーシャルボタンをつけているんですけど、twitter,facebook,google+と、ボタンを押された数をプレーンテキストで取得したいな~なんて思っていまして、気になっていました。

最近海外のサイトとかでよく見かけていて、どうやっているんだろうな~なんて思っていたのですが、やりかたはそんなに難しくなくて、twitter,facebook,google+とそれぞれのapiを使用してjson形式で値を取得、それを加工してプレーンテキストを取得、といった流れになります。

ただし、各SNSサービスのapiの使用回数制限っていうのがあるんで、ちょっと気をつけないとうまく取得できません。そこで、「Transients」を利用します。ちょっと例を交えて、私がやっていることをご紹介いたしますね。

Twitterを例にしてやります

twiterの場合を例としますよ。

まずは使用回数制限について、理解をした方が後々苦労せずにすむと思います。下記twitterの公式サイトを部分的に引用させていただきますね。

Twitter リミットについて (投稿、API、ダイレクトメッセージ、フォロー)

Twitterリミットがあることにより、Twitterサービスに負荷がかかりすぎないようにし、

ダウンタイムやエラーを減らすことができます。

Twitter では信頼性を維持するため、フォロー、APIリクエスト、ダイレクトメッセージ、

投稿などのアカウント毎の操作において Twitterリミットを設けています。

リミットがあると。なるほどです。

現在の、アカウント毎の技術的なリミットは以下の通りです。

ダイレクトメッセージ: 250件/1日

APIリクエスト: 150件/1時間

投稿: 1000件/1日

アカウント設定の変更: 4件/1時間

フォロー (一日): 技術的なフォローリミットは1000件/1日です。

フォロー (アカウント毎): 2000件を超えるフォローはアカウント毎の特定の基準で制限されます。

このように、twitterのサービスに負荷をかけすぎないように、制限(リミット)があるんですね。

(上記は記事公開日当時の仕様です。現在は微妙に変わってるかもですので、そこはご確認くださいませ)

apiの残り回数を確認するには・・・

こちらのURLでtwitter APIの使用回数を確認できます。

https://twitter.com/account/rate_limit_status.xml

例えば、

<remaining-hits type="integer">146</remaining-hits>

となっていれば、残り使用回数は146回/1h となります。

これは、時間が経過したら150回にリセットされます。

Twitterのツイート数をプレーンテキストで取得します

ではでは実例を・・・apiを使って、僕のtwitterアカウントのツイート数を取得します。アカウント名は「s56bouya」ですよ。

【PHPコード】

<?php

function get_twitter_statuses() {
 $json = wp_remote_get("http://api.twitter.com/1/users/show.json?screen_name=s56bouya");
 if(is_wp_error($json))
  return false;
 $twitterdata = json_decode($json['body'], true);
 return intval($twitterdata['statuses_count']);
}
echo get_twitter_statuses();
?>

これで僕が今までツイートした数を取得できます。上のコードは、あくまでJSONデータを取得できるだけです。

この次が重要ですよ。

ここで「Transient」を使うときが来ます

twitterのapiの使用回数は1時間に150回なので、この制限を超えるとデータが取得できなくなります。ですのでapiで取得したデータは、他のサイトの実装例を見ても、取得したデータをデータベースに一時保存(キャッシュ)しておいて、定期的に値をリフレッシュするのが主流のようです。というわけで、「Transient」を使ってコードをちょっと変更。

【PHPコード】

<?php

if ( false === ( $value = get_transient( 'tweet_trans' ) ) ) {
// Transient データがなかったら、twitter apiからツイート数のデータを取得して保存
 $json = wp_remote_get( "http://api.twitter.com/1/users/show.json?screen_name=s56bouya" );
 if( is_wp_error( $json ) )
  return false;

 //JSON文字列をデコード
 $twitterdata = json_decode( $json['body'], true );

 //JSON形式のデータからツイート数を取得
 $value = intval( $twitterdata['statuses_count'] );

 //transient にツイート数のデータを4時間保存
 set_transient( $tweet_trans, $value, 60 * 60 * 4 );
}

//transient 保存してあるツイート数を取得
echo get_transient('tweet_trans');

?>

ちなみに、

http://wpdocs.sourceforge.jp/Transients_API

を参考にさせていただきました。「Transients」について詳しく書かれています。

応用するとこんなことができます

これを応用していろいろやった結果が、このブログの右上にあるやつです。

【それぞれフォロワー、ファン、+1の値を表示させました】

こういうのよく見ますよね~。増えて嬉しい、減って悲しい数字ですね・・・減ったのを見た瞬間は、なんか、あ・・・ってなります^^;

rssfeedを登録していただいている方の数も取得できるんですが、feedburnerのapiがちょっと不安定なのかな・・・うまくできないときがあるので、今回はrssfeedへのリンクをつけました。たまに読んでやってもいいぞ、という方は是非是非!(feedlyで購読をされる方はこちらをご登録お願いします!)

というわけで、twitter,facebook,google+のapiを使用する回数を制御したい方や、Transients APIの使用例(サンプル)などをお探しの方などにご参考いただければ幸いです。

著者:bouya Imamura