I’ve written a shortcode which displays ‘x’ number of posts on the homepage of my site when I write [blog posts_per_page-"3"]
. Here it is:
function getBlogPosts($atts) {
extract(shortcode_atts(array(
"posts_per_page" => '',
), $atts));
$queryArgs = array(
"posts_per_page" => $posts_per_page
);
$queryPosts = new WP_Query($queryArgs);
$output = "";
$output .= "<ul class="articles-list clearfix">";
if ( $queryPosts->have_posts() ) : while ( $queryPosts->have_posts() ) : $queryPosts->the_post();
$output .= "<li class="clearfix ind-article">
<a class="article-container" href="". get_the_permalink() ."">";
if (has_post_thumbnail($post->ID)) {
$output .= get_the_post_thumbnail($post->ID, 'medium'); // medium img size = 300x300. => make sure photos uploaded are at least 600x600
}
$output .= "<div class="article-content">";
$output .= "<h3 class="entry-title gamma uppercase">". get_the_title() ."</h3>";
$output .= "<span class="entry-meta">". get_the_date('l jS F') ."</span>";
$output .= "</div></a></li>";
endwhile; endif;
$output .= "</ul>";
return $output;
} add_shortcode('blog', 'getBlogPosts');
However, when I do this, a comment form for the blog post is also displayed (it’s definitely the post’s comment form, not the page – also seems to only be one comment form, for the last blog post displayed I think). I want to keep comments enabled but remove the comment from when the shortcode is used. How would I do this?
1 Answer
The problem
You must remember to call the core function wp_reset_postdata()
, after your while loop, to restore the global $post
object. The comment form is relying on that object, that you override with your $queryPosts->the_post()
call.
Note that the extract()
isn’t recommended, check this answer by @toscho, for example.
Removing comments
To remove the comment form, when using a shortcode, you could check out my answer here.
If you want to remove the list of comments and the comment-form, after the shortcode, then you can try out one the following methods, within the shortcode’s callback:
Method #1 Remove the queried comments via filters:
if( is_singular() && post_type_supports( get_post_type(), 'comments' ) )
{
// Remove the comment form
add_filter( 'comments_open', '__return_false' );
// Remove the list of comments
add_filter( 'comments_array', '__return_empty_array' );
}
Method #2 Force get_comments()
to return an empty array:
if( is_singular() && post_type_supports( get_post_type(), 'comments' ) )
{
// Remove the comment form
add_filter( 'comments_open', '__return_false' );
// Empty comments SQL query - Run only once
add_filter( 'comments_clauses', function( $clauses )
{
static $count = 0;
if( 0 === $count++ )
$clauses['where'] .= ' AND 1=0 ';
return $clauses;
});
}
Here we run the filter callback only once, to prevent this from e.g. a recent comments widget in the sidebar.
Method #3 Modify the comment template via filter. Create an empty file comments-empty.php
within your theme and use:
if( is_singular() && post_type_supports( get_post_type(), 'comments' ) )
{
// Modify the comment template
add_filter( 'comments_template', function( $template )
{
if( $tmp = locate_template( 'comments-empty.php' ) )
$template = $tmp;
return $template;
} );
}
You can modify the file path to your needs.
Method #4 Hide it with CSS. Example:
if( is_singular() && post_type_supports( get_post_type(), 'comments' ) )
{
print '<style> #comments { display: none } </style>';
}