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.
awesome