Feedlyの購読者数ボタンを改造して、Feedlyエラー時に対応する方法
頑張ってくれFeedly!!
ってことで、DDoS攻撃が再び仕掛けられ、またもやサービスダウン、エラー頻発中のRSSリーダーサービス「Feedly」。
昨日お伝えしたようにFeedlyがエラーになると、Feedly購読者数ボタンが原因でブログが表示されなくなるという問題があったのでそれを解消してみました。

一度はインフラストラクチャに変更を加えるなどして復旧したものの、またもやDDoS攻撃をされています。速報は以下の記事。
ということは、またキャッシュの再取得時に購読者数ボタンがサービスダウンで数値を取得できずにエラーを吐いて、ブログを表示させられぬ! という事態に陥りかねなかったため、キャッシュ再取得前に購読者数を取得するコードを書き換えて対応しました。
同じように購読者数ボタンを表示しているブログは、ほぼこちらの記事を参考にされていると思います。
コードは以下のとおり。
<?php if ( false === ( $subscribers = get_transient( 'feedly_subscribers' ))) : $feed_url = rawurlencode( get_bloginfo( 'rss2_url' ) ); $subscribers = wp_remote_get( "http://cloud.feedly.com/v3/feeds/feed%2F$feed_url" ); $subscribers = json_decode( $subscribers['body'] ); $subscribers = $subscribers->subscribers; set_transient( 'feedly_subscribers', $subscribers, 60 * 60 * 12 ); endif; ?>
このコードの場合、wp_remote_get()関数がFeedlyから数値を取得できずに、それに伴ってブログの表示処理が途中で停止してしまいます。
エラーが出ていた時点で、エラー原因となる部分はわかっていたんですが、それに対してどう対応すんべ? と思ってサクッと調べてみたところ、ジャストな記事を見つけました。
詳細は記事を参照していただくとして、この記事で紹介されているwp_remote_get()関数にエラーがないかを調べる関数を加え、エラーがあった場合はブログの表示処理を妨げないように処理するコードを実装すればOKです。
<?php //Transient名称(DBに一時的に保存するFeedlyの購読者数)
$transientname = "feedly_subscribers";
//Feedly購読者数がDB保存されていないか期限切れの場合、APIから取得する
if ( false === ( $subscribers = get_transient( $transientname ) ) ) :
$feed_url = rawurlencode( get_bloginfo( 'rss2_url' ) );
$response = wp_remote_get("http://cloud.feedly.com/v3/feeds/feed%2F$feed_url");
if( !is_wp_error( $response ) ) {
//エラーが無い場合購読者数をDB保存する
$subscribersbody = json_decode( $response['body'] );
$subscribers = $subscribersbody->subscribers;
//DB保存の有効期限は12時間とする
set_transient( $transientname, $subscribers, 60 * 60 * 12 );
}
else{
//購読者数取得でエラーとなった場合、購読者数を一時的に?とする
$subscribers = "?";
//DB保存の有効期限は1時間とする
set_transient( $transientname, $subscribers, 60 * 60 * 1 );
}
endif; ?>
エラー時のキャッシュは1時間でリセットして再取得されるようになっています。
この対応をしておくことで、Feedlyが今回のような状況になっても、ブログの表示処理は問題なく実行されますよ。
何にせよ、ちょっと執拗に攻撃されているFeedlyですが、攻撃に屈することなく頑張っていただきたいところ。Feedlyユーザーはみんな心から応援してますぞ!