I’m trying to write a new plugin since I haven’t been able to find one that does exactly what I want with the extensibility that I desire. The goal of the plugin is to be able to use a simple shortcode to display an image slider that automatically populates with your blog’s latest posts.
I’ve got the basic plugin files ready and the shortcode implemented and tested. Now I’m trying to get the plugin to pull in the blog’s latest posts, but I’m running into a bit of a snafu. When I use the_title() and the_permalink() they display outside of the code I’m trying to contain them in. Further, the_content() is displaying once with the_permalink() and the_title() and then a second time where it’s supposed to.
You can see the behavior here.
Here’s the code I’m using:
function slyd( $category, $slydcount ) {
global $post;
$tmp_post = $post; // Create $tmp_post to empty $post once Slyd is done with it
$args = array(
'category' => $category,
'numberposts' => $slydcount
);
$slydposts = get_posts( $args );
foreach( $slydposts as $post ) : setup_postdata($post);
$post_permalink = the_permalink(); // Get the post's permalink
$post_title = the_title(); // Get the post's title
$post_content = the_content(); // Get the post's content - will write code to get excerpt later
return '<h2><a href="' . $post_permalink . '">' . $post_title . '</a></h2>\n'
. '<p>' . $post_content . '</p>';
endforeach;
$post = $tmp_post; // Empty $post once Slyd is done with it
}
// Create the shortcode
function slyd_shortcode( $atts ) {
// $atts ::= array of attributes
// examples: [slyd]
// [slyd category='slide']
// [slyd slydcount='5']
// [slyd theme='default']
/* Retrieve attributes set by the shortcode and set defaults for
unregistered attributes. */
extract( shortcode_atts( array(
'category' => '', // Which category(s) to display posts from
'slydcount' => '5', // How many Slyds to display
'theme' => 'default' // Which Slyd theme to use
), $atts ) );
return "<p>category = {$category}, count = {$slydcount}</p>"
. slyd( $category, $slydcount );
}
add_shortcode( 'slyd', 'slyd_shortcode' );
By default,
the_titlewill print out (echo) the title. You can pass extra parameters to the function in order to get it to just return the title, like so:But it’s even better to just use
get_the_titleinstead – and the same goes forget_the_contentandget_permalinkas well.