Skip to content

Instantly share code, notes, and snippets.

@craigrodway
Created April 19, 2011 17:28
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save craigrodway/928940 to your computer and use it in GitHub Desktop.
Save craigrodway/928940 to your computer and use it in GitHub Desktop.
CMS Made Simple user-defined tag to show latest tweets. Includes caching. Original source listed in comments.
/**
* TWITTER FEED PARSER
*
* @version 1.1.2
* @author Jonathan Nicol
* @link http://f6design.com/journal/2010/10/07/display-recent-twitter-tweets-using-php/
*
* Notes:
* We employ caching because Twitter only allows their RSS feeds to be accesssed 150
* times an hour per user client.
* --
* Dates can be displayed in Twitter style (e.g. "1 hour ago") by setting the
* $twitter_style_dates param to true.
*
* Credits:
*
* Hashtag/username parsing based on: http://snipplr.com/view/16221/get-twitter-tweets/
* Feed caching: http://www.addedbytes.com/articles/caching-output-in-php/
* Feed parsing: http://boagworld.com/forum/comments.php?DiscussionID=4639
*
* CMS Made Simple usage:
*
* {tweets username="example" number="5"}
*/
$twitter_user_id = $params['username'];
$cache_file = './twitter.txt';
$tweets_to_display = (isset($params['number'])) ? $params['number'] : 5;
$ignore_replies = true;
$twitter_wrap_open = '<ul id="twitter">';
$twitter_wrap_close = '</ul>';
$tweet_wrap_open = '<li><span class="status">';
$meta_wrap_open = '</span><br><span class="meta"> ';
$meta_wrap_close = '</span>';
$tweet_wrap_close = '</li>';
$date_format = 'g:i A M jS';
$twitter_style_dates = true;
// Seconds to cache feed (1 hour).
$cachetime = 60*60;
// Time that the cache was last filled.
$cache_file_created = ((@file_exists($cache_file))) ? @filemtime($cache_file) : 0;
// A flag so we know if the feed was successfully parsed.
$tweet_found = false;
// Show file from cache if still valid.
if (time() - $cachetime < $cache_file_created) {
$tweet_found = true;
// Display tweets from the cache.
@readfile($cache_file);
} else {
// Cache file not found, or old. Fetch the RSS feed from Twitter.
$rss = @file_get_contents('http://twitter.com/statuses/user_timeline/'.$twitter_user_id.'.rss');
if($rss) {
// Parse the RSS feed to an XML object.
$xml = @simplexml_load_string($rss);
if($xml !== false) {
// Error check: Make sure there is at least one item.
if (count($xml->channel->item)) {
$tweet_count = 0;
// Start output buffering.
ob_start();
// Open the twitter wrapping element.
$twitter_html = $twitter_wrap_open;
// Iterate over tweets.
foreach($xml->channel->item as $tweet) {
// Twitter feeds begin with the username, "e.g. User name: Blah"
// so we need to strip that from the front of our tweet.
$tweet_desc = substr($tweet->description,strpos($tweet->description,":")+2);
$tweet_desc = htmlspecialchars($tweet_desc);
$tweet_first_char = substr($tweet_desc,0,1);
// If we are not gnoring replies, or tweet is not a reply, process it.
if ($tweet_first_char!='@' || $ignore_replies==false){
$tweet_found = true;
$tweet_count++;
// Add hyperlink html tags to any urls, twitter ids or hashtags in the tweet.
$tweet_desc = preg_replace('/(https?:\/\/[^\s"<>]+)/','<a href="$1">$1</a>',$tweet_desc);
$tweet_desc = preg_replace('/(^|[\n\s])@([^\s"\t\n\r<:]*)/is', '$1<a href="http://twitter.com/$2">@$2</a>', $tweet_desc);
$tweet_desc = preg_replace('/(^|[\n\s])#([^\s"\t\n\r<:]*)/is', '$1<a href="http://twitter.com/search?q=%23$2">#$2</a>', $tweet_desc);
// Convert Tweet display time to a UNIX timestamp. Twitter timestamps are in UTC/GMT time.
$tweet_time = strtotime($tweet->pubDate);
if ($twitter_style_dates == true){
// Current UNIX timestamp.
$current_time = time();
$time_diff = abs($current_time - $tweet_time);
switch ($time_diff)
{
case ($time_diff < 60):
$display_time = $time_diff.' seconds ago';
break;
case ($time_diff >= 60 && $time_diff < 3600):
$min = floor($time_diff/60);
$display_time = $min.' minutes ago';
break;
case ($time_diff >= 3600 && $time_diff < 86400):
$hour = floor($time_diff/3600);
$display_time = 'about '.$hour.' hour';
if ($hour > 1){ $display_time .= 's'; }
$display_time .= ' ago';
break;
default:
$display_time = date($date_format,$tweet_time);
break;
}
} else {
$display_time = date($date_format,$tweet_time);
}
// Render the tweet.
$twitter_html .= $tweet_wrap_open.$tweet_desc.$meta_wrap_open.'<a href="' . $tweet->link . '">'.$display_time.'</a>'.$meta_wrap_close.$tweet_wrap_close;
}
// If we have processed enough tweets, stop.
if ($tweet_count >= $tweets_to_display){
break;
}
}
// Close the twitter wrapping element.
$twitter_html .= $twitter_wrap_close;
echo $twitter_html;
// Generate a new cache file.
$file = @fopen($cache_file, 'w');
// Save the contents of output buffer to the file, and flush the buffer.
@fwrite($file, ob_get_contents());
@fclose($file);
ob_end_flush();
}
}
}
}
// In case the RSS feed did not parse or load correctly, show a link to the Twitter account.
if (!$tweet_found){
echo $twitter_wrap_open.$tweet_wrap_open.'Oops, our twitter feed is unavailable right now. '.$meta_wrap_open.'<a href="http://twitter.com/'.$twitter_user_id.'">Follow us on Twitter</a>'.$meta_wrap_close.$tweet_wrap_close.$twitter_wrap_close;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment