If you use the popular 3rd-party commenting system Disqus in your WordPress-powered website, you may have noticed that some errors appeared in your Posts lists after upgrading to WordPress 3.1. The specific error you see would be something like:
Warning: number_format() expects parameter 1 to be double, string given in /wp-includes/functions.php on line 155
I’ve had problems with Disqus messing with WordPress comment counts in the past, and since those minor problems were never properly resolved, they caused more severe problems when WordPress updated their Posts view in version 3.1.
Essentially, Disqus takes the WordPress comment count and reformats it internally to wrap it in an identifying span that follows the format:
[code lang=”xml”]
<span class="dsq-postid" rel="{unique post identifier}">{number of comments}</span>
[/code]
Disqus effectively usurps WordPress’s comment count (which isn’t a big deal by itself), but the added HTML around the comment count is what breaks WordPress 3.1.
Why It Breaks
In the WordPress core file /wp-admin/includes/class-wp-list-table.php, WordPress makes a call to the get_comments_number() function and passes it to its internal function number_format_i18n(). Since Disqus has replaced the normal value returned from get_comments_number() with its own value wrapped in HTML, this breaks WordPress’s number_format_i18n function which expects the value to be a double instead of a string.
After quite a bit of troubleshooting, I figured out a way to fix this by making a small change to the Disqus plugin.
How to Fix It
Note: This method involves editing PHP files for WordPress plugins on your web server. If you do not feel comfortable following this guide, please seek assistance. And above all – make a backup!
Step 1: Edit the file /wp-content/plugins/disqus-comment-system/disqus.php
Step 2: Locate the following code at line 692:
[code lang=”php” firstline=”692″]
function dsq_comments_number($count) {
global $post;
if ( dsq_can_replace() ) {
return ‘<span class="dsq-postid" rel="’.htmlspecialchars(dsq_identifier_for_post($post)).’">’.$count.'</span>’;
} else {
return $count;
}
}
[/code]
Replace it with:
[code lang=”php” firstline=”692″]
function dsq_comments_number($count) {
global $post;
return $count;
}
[/code]
Step 4 (optional – this will fix comment counts in the front-end of your blog if using the comments_number() function in your theme): Locate the following code at line 697:
[code lang=”php” firstline=”697″]
function dsq_comments_text($comment_text) {
global $post;
if ( dsq_can_replace() ) {
return ‘<span class="dsq-postid" rel="’.htmlspecialchars(dsq_identifier_for_post($post)).’">View Comments</span>’;
} else {
return $comment_text;
}
}
[/code]
Replace it with:
[code lang=”php” firstline=”697″]
function dsq_comments_text($comment_text) {
global $post;
$number_of_comments = get_comments_number();
return $number_of_comments;
}
[/code]
Finally, to display the comment count in your WordPress theme, use the following code wherever you want to display “X Comments”:
[code lang=”php”]
<?php comments_number(”,’ / 1 Comment’,’ / % Comments’); ?>
[/code]
This should fix the comments count in your WordPress Posts view, and make comments appear correctly on your blog if you use the comments_number() function in your theme.
Leave a Reply
You must be logged in to post a comment.