最近、Twitter フィードを取得してキャッシュし、HTTP 要求を節約する小さなスクリプトを作成しました。WordPress がなくてもうまく機能します。WordPress に追加するとすぐにすべてがうまくいきません。これは、file_get_contents が WordPress で特に正しく機能しないためです。代わりにwp_remote_get()を使用してみましたが、次のエラーが発生します。
Fatal error: Cannot use object of type WP_Error as array in
この行は次のとおりです。
$tweets = json_decode($contents['body']);
WordPress に追加しないコード: (これは問題なく動作します)
$file = "tweets.txt";
if (@file_exists($file) and @filemtime($file)>=strtotime("-10 minutes")) {
$tweets = json_decode(file_get_contents($file));
} else {
$tweets = file_get_contents("http://api.twitter.com/1/statuses/user_timeline.json?screen_name=jack&include_rts=true");
$fh = fopen($file, 'w');
fwrite($fh, $tweets);
fclose($fh);
$tweets = json_decode($tweets);
}
$i = 0;
foreach($tweets as $tweet) {
$tweetText = preg_replace('#\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))#','<a href="$1">$1</a>', $tweet->text);
$tweetText = preg_replace('/(^|\s)@([a-z0-9_]+)/i','$1<a href="http://www.twitter.com/$2">@$2</a>', $tweetText);
$tweetText .= " - " . date('G:i F jS',strtotime($tweet->created_at));
echo '<p>'.$tweetText.'</p>';
++$i;
if ($i==3) {break;}
}
WordPress に追加するときのコード:
$file = "tweets.txt";
if (@file_exists($file) and @filemtime($file)>=strtotime("-10 minutes")) {
$contents = wp_remote_get($file);
$tweets = json_decode($contents['body']);
} else {
$tweets = wp_remote_get("http://api.twitter.com/1/statuses/user_timeline.json?screen_name=jack&include_rts=true");
$fh = fopen($file, 'w');
fwrite($fh, $tweets);
fclose($fh);
$tweets = json_decode($contents['body']);
}
$i = 0;
foreach($tweets as $tweet) {
$tweetText = preg_replace('#\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))#','<a href="$1">$1</a>', $tweet->text);
$tweetText = preg_replace('/(^|\s)@([a-z0-9_]+)/i','$1<a href="http://www.twitter.com/$2">@$2</a>', $tweetText);
$tweetText .= " - " . date('G:i F jS',strtotime($tweet->created_at));
echo '<p>'.$tweetText.'</p>';
++$i;
if ($i==3) {break;}
}
JSON のような HTTP リクエストを使用するのは初めてです。何かを省略したり、これが本当に簡単な解決策になったりした場合は申し訳ありません。ありがとう。