<?xml version="1.0"?>
<News hasArchived="true" page="8645" pageCount="10794" pageSize="10" timestamp="Tue, 08 Sep 2026 00:31:08 -0400" url="https://my3.my.umbc.edu/posts.xml?mode=recent&amp;page=8645">
<NewsItem contentIssues="true" id="31928" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31928">
<Title>How To Create A Twitter Widget</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <table width="650">
    <tbody>
    <tr>
    <td>
    <div>
    <img src="http://statisches.auslieferung.commindo-media-ressourcen.de/advertisement.gif" alt="" style="max-width: 100%; height: auto;"><br><a href="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=target&amp;collection=smashing-rss&amp;position=1" rel="nofollow external" class="bo"><img src="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=image&amp;collection=smashing-rss&amp;position=1" alt="" style="max-width: 100%; height: auto;"></a> <a href="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=target&amp;collection=smashing-rss&amp;position=2" rel="nofollow external" class="bo"><img src="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=image&amp;collection=smashing-rss&amp;position=2" alt="" style="max-width: 100%; height: auto;"></a> <a href="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=target&amp;collection=smashing-rss&amp;position=3" rel="nofollow external" class="bo"><img src="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=image&amp;collection=smashing-rss&amp;position=3" alt="" style="max-width: 100%; height: auto;"></a>
    </div>
    </td>
    </tr>
    </tbody>
    </table>
    <p>Twitter needs no introduction. It has become <em>the</em> way to reach audiences for some people and companies and a place to hang out for others. Placing a Twitter feed on one’s website has almost become compulsory. Embedding a feed isn’t all that difficult if you are comfortable with Twitter’s default widget, but making your own will enable you to blend it into your website seamlessly.</p>
    <p><a href="http://media.smashingmagazine.com/wp-content/uploads/2013/06/photodune-4052663-twitter-on-keyboard-xs_mini.jpg" rel="nofollow external" class="bo"><img src="http://media.smashingmagazine.com/wp-content/uploads/2013/06/photodune-4052663-twitter-on-keyboard-xs_500_mini.jpg" alt="photodune-4052663-twitter-on-keyboard-xs" width="500" height="333" style="max-width: 100%; height: auto;"></a></p>
    <h3>The Result</h3>
    <p>The result of our effort will be a WordPress widget that can be placed in a widgetized sidebar. It will display the user’s details on top and the latest few items from the user’s feed. You can see it in action in our <a href="http://bonsaished.com/musico/about/" rel="nofollow external" class="bo">Musico</a> theme, although the screenshot below says it all.</p>
    <p><a href="http://media.smashingmagazine.com/wp-content/uploads/2013/06/finished_widget_mini.png" rel="nofollow external" class="bo"><img alt="finished_widget" src="http://media.smashingmagazine.com/wp-content/uploads/2013/06/finished_widget_mini.png" width="354" height="723" style="max-width: 100%; height: auto;"></a></p>
    <h3>About The Twitter Terms Of Service</h3>
    <p>Because this is a custom widget, you control what and how elements are displayed. Make sure to read Twitter’s “<a href="https://dev.twitter.com/terms/display-requirements" rel="nofollow external" class="bo">Developer Display Requirements</a>” to find out what you need to display. I will be breaking some of the rules for simplicity’s sake, but bolting on stuff will be a trivial matter once you’ve finished this article.</p>
    <p>Note that <strong>conforming to the requirements is a must. If you do not, you run the risk of your ID being banned which means that your widget will not display any tweets.</strong></p>
    <strong>
    <h3>First Step: Create A Twitter App</h3>
    <p>Before writing any code, we’ll have to get our hands on a Twitter app or, more appropriately, Twitter API credentials. The process is explained in a video that I made:</p>
    <p></p>
    <div class="embed-container"><iframe src="http://player.vimeo.com/video/60891535?title=0&amp;byline=0&amp;portrait=0&amp;color=ffffff" frameborder="0" webkitallowfullscreen="webkitAllowFullScreen" mozallowfullscreen="mozallowfullscreen" allowfullscreen="allowFullScreen">[Video]</iframe></div>
    <p>In case you prefer reading to watching a video, <strong>here are the basic steps</strong>:</p>
    <ol>
    <li>Log into Twitter’s <a href="https://dev.twitter.com/" rel="nofollow external" class="bo">developers section</a>.</li>
    <li>Go to “<a href="https://dev.twitter.com/apps" rel="nofollow external" class="bo">My Applications</a>,” and click “Create a new application.”</li>
    <li>Fill out the required fields, accept the rules of the road, and then click on the “Create your Twitter application” button. You will not need a callback URL for this app, so feel free to leave it blank.</li>
    <li>Once the app has been created, click the “Create my access token” button.</li>
    <li>You’re done! You will need the following data later on:
    <ul>
    <li>consumer key,</li>
    <li>consumer secret,</li>
    <li>access token,</li>
    <li>access token secret.</li>
    </ul>
    </li>
    </ol>
    <h3>Add Our App’s Details</h3>
    <p>To add some options to our theme quickly, we’ll be using the theme customizer, introduced in WordPress 3.4. Smashing Magazine has an <a href="http://wp.smashingmagazine.com/2013/03/05/the-wordpress-theme-customizer-a-developers-guide/" rel="nofollow external" class="bo">exhaustive article on it</a>, if you’re interested to learn more. For now, we’ll just add the bare necessities.</p>
    <p>To enable quick access to the theme customizer, I like to use the following snippet:</p>
    <pre><code>&#x000A;    add_action ('admin_menu', 'my_theme_customizer');&#x000A;    function my_theme_customizer() {&#x000A;    	add_theme_page(&#x000A;    		__( 'Customize Theme Options', THEMENAME ),&#x000A;    		__( 'Customize Theme', THEMENAME ),&#x000A;    		'edit_theme_options',&#x000A;    		'customize.php'&#x000A;    	);&#x000A;    }&#x000A;    </code></pre>
    <p>Adding the code above to your theme’s <code>functions.php</code> file will generate a link to the customizer in the “Appearance” section of the admin area. To add some options, we’ll need to create a class. Add a file named <code>MyCustomizer.class.php</code> to the theme’s directory, and paste the following code in it:</p>
    <pre><code>&#x000A;    &lt;?php&#x000A;    class MyCustomizer {&#x000A;    	public static function register ( $wp_customize ) {&#x000A;    &#x000A;    		/** Sections **/&#x000A;    		$wp_customize-&gt;add_section( 'twitter_api' , array(&#x000A;    			'title'    =&gt; __( 'Twitter API Details', 'mytextdomain' ),&#x000A;    			'priority' =&gt; 10,&#x000A;    		));&#x000A;    &#x000A;    		/** Settings **/&#x000A;    		$wp_customize-&gt;add_setting( 'twitter_consumer_key' );&#x000A;    		$wp_customize-&gt;add_setting( 'twitter_consumer_secret' );&#x000A;    		$wp_customize-&gt;add_setting( 'twitter_access_token' );&#x000A;    		$wp_customize-&gt;add_setting( 'twitter_access_token_secret' );&#x000A;    &#x000A;    		/** Controls **/&#x000A;    		$wp_customize-&gt;add_control(&#x000A;    			'twitter_consumer_key',&#x000A;    			 array(&#x000A;    				'label' =&gt; __( 'Consumer Key', 'mytextdomain' ),&#x000A;    			 	'section' =&gt; 'twitter_api',&#x000A;    				'priority' =&gt; 10,&#x000A;    			 )&#x000A;    		);&#x000A;    		$wp_customize-&gt;add_control(&#x000A;    			'twitter_consumer_secret',&#x000A;    			 array(&#x000A;    				'label' =&gt; __( 'Consumer Secret', 'mytextdomain' ),&#x000A;    			 	'section' =&gt; 'twitter_api',&#x000A;    				'priority' =&gt; 20,&#x000A;    			 )&#x000A;    		);&#x000A;    		$wp_customize-&gt;add_control(&#x000A;    			'twitter_access_token',&#x000A;    			 array(&#x000A;    				'label' =&gt; __( 'Access Token', 'mytextdomain' ),&#x000A;    			 	'section' =&gt; 'twitter_api',&#x000A;    				'priority' =&gt; 30,&#x000A;    			 )&#x000A;    		);&#x000A;    		$wp_customize-&gt;add_control(&#x000A;    			'twitter_access_token_secret',&#x000A;    			 array(&#x000A;    				'label' =&gt; __( 'Access Token Secret', 'mytextdomain' ),&#x000A;    			 	'section' =&gt; 'twitter_api',&#x000A;    				'priority' =&gt; 40,&#x000A;    			 )&#x000A;    		);&#x000A;       }&#x000A;    }&#x000A;    add_action( 'customize_register' , array( 'MyCustomizer' , 'register' ) );&#x000A;    ?&gt;&#x000A;    </code></pre>
    <p>There are a couple of things to note about the code above. <strong>All of the details we need to add to the customizer are encapsulated in a class.</strong> The class is registered at the bottom of the code block, using a hook.</p>
    <p>We need to do three things with the class to get our options to show up:</p>
    <ul>
    <li>Create a new section to house these options in one logical group. We use the <code>add_section()</code> function to do this; all we need to add is a title.</li>
    <li>We need to tell WordPress that we are adding particular settings. The function used is <code>add_setting</code>, which can take a default parameter as well, but we don’t really need it here.</li>
    <li>Finally, we tie a control to the setting so that the user can manipulate it. A number of controls are available; here, we need a simple text box. Using the <code>add_control()</code> function, we specify the setting to be modified, the label of the control and the section it is in. The type of control is not specified because the default is the usual input box.</li>
    </ul>
    <p><a href="http://media.smashingmagazine.com/wp-content/uploads/2013/04/apisettings.png" rel="nofollow external" class="bo"><img alt="apisettings" src="http://media.smashingmagazine.com/wp-content/uploads/2013/04/apisettings.png" width="329" height="312" style="max-width: 100%; height: auto;"></a></p>
    <p>Notice the “priority” setting for some elements. This determines the order they show up in. The reason they are multiples of 10 is that, if you realize later that you need to add something between two settings, <strong>you won’t need to rewrite all of the priorities</strong>; you would just use “15” for the new element.</p>
    <p>Don’t forget to include this class in <code>functions.php</code> so that the code is executed.</p>
    <pre><code>&#x000A;    include( 'MyCustomizer.class.php' );&#x000A;    </code></pre>
    <p>Once all that is done, you can fill out the details. You will be able to access the values using the <code>get_theme_mod( 'option_name' )</code> function (more on that below).</p>
    <h3>Integrate The API</h3>
    <p>We now have a way to retrieve our API details, but we are not in contact with the API just yet. Doing that is a bit difficult; luckily, others have done the grunt work for us. For this tutorial, I’ll use Codebird, a PHP class for interacting with the Twitter API.</p>
    <p>Download the <code>codebird.php</code> file from <a href="https://github.com/mynetx/codebird-php" rel="nofollow external" class="bo">Codebird</a>, put it in your main theme folder, and set it up like so:</p>
    <pre><code>&#x000A;    add_action( 'init', 'my_twitter_api' );&#x000A;    function my_twitter_api() {&#x000A;    	global $cb;&#x000A;    	$consumer_key = get_theme_mod( 'consumer_key' );&#x000A;    	$consumer_secret = get_theme_mod( 'consumer_secret' );&#x000A;    	$access_token = get_theme_mod( 'access_token' );&#x000A;    	$access_secret = get_theme_mod( 'access_secret' );&#x000A;    &#x000A;    	include( 'codebird.php' )&#x000A;    	Codebird::setConsumerKey( $consumer_key, $consumer_secret );&#x000A;    	$cb = Codebird::getInstance();&#x000A;    	$cb-&gt;setToken( $access_token, $access_secret );&#x000A;    }&#x000A;    </code></pre>
    <p>Now you’ll be able to use Codebird by invoking the <code>$cb</code> instance. Let’s set this aside for now; we’ll get back to it later!</p>
    <h3>Create A Widget</h3>
    <p>I like to separate widgets into individual files. So, before we do anything else, create a <code>widgets</code> directory and put a file in it named <code>MyTwitterWidget.class.php</code>. Include this file in <code>functions.php</code> just as we did above:</p>
    <pre><code>&#x000A;    include( 'widgets/MyTwitterWidget.class.php' );&#x000A;    </code></pre>
    <p>Add the following PHP code to the file. <strong>This is the general starting point for widgets.</strong></p>
    <pre><code>&#x000A;    &lt;?php&#x000A;    class MyTwitterWidget extends WP_Widget {&#x000A;    	/** Widget setup **/&#x000A;    	function MyTwitterWidget() {&#x000A;    		parent::WP_Widget(&#x000A;    			false, __( 'My Twitter Widget', 'mytextdomain' ),&#x000A;    			array('description' =&gt; __( 'Displays a list of tweets from a specified user name', 'mytextdomain' )),&#x000A;    			array('width' =&gt; '400px')&#x000A;    		);&#x000A;    	}&#x000A;    	/** The back-end form **/&#x000A;    	function form( $instance ) {&#x000A;    &#x000A;    	}&#x000A;    	/** Saving form data **/&#x000A;    	function update( $new_instance, $old_instance ) {&#x000A;    &#x000A;    	}&#x000A;    	/** The front-end display **/&#x000A;    	function widget( $args, $instance ) {&#x000A;    &#x000A;    	}&#x000A;    }&#x000A;    register_widget('MyTwitterWidget');&#x000A;    ?&gt;&#x000A;    </code></pre>
    <p>There are four functions here, each with a particular role in creating the widget.</p>
    <ul>
    <li>The first function is the constructor. The widget’s title and description may be specified here.</li>
    <li>The <code>form</code> function takes care of the back-end form. Putting a few functions in there makes it very easy to assemble a form. WordPress takes care of the rest.</li>
    <li>The <code>update</code> function enables you to add any special code to the saving process.</li>
    <li>The <code>widget</code> function handles the front-end display of the widget.</li>
    </ul>
    <p>As we build the widget, you’ll see that we’ll need some custom functions. But until then, <strong>let’s go function by function</strong>.</p>
    <h4>The Back-End Form</h4>
    <p>We want to give the user the option to change the title of the widget, to specify how many tweets to show, and to specify their Twitter user name. The basic pattern for creating these options is as follows:</p>
    <pre><code>&#x000A;    &lt;p&gt;&#x000A;    	&lt;label for='&lt;?php echo $this-&gt;get_field_id( 'option_name' ); ?&gt;'&gt;&#x000A;    		&lt;?php _e( 'Title:', 'mytextdomain' ); ?&gt;&#x000A;    		&lt;input class='widefat' id='&lt;?php echo $this-&gt;get_field_id( 'option_name' ); ?&gt;' name='&lt;?php echo $this-&gt;get_field_name( 'option_name' ); ?&gt;' type='text' value='&lt;?php echo $values['option_name']; ?&gt;' /&gt;&#x000A;    	&lt;/label&gt;&#x000A;    &lt;/p&gt;&#x000A;    </code></pre>
    <p>The <code>$values</code> array is a list of all of this widget’s options, which are specified elsewhere. All of our options will follow the pattern below. Here are the functions to look out for:</p>
    <ul>
    <li>
    <code>get_field_id()</code>
    <p>Outputs the ID of the field for your option.</p>
    </li>
    <li>
    <code>get_field_name()</code>
    <p>Outputs the name of the field for your option.</p>
    </li>
    </ul>
    <p>Using these functions is crucial because the name and ID of these fields can get pretty funky when multiple widget instances are in multiple sidebars.</p>
    <p><strong>The complete code for our form</strong> looks something like this:</p>
    <pre><code>&#x000A;    &lt;?php&#x000A;    	$defaults = array(&#x000A;    		'title'    =&gt; '',&#x000A;    		'limit'    =&gt; 5,&#x000A;    		'username' =&gt; 'bonsaished'&#x000A;    	);&#x000A;    	$values = wp_parse_args( $instance, $defaults );&#x000A;    ?&gt;&#x000A;    &lt;p&gt;&#x000A;    	&lt;label for='&lt;?php echo $this-&gt;get_field_id( 'title' ); ?&gt;'&gt;&#x000A;    		&lt;?php _e( 'Title:', 'mytextdomain' ); ?&gt;&#x000A;    		&lt;input class='widefat' id='&lt;?php echo $this-&gt;get_field_id( 'title' ); ?&gt;' name='&lt;?php echo $this-&gt;get_field_name( 'title' ); ?&gt;' type='text' value='&lt;?php echo $values['title']; ?&gt;' /&gt;&#x000A;    	&lt;/label&gt;&#x000A;    &lt;/p&gt;&#x000A;    &#x000A;    &lt;p&gt;&#x000A;    	&lt;label for='&lt;?php echo $this-&gt;get_field_id( 'limit' ); ?&gt;'&gt;&#x000A;    		&lt;?php _e( 'Tweets to show:', 'mytextdomain' ); ?&gt;&#x000A;    		&lt;input class='widefat' id='&lt;?php echo $this-&gt;get_field_id( 'limit' ); ?&gt;' name='&lt;?php echo $this-&gt;get_field_name( 'limit' ); ?&gt;' type='text' value='&lt;?php echo $values['limit']; ?&gt;' /&gt;&#x000A;    	&lt;/label&gt;&#x000A;    &lt;/p&gt;&#x000A;    &#x000A;    &lt;p&gt;&#x000A;    	&lt;label for='&lt;?php echo $this-&gt;get_field_id( 'username' ); ?&gt;'&gt;&#x000A;    		&lt;?php _e( 'Twitter user name:', 'mytextdomain' ); ?&gt;&#x000A;    		&lt;input class='widefat' id='&lt;?php echo $this-&gt;get_field_id( 'username' ); ?&gt;' name='&lt;?php echo $this-&gt;get_field_name( 'username' ); ?&gt;' type='text' value='&lt;?php echo $values['username']; ?&gt;' /&gt;&#x000A;    	&lt;/label&gt;&#x000A;    &lt;/p&gt;&#x000A;    </code></pre>
    <p>The only addition made to this code is the retrieval of the values. The function is passed the current values in the <code>$instance</code> parameter. I’ve added a <code>defaults</code> array in case no values have been set. The <code>defaults</code> and the <code>instance</code> data arrays have been merged, resulting in the final <code>$values</code> array.</p>
    <h3>Save The Form’s Data</h3>
    <p>I’m sure you’ll be relieved by the simplicity of this. Here’s the complete code in the <code>update()</code> functions.</p>
    <pre><code>&#x000A;    return $new_instance;&#x000A;    </code></pre>
    <p>The <code>$new_instance</code> parameter has all of the new data in it. All we need to do is return it. The purpose of the <code>update</code> function is to allow for some validation or manipulation.</p>
    <h3>Display The Tweets</h3>
    <p>Now for the hard part! Retrieving the tweets is not that difficult, but if we do it on every page load, we’ll be rate-limited by Twitter in no time. We’ll need to find a way to cache the results <strong>so that we only bother Twitter, say, every five minutes</strong>. The way I like to handle these problems is to side-step them altogether and code as if the solution were already in place. Let’s assume that we’ve already written the functions that we need for this and proceed to create the front end:</p>
    <p>First, let’s look at the general template needed to display widgets:</p>
    <pre><code>&#x000A;    echo $args['before_widget'];&#x000A;    echo $args['before_title'] . $instance['title'] .  $args['after_title'];&#x000A;    echo $args['after_widget'];&#x000A;    </code></pre>
    <p>The <code>$args</code> parameter holds some structural information from the sidebar you created. We just output these to make sure that this widget conforms to all of your other widgets.</p>
    <p>Now, let’s list some tweets:</p>
    <pre><code>&#x000A;    $tweets = $this-&gt;get_tweets( $args['widget_id'], $instance );&#x000A;    if( !empty( $tweets['tweets'] ) AND empty( $tweets['tweets']-&gt;errors ) ) {&#x000A;    &#x000A;    	echo $args['before_widget'];&#x000A;    	echo $args['before_title'] . $instance['title'] .  $args['after_title'];&#x000A;    &#x000A;    	$user = current( $tweets['tweets'] );&#x000A;    	$user = $user-&gt;user;&#x000A;    &#x000A;    	echo '&#x000A;    		&lt;div class="twitter-profile"&gt;&#x000A;    		&lt;img src="' . $user-&gt;profile_image_url . '"&gt;&#x000A;    		&lt;h1&gt;&lt;a class="heading-text-color" href="<a href="http://twitter.com/">http://twitter.com/</a>' . $user-&gt;screen_name . '"&gt;' . $user-&gt;screen_name . '&lt;/a&gt;&lt;/h1&gt;&#x000A;    		&lt;div class="description content"&gt;' . $user-&gt;description . '&lt;/div&gt;&#x000A;    		&lt;/div&gt;	';&#x000A;    &#x000A;    	echo '&lt;ul&gt;';&#x000A;    	foreach( $tweets['tweets'] as $tweet ) {&#x000A;    		if( is_object( $tweet ) ) {&#x000A;    			$tweet_text = htmlentities($tweet-&gt;text, ENT_QUOTES);&#x000A;    			$tweet_text = preg_replace( '/http:\/\/([a-z0-9_\.\-\+\&amp;\!\#\~\/\,]+)/i', '<a href="http://%241" rel="nofollow external" class="bo">http://$1</a>', $tweet_text );&#x000A;    &#x000A;    			echo '&#x000A;    				&lt;li&gt;&#x000A;    					&lt;span class="content"&gt;' . $tweet_text . '&lt;/span&gt;&#x000A;    					&lt;div class="date"&gt;' . human_time_diff( strtotime( $tweet-&gt;created_at ) ) . ' ago &lt;/div&gt;&#x000A;    				&lt;/li&gt;';&#x000A;    		}&#x000A;    	}&#x000A;    	echo '&lt;/ul&gt;';&#x000A;    	echo $args['after_widget'];&#x000A;    }&#x000A;    </code></pre>
    <p>Let’s dissect this to understand what’s going on.</p>
    <ul>
    <li>
    <strong>Line 1</strong>
    <p>We’re assuming that we have a <code>get_tweets()</code> function that will return a list of tweets in some form. We haven’t written this yet, but by assuming that we have done so, we’ll know what to include in the function’s code.</p>
    </li>
    <li>
    <strong>Line 2</strong>
    <p>If the tweets list is not empty and there are no errors, we can display the widget.</p>
    </li>
    <li>
    <strong>Lines 7–8</strong>
    <p>All tweets are from the same user, and each tweet contains the user’s data. In line 7, we’re just grabbing the first tweet. In line 8, we’re pulling the user’s details into the <code>$user</code> variable.</p>
    </li>
    <li>
    <strong>Lines 10–16</strong>
    <p>We use data from the <code>$user</code> object to build a simple display for the user’s account. It includes the image, short description and user name.</p>
    </li>
    <li>
    <strong>Lines 18–29</strong>
    <p>Using data in the <code>$tweets['tweets']</code> variable, we build a list of tweets. The <code>preg_replace()</code> in there is needed to convert links (which arrive as plain text) into clickable elements.</p>
    </li>
    </ul>
    <p>All that’s left is to figure out how the <code>get_tweets()</code> function should work. We already know that it can’t directly get the tweets from Twitter, so we’ll need to use some trickery!</p>
    <p>To pull this off, our <code>get_tweets()</code> function will need to do the following:</p>
    <ol>
    <li>Get the list of tweets from our own database.</li>
    <li>If no list is there or the list is more than five minutes old, then it needs to grab the list from Twitter.</li>
    <li>Once we get results from Twitter, we save them to our database and add a timestamp to make sure we don’t grab it again before the five minutes is up.</li>
    </ol>
    <p>To make things more modular, we’ll create three functions.</p>
    <ul>
    <li>
    <code>get_tweets()</code>
    <p>Pulls a list of tweets from our database.</p>
    </li>
    <li>
    <code>retrieve_tweets()</code>
    <p>Pulls a list of tweets from Twitter.</p>
    </li>
    <li>
    <code>save_tweets()</code>
    <p>Saves a list of tweets from Twitter to our database.</p>
    </li>
    </ul>
    <h4>Retrieve Tweets From Twitter</h4>
    <p>In the <code>MyTwitterWidget</code> class, let’s create this function and make it retrieve some tweets:</p>
    <pre><code>&#x000A;    function retrieve_tweets( $widget_id, $instance ) {&#x000A;    	global $cb;&#x000A;     	$timeline = $cb-&gt;statuses_userTimeline( 'screen_name=' . $instance['username']. '&amp;count=' . $instance['limit'] . '&amp;exclude_replies=true' );&#x000A;     	return $timeline;&#x000A;    }&#x000A;    </code></pre>
    <p>As you can see, this is pretty easy, thanks to the Codebird class. We simply use one of its functions, <code>statuses_userTimeline()</code>, to retrieve our list. Our own functions receive the widget’s ID and the <code>instance</code> data, which we use to tell Codebird which user’s tweets we want and how many to retrieve.</p>
    <h4>Save Tweets to the Database</h4>
    <p>To save the tweets to the database, we’ll need to use the ID of the widget and the actual tweets, and we’ll need to store the time when we last updated them.</p>
    <pre><code>&#x000A;    function save_tweets( $widget_id, $instance ) {&#x000A;    	$timeline = $this-&gt;retrieve_tweets( $widget_id, $instance );&#x000A;    	$tweets = array( 'tweets' =&gt; $timeline, 'update_time' =&gt; time() + ( 60 * 5 ) );&#x000A;    	update_option( 'my_tweets_' . $widget_id, $tweets );&#x000A;    	return $tweets;&#x000A;    }&#x000A;    </code></pre>
    <p>This widget also receives the widget’s ID and the <code>instance</code> data. We use these to retrieve the tweets, using the <code>retrieve_tweets()</code> function that we created above. We’ll add that to our <code>$tweets</code> array, which contains the data returned from Twitter and the time of update.</p>
    <p>The time of update is five minutes from now. When we display our tweets, we’ll use this value to determine whether to display the tweets in the database or to grab the list from Twitter again (to ensure we have the most recent ones).</p>
    <p>We use the widget’s ID to save the list to the database, using WordPress’ options table. This ensures that we can save the proper Twitter details for each instance of our Twitter widget.</p>
    <h4>Get Tweets From the Database</h4>
    <p>We’ve finally arrived at the <code>get_tweets()</code> function. Let’s take a look. Explanation ensues!</p>
    <pre><code>&#x000A;    function get_tweets( $widget_id, $instance ) {&#x000A;    	$tweets = get_option( 'my_tweets_' . $widget_id );&#x000A;    	if( empty( $tweets ) OR time() &gt; $tweets['update_time'] ) {&#x000A;    		$tweets = $this-&gt;save_tweets( $widget_id, $instance );&#x000A;    	}&#x000A;    	return $tweets;&#x000A;    }&#x000A;    </code></pre>
    <p>First, we retrieve the tweets from the database using the options table. If the options table is empty or the update time has past our limit, then we use the <code>save_tweets()</code> function. This will retrieve the tweets from Twitter and save them to the database (and also return them so that we can use them right away).</p>
    <h3>Conclusion</h3>
    <p>While this methodology does not lack complexity, it has a <strong>tight and clear logic</strong> to it, which arises from the thoughtful way that WordPress implements widgets and the new theme customizer.</p>
    <p>Once you grasp the basic idea behind how this widget is created, you can add many of your own and customize them to your (or your client’s) delight.</p>
    <p><em>(al) (ea)</em></p>
    <hr>
    <p><small>© Daniel Pataki for <a href="http://www.smashingmagazine.com" rel="nofollow external" class="bo">Smashing Magazine</a>, 2013.</small></p></strong>
    </div>
]]>
</Body>
<Summary>        Twitter needs no introduction. It has become the way to reach audiences for some people and companies and a place to hang out for others. Placing a Twitter feed on one’s website has almost...</Summary>
<Website>http://www.smashingmagazine.com/2013/06/27/how-to-create-a-twitter-widget/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31928/guest@my.umbc.edu/10b32c4df626b3ccf25a9b26364dfdcd/api/pixel</TrackingUrl>
<Tag>css</Tag>
<Tag>design</Tag>
<Tag>development</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>php</Tag>
<Tag>sql</Tag>
<Tag>web</Tag>
<Tag>wordpress</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 27 Jun 2013 05:13:28 -0400</PostedAt>
<EditAt>Thu, 27 Jun 2013 05:13:28 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="31935" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31935">
<Title>Jimmy Wales Is Not an Internet Billionaire</Title>
<Body>
<![CDATA[
    <div class="html-content">The founder of Wikipedia has a brand-new life in London with Kate Garvey, his third wife, whom he often describes as “the most connected woman in London.”<div><table border="0"><tbody><tr><td>
    <a href="http://share.feedsportal.com/share/twitter/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F06%2F30%2Fmagazine%2Fjimmy-wales-is-not-an-internet-billionaire.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Jimmy+Wales+Is+Not+an+Internet+Billionaire" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/twitter.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/facebook/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F06%2F30%2Fmagazine%2Fjimmy-wales-is-not-an-internet-billionaire.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Jimmy+Wales+Is+Not+an+Internet+Billionaire" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/facebook.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/linkedin/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F06%2F30%2Fmagazine%2Fjimmy-wales-is-not-an-internet-billionaire.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Jimmy+Wales+Is+Not+an+Internet+Billionaire" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/linkedin.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/gplus/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F06%2F30%2Fmagazine%2Fjimmy-wales-is-not-an-internet-billionaire.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Jimmy+Wales+Is+Not+an+Internet+Billionaire" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/googleplus.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/email/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F06%2F30%2Fmagazine%2Fjimmy-wales-is-not-an-internet-billionaire.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Jimmy+Wales+Is+Not+an+Internet+Billionaire" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/email.png" style="max-width: 100%; height: auto;"></a>
    </td></tr></tbody></table></div>
    </div>
]]>
</Body>
<Summary>The founder of Wikipedia has a brand-new life in London with Kate Garvey, his third wife, whom he often describes as “the most connected woman in London.”     </Summary>
<Website>http://www.nytimes.com/2013/06/30/magazine/jimmy-wales-is-not-an-internet-billionaire.html?partner=rss&amp;emc=rss</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31935/guest@my.umbc.edu/055ba3fa7daafa3b861b7ca66fcdadf4/api/pixel</TrackingUrl>
<Tag>amazon-com-inc-amzn-nasdaq</Tag>
<Tag>apple-inc-aapl-nasdaq</Tag>
<Tag>computers-and-the-internet</Tag>
<Tag>ebay-inc-ebay-nasdaq</Tag>
<Tag>encyclopedias</Tag>
<Tag>facebook-inc-fb-nasdaq</Tag>
<Tag>google-inc-goog-nasdaq</Tag>
<Tag>microsoft-corporation-msft-nasdaq</Tag>
<Tag>new</Tag>
<Tag>technology</Tag>
<Tag>wales-jimmy</Tag>
<Tag>wikipedia</Tag>
<Tag>yahoo-inc-yhoo-nasdaq</Tag>
<Tag>york</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 27 Jun 2013 05:00:01 -0400</PostedAt>
<EditAt>Thu, 27 Jun 2013 05:00:01 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="false" id="31955" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31955">
<Title>Retrievers Unveil Challenging 2013 Volleyball Schedule</Title>
<Body>
<![CDATA[
    <div class="html-content">BALTIMORE � Before attempting to qualify for their school-record sixth consecutive trip to the America East Championships, the UMBC volleyball team will face a challenging out-of-conference slate, head coach Ian Blanchard announced on Thursday afternoon.</div>
]]>
</Body>
<Summary>BALTIMORE � Before attempting to qualify for their school-record sixth consecutive trip to the America East Championships, the UMBC volleyball team will face a challenging out-of-conference slate,...</Summary>
<Website>http://www.umbcretrievers.com/release.asp?RELEASE_ID=8055</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31955/guest@my.umbc.edu/6cfe860a5f50e388ce86f15f5a6eb16e/api/pixel</TrackingUrl>
<Group token="athletics">UMBC Athletics</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/athletics</GroupUrl>
<AvatarUrl>https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xsmall.png?1709304849</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/original.jpg?1709304849</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xxlarge.png?1709304849</AvatarUrl>
<AvatarUrl size="xlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xlarge.png?1709304849</AvatarUrl>
<AvatarUrl size="large">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/large.png?1709304849</AvatarUrl>
<AvatarUrl size="medium">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/medium.png?1709304849</AvatarUrl>
<AvatarUrl size="small">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/small.png?1709304849</AvatarUrl>
<AvatarUrl size="xsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xsmall.png?1709304849</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xxsmall.png?1709304849</AvatarUrl>
<Sponsor>UMBC Athletics</Sponsor>
<PawCount>3</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 27 Jun 2013 01:00:00 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="31961" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31961">
<Title>Tackling Online Dating's Biggest Conundrum</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>When you read the profile of a potential partner, how do you know it’s true? Researchers at Xerox’s PARC think they have the answer</p>
    <p><img src="https://www.technologyreview.com/sites/default/files/images/Certifeye.png" alt="" width="370" height="265" style="max-width: 100%; height: auto;"></p>
    </div>
]]>
</Body>
<Summary>When you read the profile of a potential partner, how do you know it’s true? Researchers at Xerox’s PARC think they have the answer</Summary>
<Website>http://www.technologyreview.com/view/516556/tackling-online-datings-biggest-conundrum/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31961/guest@my.umbc.edu/b11bae23345fdca5061a570821ae58bf/api/pixel</TrackingUrl>
<Tag>development</Tag>
<Tag>internet</Tag>
<Tag>mit</Tag>
<Tag>technology</Tag>
<Tag>web</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 27 Jun 2013 00:31:06 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="31925" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31925">
<Title>Xeroc PARC Tackles Online Dating's Biggest Conundrum</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>When you read the profile of a potential partner, how do you know it’s true? Researchers at Xerox PARC think they have the answer</p>
    <p><img src="https://www.technologyreview.com/sites/default/files/images/Certifeye.png" alt="" width="370" height="265" style="max-width: 100%; height: auto;"></p>
    </div>
]]>
</Body>
<Summary>When you read the profile of a potential partner, how do you know it’s true? Researchers at Xerox PARC think they have the answer</Summary>
<Website>http://www.technologyreview.com/view/516556/xeroc-parc-tackles-online-datings-biggest-conundrum/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31925/guest@my.umbc.edu/aaaa7f04eb10b589e214850ec09d4d78/api/pixel</TrackingUrl>
<Tag>development</Tag>
<Tag>internet</Tag>
<Tag>mit</Tag>
<Tag>technology</Tag>
<Tag>web</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 27 Jun 2013 00:31:06 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="31942" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31942">
<Title>Xerox PARC Tackles Online Dating's Biggest Conundrum</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>When you read the profile of a potential partner, how do you know it’s true? Researchers at Xerox PARC think they have the answer</p>
    <p><img src="https://www.technologyreview.com/sites/default/files/images/Certifeye.png" alt="" width="370" height="265" style="max-width: 100%; height: auto;"></p>
    </div>
]]>
</Body>
<Summary>When you read the profile of a potential partner, how do you know it’s true? Researchers at Xerox PARC think they have the answer</Summary>
<Website>http://www.technologyreview.com/view/516556/xerox-parc-tackles-online-datings-biggest-conundrum/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31942/guest@my.umbc.edu/80ae7feb7733b825a42db0037c9ef361/api/pixel</TrackingUrl>
<Tag>development</Tag>
<Tag>internet</Tag>
<Tag>mit</Tag>
<Tag>technology</Tag>
<Tag>web</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 27 Jun 2013 00:31:06 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="31923" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31923">
<Title>Siri&#8217;s Creators Demonstrate an Assistant That Takes the Initiative</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>An SRI project aims to build a powerful predictive assistant for office workers.</p>
    <p>In a small, dark, room off a long hallway within a sprawling complex of buildings in Silicon Valley, an array of massive flat-panel displays and video cameras track <a href="http://www.csl.sri.com/users/denker/" rel="nofollow external" class="bo">Grit Denker</a>’s every move. Denker, a senior computer scientist at the nonprofit R&amp;D institute <a href="http://www.sri.com" rel="nofollow external" class="bo">SRI</a>, is showing off <a href="http://bright.csl.sri.com/" rel="nofollow external" class="bo">Bright</a>, an intelligent assistant that could someday know what information you need before you even ask.</p>
    </div>
]]>
</Body>
<Summary>An SRI project aims to build a powerful predictive assistant for office workers.  In a small, dark, room off a long hallway within a sprawling complex of buildings in Silicon Valley, an array of...</Summary>
<Website>http://www.technologyreview.com/news/515671/siris-creators-demonstrate-an-assistant-that-takes-the-initiative/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31923/guest@my.umbc.edu/5c71f357b62b5bf850047cc05389f2b5/api/pixel</TrackingUrl>
<Tag>development</Tag>
<Tag>internet</Tag>
<Tag>mit</Tag>
<Tag>technology</Tag>
<Tag>web</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 27 Jun 2013 00:00:00 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="31926" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31926">
<Title>JQuery Mobile Comes to Rescue of Touch-Friendly Websites</Title>
<Body>
<![CDATA[
    <div class="html-content"><p>Supporting cross-platform with Html 5 based mobile apps, JQuery Mobile includes all the features of JQuery but adds touch-friendly features.</p></div>
]]>
</Body>
<Summary>Supporting cross-platform with Html 5 based mobile apps, JQuery Mobile includes all the features of JQuery but adds touch-friendly features.</Summary>
<Website>http://www.htmlgoodies.com/daily_news/jquery-mobile-comes-to-rescue-of-touch-friendly-websites.html</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31926/guest@my.umbc.edu/2bd5e6ac3599dbb26f8d9510d1a1edce/api/pixel</TrackingUrl>
<Tag>html</Tag>
<Tag>htmlgoodies</Tag>
<Tag>learning</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Wed, 26 Jun 2013 22:57:00 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="31927" important="false" status="posted" url="https://my3.my.umbc.edu/posts/31927">
<Title>Google's Dart Enters Beta and Hot on the Heels of Microsoft&#8217;s New TypeScript 0.9</Title>
<Body>
<![CDATA[
    <div class="html-content"><p>Microsoft’s JavaScript contender gains improved tools and better performance.</p></div>
]]>
</Body>
<Summary>Microsoft’s JavaScript contender gains improved tools and better performance.</Summary>
<Website>http://www.htmlgoodies.com/daily_news/googles-dart-enters-beta-and-hot-on-the-heels-of-microsofts-new-typescript-0.9.html</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/31927/guest@my.umbc.edu/d344906727f54e59177fbf38477cd220/api/pixel</TrackingUrl>
<Tag>html</Tag>
<Tag>htmlgoodies</Tag>
<Tag>learning</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Wed, 26 Jun 2013 22:40:00 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="123214" important="false" status="posted" url="https://my3.my.umbc.edu/posts/123214">
<Title>The UMB-UMBC Research and Innovation Partnership Seed Grant Program</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>FROM: Philip Rous, Provost</p>
    <p>TO: The UMBC Community</p>
    <p>RE: The UMB-UMBC Research and Innovation Partnership Seed Grant Program</p>
    <p>We are delighted to announce the first set of grants awarded in the UMB-UMBC Research and Innovation Partnership Seed Grant Program. This program is designed to promote structured collaboration between UMBC and UMB and to advance the institutions’ joint goals in research and innovation.</p>
    <p>We would like to acknowledge the creativity and hard work of all UMBC faculty that submitted proposals and we recognize that it was not possible to fund in this first round every deserving project from over 40 proposals received. We encourage those not funded this year to revise and resubmit their proposal next year.   Proposals submitted to the program were evaluated using a peer review process that included faculty from both the UMB and UMBC campuses. Each proposal was reviewed for: (1) how well the project meets the goals of the Seed Grant Program; (2) meeting criteria (e.g., relevance to future public health concerns, significance, innovation, approach and qualification of investigative team/environment to carry out the aims); and (3) likelihood of attracting outside funding in the future. The grant recipients were chosen based on merit as assessed by peer review.</p>
    <p>Although we had anticipated making only four or five awards, based on the outstanding overall quality of the submitted proposals, we selected six projects for funding in FY2014, each of which brings together creative teams of investigators from UMBC and UMB working across disciplinary boundaries and campuses to support new research foci.</p>
    <p>Please join me in congratulating this year’s grant recipients. The RFP for the next round of the UMB-UMBC Research and Innovation Partnership Seed Grants will be announced later this fall.</p>
    <p>Awarded Research Grants</p>
    <p><strong>Pain after Spinal Cord Injury: Experimental and Computational Studies</strong><br>
    UMBC PI: Kathleen Hoffman, Mathematics and Statistics<br>
    UMB PI: Asaf Keller, School of Medicine</p>
    <p><strong>Targeted Inhibition of Protein Kinase CK2 (CK2) and Extracellular Signal-Regulated Kinase (ERK) in Cancer Cells</strong><br>
    UMBC PI: Charles Bieberich, Biology<br>
    UMB PI: Paul Shapiro, Pharmaceutical Sciences</p>
    <p><strong>Independent Vector Analysis to Investigate Cognitive Neural Networks after Stroke: A Comparison between Two Rehabilitation Interventions</strong><br>
    UMBC PI: Tulay Adali, Computer Science and Electrical Engineering<br>
    UMB PI: Kelly Westlake, Physical Therapy and Rehabilitation Science</p>
    <p><strong>Novel Anti-biofilm, Anti-caries and Anti-fatigue Dental Nanocomposites</strong><br>
    UMBC PI: Dwayne Arola, Mechanical Engineering<br>
    UMB PI: Huakun Xu, Dental School UMB Clinical Co-Investigator: Ashraf Fouad, Dental School</p>
    <p><strong>Comparative Studies of the Intracellular Trafficking of Several Classes of Dendronized Drug Nanocarriers</strong><br>
    UMBC PI: Marie-Christine Daniel, Chemistry and Biochemistry<br>
    UMB PI: Peter Swaan, Pharmaceutical Sciences</p>
    <p><strong>Seed Grant for Monitoring and Modeling the Nuclear-cytoplasmic Movements of the Atrophy Promoting Transcription Factor Foxo1 in Cultured Adult Skeletal Muscle Fibers</strong><br>
    UMBC PI: Bradford Peercy, Mathematics and Statistics<br>
    UMB PI: Martin Schneider, Biochemistry and Molecular Biology</p>
    </div>
]]>
</Body>
<Summary>FROM: Philip Rous, Provost   TO: The UMBC Community   RE: The UMB-UMBC Research and Innovation Partnership Seed Grant Program   We are delighted to announce the first set of grants awarded in the...</Summary>
<Website>https://umbc.edu/stories/the-umb-umbc-research-and-innovation-partnership-seed-grant-program/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/123214/guest@my.umbc.edu/dd9879f4947b4fa1df61d326ae2e706e/api/pixel</TrackingUrl>
<Tag>community</Tag>
<Group token="umbc-news-magazine">UMBC News &amp;amp; Magazine</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/umbc-news-magazine</GroupUrl>
<AvatarUrl>https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xsmall.png?1748556657</AvatarUrl>
<AvatarUrl size="original">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/original.png?1748556657</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xxlarge.png?1748556657</AvatarUrl>
<AvatarUrl size="xlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xlarge.png?1748556657</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/large.png?1748556657</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/medium.png?1748556657</AvatarUrl>
<AvatarUrl size="small">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/small.png?1748556657</AvatarUrl>
<AvatarUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xsmall.png?1748556657</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xxsmall.png?1748556657</AvatarUrl>
<Sponsor>UMBC News &amp; Magazine</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Wed, 26 Jun 2013 20:34:48 -0400</PostedAt>
</NewsItem>

</News>
