After calling get_recent_posts() (or any other loop query), you typically have to run a foreach
or while
loop to cycle through the posts. So, you’ll need to change this:
<?php
$args = array( 'tag' => 'featured', 'posts_per_page' => '3' );
$recent_posts = wp_get_recent_posts( $args );
?>
<!-- Your HTML and WordPress template tags here. -->
<?php wp_reset_query(); ?>
to this:
<?php
$args = array( 'tag' => 'featured', 'posts_per_page' => '3' );
$the_query = new WP_Query( $args );
//start the WP_Query loop
while ( $the_query->have_posts() ) : $the_query->the_post();
?>
<!-- Your HTML and WordPress template tags here. -->
<?php endwhile; //end the WP_Query loop ?>
<?php wp_reset_query(); ?>
Note that if you’re ever wondering why a WordPress function isn’t working as expected, you can find that function’s entry in the codex and (usually) see an example of use in practice.
http://codex.wordpress.org/Function_Reference/wp_get_recent_posts