Comment count in WordPress shortcode

Standard

Earlier today I was raving about the simply elegant plug-in Anti-Spam. When writing that post, it occurred to me that I specified two pieces of information that might change as time passes.

If you’ve read my post on dynamic ages in my About Me page, then it might be obvious that I like to keep things dynamic. That is to say, I don’t like to use static values unless those values are simply a snapshot in time. So I thought I’d add a little functionality to my site that would:

  • determine how much time has passed, given a start date
  • allow me to obtain the number of spam comments I have

The first part was rather easy, as I’ve already added a shortcode that determines a person’s age. It was simply a matter of modifying this code to account for smaller frames of time, as well as more generic frames of time (“only 2 days”, “over 3 years”).

I started by changing line #5 in my calcAge function to:
[code firstline=”5″]
extract(shortcode_atts(array(‘birthdate’ => ‘1970-11-24′,’detail’ => false), $parameters));
[/code]

This allowed me to specify that I wanted detailed time information by passing a “detail = true” argument in my shortcode.

I then needed to add code to create the detailed time information. To accomplish this, I added the following code above the “return $results” line in the code listed in my dynamic ages post:

[code firstline=”16″]
// Additional code to accommodate for smaller times
if($detail == true)
{
if($years == 0)
{
if($months == 0)
{
$weeks = floor($days / 7);
if($weeks == 0)
{
$results = $days." day";
if($days > 1)
{
$results = $results."s";
}
}
else
{
$results = $weeks." week";
if($weeks > 1)
{
$results = $results."s";
}
}
}
else
{
$results = $months." month";
if($months > 1)
$results = $results."s";
}
}
else
{
$results = $years." year";
if($years > 1)
$results = $results."s";
}
}
[/code]

I then needed a way to get the number of spam comments on my site. I found the WordPress function get_comments and basically wrapped that in a function I could access with a shortcode. The get_comments function takes several optional parameters, but I was only interested in two – the ability to specify the type of comment I wanted (status=’spam’) and the ability to get just the count of the comments of specified type (count=’true’).

The WordPress function accepts an array of key-value pairs as a parameter, so it was just a matter of building the array, passing it to the get_comments function, then returning the results.

Here’s my code – this gets entered into my theme’s functions.php file, anywhere between the existing tags – but NOT inside another existing function.

[code]
function GetCommentCount($atts)
{
extract(shortcode_atts(array(‘status’ => ‘spam’, ‘count’ => true,), $atts));

$args = array(
‘status’ => $status,
‘count’ => $count,
);
$comment_count = get_comments($args);

if($comment_count == 0)
{
$results = "not received a single ".$status." comment";
}
else
{
$results = "only received ".$comment_count." ".$status." comment";
}
if($comment_count > 1)
{
$results = $results."s";
}
return $results;
}

add_shortcode(‘GetCommentCount’, ‘GetCommentCount’);
[/code]

Let’s break this down.

[code firstline=”3″]
extract(shortcode_atts(array(‘status’ => ‘spam’, ‘count’ => true,), $atts));
[/code]
Line #3 simply parses our shortcode parameters into PHP variables. Here, we’re extracting the ‘status’ and ‘count’ key-value pairs (KVPs) from the shortcode arguments, assigning them default values if necessary, then assigning the values of those KVPs to the $status and $count PHP variables.

[code firstline=”5″]
$args = array(
‘status’ => $status,
‘count’ => $count,
);
[/code]

In lines #5-#8 (broken down to multiple lines for easy reading; note that PHP lines are terminated with a “;”, not a carriage return), we’re building an array of KVPs and assigning them to the $args PHP variable. We’re specifying the ‘status’ key to have the value stored in the $status PHP variable, and the ‘count’ key to have the value stored in the $count PHP variable.

[code firstline=”9″]
$comment_count = get_comments($args);
[/code]

In line #9, we’re passing the previously created array as arguments to WordPress’ get_comments function. By default, get_comments returns an array of comments. However, since we’re passing the KVP “‘count’ => ‘true'” as an argument, get_comments instead will return a single integer representing the number of comments represented by the $status value type.

[code firstline=”11″]
if($comment_count == 0)
{
$results = "not received a single ".$status." comment";
}
else
{
$results = "only received ".$comment_count." ".$status." comment";
}
if($comment_count > 1)
{
$results = $results."s";
}
[/code]

In lines #11-22, we’re simply building a string to be returned based on the value returned by the call to get_comments. If get_comments returns a value of 0, then I’m setting $results to “not received a single spam comment” (using ‘spam’ as the $status value). Otherwise, we’re setting $results to “only received # spam comments” (again, using ‘spam’ as the $status value), where # = the value returned by the function.

Now, in my rave about the Anti-Spam plugin, I used the shortcodes as follows:

“I’ve had this plugin installed for over [calcAge birthdate=’2013-03-14′ detail=true] and have [GetCommentCount].”

There are numerous WordPress plugins that allow PHP code to be embedded in pages and posts. I use the cleverly named Allow PHP in Pages and Posts plugin, which allows me to embed PHP code inside [allowphp][/allowphp] tags. Note that if I only wanted the comment count of spam comments, for example, I could have simply placed a call to the WordPress get_comments function inside [allowphp][/allowphp] tags. However, I prefer to place this code in my functions.php file to prevent the WordPress editor from stripping any necessary characters.

One thought on “Comment count in WordPress shortcode

Leave a Reply

Your email address will not be published. Required fields are marked *