2015年01月23日(Fri)

SNSのカウント数をPHPで取得し表示させる方法
今年からSharedCountのAPIが使えなくなったので、取得したい各SNSで用意しているAPIから自分で取得する事にしました。 今までのSharedCountバージョンと違って一覧時に取得するのは表示速度に影響が出そうなので各投稿ページで取得して保存し投稿一覧で表示する仕様に変更しました。
各SNSごとにカウント数を取得する関数を作成
GooglePlusに関しては、前回と違うCURL(カール)を利用した方法があるようなので参考サイト様の真似をさせて頂きました。 気になったのはAPIキーなのですが、意味は分かりませんが皆さんがAIzaSyCKSbrvQasunBoV16zDH9R33D88CeLr9gQと言う固定キーを使用しているそうです。
GooglePlus/function.php
//GooglePlus
function gp_cnt(){
//取得するURL
$url = get_the_permalink();
//CURLを利用してJSONデータを取得
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, "https://clients6.google.com/rpc?key=AIzaSyCKSbrvQasunBoV16zDH9R33D88CeLr9gQ" );
curl_setopt( $ch, CURLOPT_POST, 1 );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $ch, CURLOPT_POSTFIELDS, '[{"method":"pos.plusones.get","id":"p","params":{"nolog":true,"id":"' . $url . '","source":"widget","userId":"@viewer","groupId":"@self"},"jsonrpc":"2.0","key":"p","apiVersion":"v1"}]' );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_HTTPHEADER, array( 'Content-type: application/json' ) );
$result = curl_exec( $ch );
curl_close( $ch );
//JSONデータからカウント数を取得
$obj = json_decode( $result, true );
//カウント(データが存在しない場合は0扱い)
if(!isset($obj[0]['result']['metadata']['globalCounts']['count'])){
$cnt = 0;
}else{
$cnt = $obj[0]['result']['metadata']['globalCounts']['count'];
}
//返す値
return $cnt;
}
Facebook/function.php
//Facebook
function fb_cnt(){
//チェックするURL
$url = get_the_permalink();
//JSONデータを取得
$json = @file_get_contents("http://graph.facebook.com/?id=".rawurlencode($url));
//JSONデータを連想配列に直す
$array = json_decode($json,true);
//カウント(プロパティが存在しない場合は0扱い)
$cnt = $array["shares"] ? $array["shares"] : 0;
//返す値
return $cnt;
}
Twitter/function.php
//Twitter
function tw_cnt(){
//チェックするURL
$url = get_the_permalink();
//JSONデータを取得
$json = @file_get_contents("http://urls.api.twitter.com/1/urls/count.json?url=".rawurlencode($url));
//JSONデータを連想配列に直す
$array = json_decode($json,true);
//カウント
$cnt = $array["count"];
//返す値
return $cnt;
}
Hatena/function.php
//Hatena
function hb_cnt(){
//はてなAPIのURL
$hb_url = 'http://api.b.st-hatena.com/entry.count?url='.get_the_permalink();
//カウント数の格納
$cnt = @file_get_contents($hb_url) ? @file_get_contents($hb_url) : 0;
//返す値
return $cnt;
}
作成した各SNS取得関数をまとめて保存
上記で作成した関数をまとめて取得専用の関数を作成しました。
保存期間を14日間にし7日前より古かったら更新するみたいな感じにしてみました。
function.php
//カウント数の保存
function sns_count_get(){
//データが無い場合 又は 指定した時間より古い場合
if(false === ($cnt = get_transient('sns_cnt_' . get_the_ID())) || $cnt["date"] < strtotime("-7 days")){
//各SNS
$cnt["tw"] = tw_cnt();
$cnt["fb"] = fb_cnt();
$cnt["gp"] = gp_cnt();
$cnt["hb"] = hb_cnt();
$cnt["date"] = time();
//Transient の値を設定
set_transient('sns_cnt_' . get_the_ID(), $cnt, 60 * 60 * 24 * 14);
}
}
header.phpの一番上に設置しシングルページの場合に動作を行う様にしました。
header.php
<?php if(is_single()){ sns_count_get(); } ?>
カウント数の表示用関数を作成し設置
今度は、カウント数を出力する関数を作成しデータがない場合の処理を加えておきました。
function.php
//カウント出力
function sns_count_out(){
//データが無い場合の処理
if(false === ($cnt = get_transient('sns_cnt_' . get_the_ID()))){
$cnt = array("tw" => "?","fb" => "?","gp" => "?","hb" => "?");
}
//返す値
return $cnt;
}
最後に投稿一覧のループ処理などがされている箇所に下記の様なコードを記述して作業完了です。
投稿一覧に設置
<ul class="sns-custom">
<?php
//SNSカウント数取得
$cnt = sns_count_out();
//配列変数の確認
if(is_array($cnt)){
//削除
unset($cnt["date"]);
//ループ処理
foreach($cnt as $key => $val){ echo '<li class="'.$key.'"><span>'.$val.'</span></li>'; }
}
?>
</ul>
【参考Webサイト】
コメント(0件)
SNSのカウント数をPHPで取得し表示させる方法に対するご意見、ご感想、情報提供など皆様からのコメントをお待ちしております。 お気軽にコメントしてください。
コメントフォーム