2 personman Dec 21, 2005 20:32

Thanx a lot =)
Way back in the day there was a hack that did this. A plugin for the phoenix generation would be cool.
PS: moved this to plugins request.
I've got something underway. I have a question, though. Here's the code I'm using:
$list = new ItemList($blog, array(), '', '', -1, '', array(),
'', 'DESC', 'comments', 30);
I'm telling it to order by 'comments'. But is that looking at the number of comments for the post, or the comment status of the post (open, closed or disabled)? I was hoping for the former, but it appears to be the latter. If this doesn't work then will I have to build a query (more likely queries) from scratch to get all post ids for the blog, then count the number of comments that match their ids?
EdB, if you can find the old hack I'd like to take a look at it.
I just changed my sig file but it doesn't seem to be showing up. I wonder why that is? I wonder if characters inside links count against the 255 max, and if so why did it not truncate my new sig file?
http://forums.b2evolution.net/viewtopic.php?t=2682 is one though I think it was very version-specific.
http://forums.b2evolution.net/viewtopic.php?t=4808 links to two others though I didn't follow those links.
http://forums.b2evolution.net/viewtopic.php?t=6189 is probably something you're already hip to eh?
Those threads are about showing recent comments. I want to show links to the posts that have the most number of comments.
The details always mess me up!
Most heavily commented would be a unique animal. A good one too! Drive traffic to that which your readers found interesting and you create this global warming type of situation, only a good global warming: not the bad one that ruins the earth and puts snow shovel salesmen out of business.
I have this almost working. I had to cobble together a big, gnarly SQL query with joins and what not, but it does spit out the post titles and their comment counts. And you can limit it to the top x posts, where x is a number you enter with a plugin param. The default is 5. You can see it here:
http://www.brendoman.com/dev/blogs/index.php
Now I've got to figure out how to generate the permalink url from outside the Item class. There's also a bug for posts that appear on more than one blog. The comments seem to get counted for each blog sometimes.
Here's the meat of the code, for those of you keeping score at home (of for anyone who wants to help):
$sql = "SELECT DISTINCT post_ID , post_title ,
COUNT(post_ID ) AS count
FROM evo_comments , evo_posts
INNER JOIN evo_postcats ON post_ID = postcat_post_ID
INNER JOIN evo_categories ON postcat_cat_ID = cat_ID
WHERE evo_posts.post_ID = evo_comments.comment_post_ID
and (cat_blog_ID = ".$params['blog'].")
group by post_ID ORDER BY `count` DESC
LIMIT ".$params['limit'];
$results = $DB->get_results($sql);
for ($i = 0; $i < $params['limit']; $i++) {
if ($results[$i]->count == '') break;
echo $results[$i]->post_title;
echo ' ('.$results[$i]->count.')<br />';
}
If anyone wants, I can give you the full plugin file so you can play with it.
Got it! It's working now, permalinks and all. Same link as above. I'll clean it up and make a post about it. Then I'll see about a backport to 0.9.1 (as a hack) if you're still using it, MarcDK
Here's the plugin:
Here's the backport for b2evolution 0.9.x. Grab the file below and paste that into your skin. You can edit the default params if you want. Not as pretty as a plugin, but it works.
I'm sorry but it does not work correctly for me. The first item has 132 comments. In reality it only has 44. This means he multiplies it with 3.
Any idea?
UPDATE: it also multiplies the third place two times which means that the 35 comments are becoming 70.
UPDATE 2: Ok it seems that every item in this list generated by this script has wrong numbers. The last one is also multiplied with 3 and so is the 4th one. Ony the second one is correct showing 117 comments which is correct. =(
Hmm, do those posts appear on more than one blog? That's a known bug. Do they appear in more than one category? What about the one that works, is it just in one category?
Yes, many of my articles appear in more than one category. =/
Can't we just count the categories of an article and divide the number through that?
Ok, I'm able to replicate this problem on my blog. I added a second category to my post that had the most comments and the comment count doubled in my sidebar. This only affects posts with more than one category in the same blog, not, as I first suspected, posts that show up on multiple blogs (one category for each blog). Here's the query again. I've tried some variations on this, but I can't seem to get rid of this problem. Any help would be great.
SELECT ID, post_title, post_urltitle, COUNT(ID) AS count
FROM evo_comments, evo_posts
INNER JOIN evo_postcats ON ID = postcat_post_ID
INNER JOIN evo_categories ON postcat_cat_ID = cat_ID
WHERE evo_posts.ID = evo_comments.comment_post_ID
AND (cat_blog_ID =2)
GROUP BY ID
ORDER BY `count` DESC
LIMIT 5
This is the query for 0.9.1. The 1.6 version of the plugin uses some different column titles, but has the same problem.
The bug has been squashed. MarcDK gave me the solution, it just took me a while to see it. I've never used math in a SQL query, but it works like a charm. Line two below is where the magic happens. If you want, you can just change that line, but I'll update the text file linked above with the new code.
SELECT ID , post_title, post_urltitle ,
ROUND(COUNT(ID) / COUNT(DISTINCT postcat_cat_ID)) AS count
FROM evo_comments , evo_posts
INNER JOIN evo_postcats ON ID = postcat_post_ID
INNER JOIN evo_categories ON postcat_cat_ID = cat_ID
WHERE evo_posts.ID = evo_comments.comment_post_ID
AND (cat_blog_ID =2)
GROUP BY ID
ORDER BY `count` DESC
LIMIT 5
I'm sorry but the new piece of code give me a blank result:
$sql = "SELECT ID , post_title, post_urltitle ,
ROUND(COUNT(ID) / COUNT(DISTINCT postcat_cat_ID)) AS count
FROM evo_comments , evo_posts
INNER JOIN evo_postcats ON ID = postcat_post_ID
INNER JOIN evo_categories ON postcat_cat_ID = cat_ID
WHERE evo_posts.ID = evo_comments.comment_post_ID
AND (cat_blog_ID =2)
GROUP BY ID
ORDER BY `count` DESC
LIMIT ".$params['limit'];
$sql is empty =/
UPDATE:
Stop, I was wrong. There is something wrong with my template! I'll fix it in a second andf tell you if it works!
UPDATE 2
Ok, I found the error:
AND (cat_blog_ID = ".$params['blog'].")
I changed this line. I think you put the "2" in there because of testing. =) Now it works like a charm! Thank you very much and merry christmas!
Yeah, like I said, the second line was the only one you needed to drop into your code. Sorry about leaving my test code in there. I'm glad it works for you. Merry Christmas.
That's a great idea. It can be done fairly easily with a plugin. I've got one started. I may move this thread to the plugin request forum if you don't mind.