Created
March 8, 2012 01:01
-
-
Save justinwhall/1997691 to your computer and use it in GitHub Desktop.
PHP: Function Latest Tweet
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function display_latest_tweets( | |
$twitter_user_id = 'justinwhall', | |
$cache_file = 'twitter.txt', | |
$tweets_to_display = 1, | |
$ignore_replies = false, | |
$twitter_wrap_open = '<ul id="twitter">', | |
$twitter_wrap_close = '</ul>', | |
$tweet_wrap_open = '<li><span class="status">', | |
$meta_wrap_open = '</span><span class="meta"> ', | |
$meta_wrap_close = '</span>', | |
$tweet_wrap_close = '</li>', | |
$date_format = 'g:i A M jS', | |
$twitter_style_dates = false){ | |
// 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){ | |
// 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="http://twitter.com/'.$twitter_user_id.'">'.$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(); | |
} | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment