WordPressでSNSボタンのシェアされた数字が出るやつ作るメモ。
記事下のソーシャルシェアカウンタ、おち研では公式ウィジェットを使わずPHPで各SNSのAPIに問い合わせて直接取得しています。
最初の頃はお借りしてたコードで表示してたんですけど、こまごま手直しした結果それなりに違うものになったのでシェア。
ソーシャルシェア数をPHPで取得・表示する
まずはコードから。テーマファイルを編集するのでバックアップしてから作業します。実行する対象が投稿ページだけなら single.php に書き込んでも構いません。
シェア数のカウント
【function.php】
// SNSカウント数
function getSocialCount($url) {
$socials = array();
$socials['htn'] = getHtn($url);
$socials['twit'] = getTwit($url);
$socials['face'] = getFace($url);
return $socials;
}
// Twitterカウント数取得
function getTwit($url) {
$twitCount = wp_remote_get('http://urls.api.twitter.com/1/urls/count.json?url=' . rawurlencode($url));
if ( $twitCount['response']['code'] == 200 ) {
return json_decode($twitCount['body']) -> count;
} else {
return '-';
}
}
// Facebookカウント数取得
function getFace($url) {
$shareCount = wp_remote_get('http://graph.facebook.com/' . rawurlencode($url));
if ( isset( $shareCount ) && !is_wp_error( $shareCount ) ) {
return json_decode($shareCount['body']) -> shares -0;
} else {
return '-';
}
}
// はてなブックマークカウント数取得
function getHtn($url) {
$htnCount = wp_remote_get('http://api.b.st-hatena.com/entry.count?url=' .rawurlencode($url))
if ( $htnCount['response']['code'] == 200 ) {
return $htnCount['body'] -0;
} else {
return '-';
}
}
カウンタ表示部
実際のカウンタを呼び出す部分です。SNSの名前が入った変数部分がカウンタに当たるので、HTMLとCSSで好みの見た目に整えます。
【single.php】
<!-- 現在のURL取得 -->
<?php $socials = getSocialCount(get_permalink()); ?>
Twitter <?php echo ($socials['twit']) ?> tweets <!-- Twitter用カウント数 -->
Facebook <?php echo ($socials['face']) ?> shares tweets <!-- Facebook用カウント数 -->
Hatena B! <?php echo ($socials['htn']) ?> users tweets <!-- はてブ用カウント数 -->
以下説明。
Twitterのtweet数を取得する
APIで示されるリクエスト用URLがに必要な情報を渡します。リツイートもカウントされますが、鍵垢さんが混ざると数が狂うようです。
http://urls.api.twitter.com/1/urls/count.json?url={目的のURL}
【function.php】
function getTwit($url) {
$twitCount = wp_remote_get('http://urls.api.twitter.com/1/urls/count.json?url=' . rawurlencode($url));
if ( $twitCount['response']['code'] == 200 ) {
return json_decode($twitCount['body']) -> count;
} else {
return '-';
}
}
単純なことを言えばAPI に URL を送ればプレーンな数字がそのまま返ってきます。ただ、Twitterのサーバエラーが起きたときにこっちの処理が止まっちゃう可能性があるので wp_remote_get を挟んでみました。こっちからリクエストして相手からOKが返ってきたら表示、そうでなければ何もしません。
Facebookのシェア数を取得する
まずリクエスト用URLから。
http://graph.facebook.com/{目的のURL}
Facebook は「いいね」と「シェア」で共有度に強弱がつけられるのですが、公式ウィジェットの動作と見比べるとAPIから引くシェア数は両方合算された値に見えます。
なんか大ざっぱな仕様という気もしますが、公式でも「シェア」は将来廃止すると言ってるので(その割に一向に消える気配がありませんが)動作にぶれがあるのは仕方がないのかも。
【 追記: 2014/08/27 】
Facebookだけ異様に処理落ちするので真偽判定を少し変えてみました。少し様子を見ながら運用してみます。
【function.php】
function getFace($url) {
$shareCount = wp_remote_get('http://graph.facebook.com/' . rawurlencode($url));
if ( isset( $shareCount ) && !is_wp_error( $shareCount ) ) {
return json_decode($shareCount['body']) -> shares -0;
} else {
return '-';
}
}
いずれにせよ値がJSON形式で返ってくるので shares だけ抜き出します。
ところでFacebook公式のシェアボタンって そのままサイトに貼るとベースラインが少しずれますよね。絶対指定で1ドットずつ動かしても良いけど normalize.css を挟むと調整が楽なのでオススメ。
はてなブックマーク数を取得する
はてなブックマーク数の取得APIには、 JSON形式のと はてブ数だけリクエストする簡易方式があります。貰うデータは小さい方が嬉しいと言うことで簡易版を採用。
http://api.b.st-hatena.com/entry.count?url={目的のURL}
【function.php】
function getHtn($url) {
$htnCount = wp_remote_get('http://api.b.st-hatena.com/entry.count?url=' .rawurlencode($url))
if ( $htnCount['response']['code'] == 200 ) {
return $htnCount['body'] -0;
} else {
return '-';
}
}
この辺の経緯は前にも書きました。
よく「SNSのカウンタは自分で作った方が軽い!」と言われますが、「動けばいいや」で作ると酷い目に遭うという好例。
(・∀・){ただしシェアボタンは手作りした方が大体高速です
シェア数をPHPで直接取得してみました感想
表示部となる変数はページ内で使い回せるので、それぞれの数字を足してシェア数の合計を出すことも可能です。各SNSでちらほらしか反応がなくても、全部で10シェアとか20シェアとかになると弱小サイトもそれなりに見栄えがしますしw
公開API活用ガイド [ Zapa ]【楽天】 / 【Amazon】 |
コメントをどうぞ(´ω`*)