最新評論 Recent Comments
這是我側邊欄的 Recent Comments, 陸陸續續已經改了很多次, 為的是用最快的速度去完成它.
未改之前總共用了 0.136769094467163 秒, 現在只要 0.036559820175171 秒.
別看這 0.1 秒不起眼, 這全頁加載才 0.5 秒, 這個小程式居然可佔全部的 1/5 時間, 你就知道多嚴重了~ 還好改過之後, 現在只佔 1/20 時間. 主要是拿掉 DISTINCT, 這東東實在太慢了~
其中用到了 "小g" , 至於 "小g" 是什麼? 不認識的童鞋請看上一篇:《簡易的 gravatar 頭像緩存》
不用插件的最新評論 Recent Comments:
功能: 將最新評論顯示在側邊欄, 含頭像緩存.
把下列代碼 copy 到模板的 sidebar.php
(2010/7/20 更新)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <h3><?php _e('Recent Comments'); ?></h3> <ul class="recentcomments"> <?php global $wpdb; $my_email = get_bloginfo ('admin_email'); $rc_comms = $wpdb->get_results(" SELECT ID, post_title, comment_ID, comment_author, comment_author_email, comment_content FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID = $wpdb->posts.ID) WHERE comment_approved = '1' AND comment_type = '' AND post_password = '' AND comment_author_email != '$my_email' ORDER BY comment_date_gmt DESC LIMIT 10 "); $rc_comments = ''; foreach ($rc_comms as $rc_comm) { $a = 'avatar/'.md5(strtolower($rc_comm->comment_author_email)).'.jpg'; // 頭像緩存用的 $rc_comments .= "<li><img src='" . $a . "' alt='' title='" . $rc_comm->comment_author . "' class='avatar' /><a href='" . get_permalink($rc_comm->ID) . "#comment-" . $rc_comm->comment_ID //. htmlspecialchars(get_comment_link( $rc_comm->comment_ID, array('type' => 'comment'))) // 可取代上一行, 會顯示 cpage, 但較耗資源 . "' title='on " . $rc_comm->post_title . "'>" . strip_tags($rc_comm->comment_content) . "</a></li>\n"; } $rc_comments = convert_smilies($rc_comments); echo $rc_comments; ?> </ul> |
其中 $my_email 已自動判斷, 讓博主的評論不顯示. 當然你也可以在 WHERE 中定義篩選哪些名字的評論不出現.
$a 是用相對路徑, 執行有問題的話, 也可改絕對路徑.
如果模板有貼圖功能, convert_smilies($rc_comments); 可再加一層 embed_images( ... ); 就可顯縮圖. 在 css 控制縮圖的 max-width 和 max-height.
這個代碼並不裁剪評論長度, 所以 li 要用 css 控制 overflow:hidden; 讓多餘的不顯示.
global $wpdb 只要一次就夠了, 如果其它地方已經有, 可刪掉那行.
最新評論通常只運行一次, 沒必要寫成 function, 以免被 cache 無法更新.

能问下,为什么我使用代码添加到侧边栏会出现重复的。最近评论。
wordpress3.01的。
我无奈。
http://www.yshe.net
是我自己的问题。找到解决方法了。
能给下你的CSS截断语句吗?
上面这部分没有截断语句,超出部分会乱成一团
新主题上用上这个吧。。呵呵
今天帮朋友折腾了下出问题了,应该是
$a = 'avatar/'.md5(strtolower($rc_comm->comment_author_email)).'.jpg';
是不是应该改为:
$a = get_bloginfo('wpurl') . '/avatar/'.md5(strtolower($rc_comm->comment_author_email)).'.jpg';
如果用新版缓存,是不是应该直接用那个函数调用头像?不知道哪种比较好
側邊欄用 $a 就好, 留言的時後就產生 $a 了.
我是用 '相對路徑', 你用的是 '絕對路徑', 只要路徑對了, 就有圖像, 都可以.
还是用你这个吧,我那查询数太多
先用用, 我還在想更好的.
请问是查询速度还是整个函数的执行速度?
要是减少查询数的话,用上wp_cache_add看看,在wp-includes/cache.php里
这里说的是这段代码本身的查询数
使用了你的代码,用SUBSTRING(comment_content,1,16) AS com_excerpt 有些评论无法显示,但是 不用又不能截断评论字数
恐怕你沒寫對, 參考這篇: http://zww.me/archives/24736
除了 SUBSTRING 還有 strip_tags($comment->com_excerpt) 也要改.
已经解决了,谢
今天心血來潮,也來這裡折騰一番
其中我稍微加了一些東西,太感謝willin提供的教學 ^^
又開始在折騰了啊~ 不客氣了~
太好了!大師這裡到處都是寶,怪我粗心了。加上這段代碼,就可以精簡掉我用的WP-RecentComments了。
有些疑問:1.這段代碼究竟加在哪裡,有什麼要注意的嗎?2.我那裡需要將頭像顯示在左邊,如何設置?3.頭像的大小、評論的字數是自動調整,無需人工干預嗎?
1. 哪裏用就貼哪裏, 一般是在 sidebar.php. 其中 h3 和 class 要改和你模板匹配.
2. 頭像的 class="avatar", 要在 style.css 定義 .avatar{ ..你設計的式樣.. }
3. 頭像的大小就用 .avatar 定義, 其中 SUBSTRING(comment_content,1,22) 的 22 就是評論的字數.
感謝您的精心指點!
您好,我使用了您這個代碼想實現無插件的 Recent Comments 功能(我貼在 sidebar),但是卻出現了以下錯誤訊息:
Fatal error: Call to a member function get_results() on a non-object in /home2/carrieli/public_html/blogs/wp-content/plugins/exec-php/includes/runtime.php(42) : eval()'d code on line 3
不知道這代表甚麼?是我的 Exec-PHP 插件的關係嗎?可是我有開放這個插件在側欄使用 PHP 代碼功能呢!
我改用帶頭像顯示的最新評論代碼 - 完善篇這篇改寫你的代碼的文章之後就正常了,但是頭像還是無法顯示
有沒有錯誤訊息?
用 zwwooooo 的代碼沒有錯誤訊息,不過頭像就是預設的謎樣人物,而不是我自己或是訪客的。
但是用了你的則是會出現錯誤訊息
Fatal error: Call to a member function get_results() on a non-object in /home/carrieli/public_html/blogs/wp-content/plugins/exec-php/includes/runtime.php(42) : eval()'d code on line 4
不知道是什麼原因引起的
我代碼中用了緩存, 要改為不用緩存的代碼.
不好意思,可是我在這裡只看到你這個有加上頭像緩存的代碼呢……哪一個才是沒有緩存的呢?抱歉,對這些代碼不是很熟悉。
1.刪掉 $a = 'avatar/'.md5(strtolower($rc_comm->comment_author_email)).'.jpg';
2.改 <img src='" . $a . "' alt='' title='" . $rc_comm->comment_author
. "' class='avatar' />
為 <?php echo get_avatar($comment,$size='50',$default='<path_to_url>' ); ?>
上面 <path_to_url> 是 default 頭像位址.
還有一件事要提醒, 這個版本是將 comment_content 全文輸出, 再用 css 定義 overflow:hidden; 隱藏超出的部份, 如果要用 SUBSTRING() 截斷字數也可以, 請參考 zwwooooo 的版本.
按照你的解說,我將代碼改成了
<ul class="recentcomments">
<?php
$my_email = "'" . get_bloginfo ('admin_email') . "'";
$rc_comms = $wpdb->get_results("
SELECT ID, post_title, comment_ID, comment_author, comment_author_email, SUBSTRING(comment_content,1,18) AS com_excerpt
FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts
ON ($wpdb->comments.comment_post_ID = $wpdb->posts.ID)
WHERE comment_approved = '1'
AND comment_type = ''
AND post_password = ''
AND comment_author_email != $my_email
ORDER BY comment_date_gmt
DESC LIMIT 5
");
$rc_comments = '';
foreach ($rc_comms as $rc_comm) {
$rc_comments .= "<li><?php echo get_avatar($comment,$size='50',$default='<path_to_url>' ); ?><a href='"
. get_permalink($rc_comm->ID) . "#comment-" . $rc_comm->comment_ID
. "' title='on " . $rc_comm->post_title . "'>" . strip_tags($rc_comm->com_excerpt)
. "</a></li>\n";}
$rc_comments = convert_smilies($rc_comments);
echo $rc_comments; ?>
</ul>
可是卻還是出錯了,以下是錯誤訊息:
Fatal error: Call to a member function get_results() on a non-object in /home/carrieli/public_html/blogs/wp-content/plugins/exec-php/includes/runtime.php(42) : eval()'d code on line 4
不曉得是不是我改錯了,或是我哪裏理解錯誤呢?
看來是 plugin/exec-php 的 get_results() 錯誤, 可能是沒 global $wpdb;
另外, 我上次給的 <?php echo get_avatar($comment,$size='50',$default='<path_to_url>' ); ?>
若已在 <php ... ?> 之內就不用 <php ... ?> 了, 抱歉, 是我寫錯.
所以應該是:
<?php
global $wpdb;
$my_email = "'" . get_bloginfo ('admin_email') . "'";
$rc_comms = $wpdb->get_results("
SELECT ID, post_title, comment_ID, comment_author, comment_author_email, SUBSTRING(comment_content,1,18) AS com_excerpt
FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts
ON ($wpdb->comments.comment_post_ID = $wpdb->posts.ID)
WHERE comment_approved = '1'
AND comment_type = ''
AND post_password = ''
AND comment_author_email != $my_email
ORDER BY comment_date_gmt
DESC LIMIT 5
");
$rc_comments = '';
foreach ($rc_comms as $rc_comm) {
$rc_comments .= "<li>" . get_avatar($comment,$size='50',$default='<path_to_url>' ) . "<a href='"
. get_permalink($rc_comm->ID) . "#comment-" . $rc_comm->comment_ID
. "' title='on " . $rc_comm->post_title . "'>" . strip_tags($rc_comm->com_excerpt)
. "</a></li>\n";}
$rc_comments = convert_smilies($rc_comments);
echo $rc_comments; ?>
</ul>
嗯,改成這樣的代碼的確就能正常顯示了,不過留言者的頭像卻變成都是預設的謎樣人物頭像,反而不會顯示他們在 Gravatar 的頭像了耶~
我現在部落格首頁的 sidebar 有掛上,你可以抽空幫我看一下嗎?我這次貼的代碼完全就是你上面改過的那段代碼,其它我都沒有變更了。
get_avatar($comment,$size='50', ...
改:
get_avatar($rc_comm,$size='18', ...
剛沒注意到變量改了, sorry.
而且 $size 就是大小.
成功了~謝謝!現在已經正常顯示了,好開心喔
要謝謝你這段時間以來一直這麼有耐心回覆我的種種問題喔
因為這樣,我的插件已經減量為 25 個了,你上次說過我的插件多到讓你眼花撩亂,現在已經減少很多囉
谢谢博主你的文章帮了我很大的忙,这样我又少用了一个插件。
不客氣~
客服给我的回复“这种情况就算现在可以用,过两天照样用不了。现在管理SPAM邮件太严了。没有正式域名的IP发出的邮件全部当成SPAM处理。所以为了长久请使用ESMTP发送”
不是程序问题,是空间完蛋了。
還是有辦法試試, 查找你服務器 ESMTP 發信的檔頭, 一模一樣地寫進這程式, 不知可行嗎?
我再试试看,折腾的精神就是永不止步。
非常感谢大师最近给予的帮助
留言发错了地方,我收藏了这页,想起来就直接留言了
郁闷了,为了原生的嵌套评论我换了评论模板,正常了,而且AJAX提交特效也正常了,就是这邮件提醒没弄明白
把郵件提醒 copy 到 comments-ajax.php 最下面就行了, 沒動作嗎?
考过去了依然不行,我换了套主题也不行。
等下我换默认主题,用Mail to commenter自带的测试再发一次,说不定是空间出了问题。
發郵件的條件你可只留第一個, 其它先拿掉試試.
那也很奇怪啊,我换成了默认主题,没加任何额外的代码,然后用插件自带的测试跟这些都有关系,依然收不到,这下灵异了。
我空间的探针http://laonb.com/testhost.php
大师帮我看看。
最下面 "函数支持情况检测" 確定 "mail" 函數是可用. "邮件发送支持情况检测" 也發送成功, 可是, 到現在還沒收到郵件...
就怕问题出在空间上了,我明天白天联系下客服,期待这个弄好,再换上你的小墙,我就只有6个插件了。
看来是我空间的问题,再等两天看看吧。
发现个问题,请教willin:就是如果评论是“带链接的 @用户”开头的评论不能截取评论内容,有没有方法解决?也就是说不能 [a href=""]xxx[/a]开头评论
WP 是會自動過濾, 否則連貼圖都上去了, 那版面不是要撐破了嗎. 看到 @ 就頭痛, 棄用它吧~
我的主题5级嵌套后的评论就用@方式的,我觉得很好。不过既然是防止贴图问题不理也罢,毕竟讨论到5级嵌套的评论很少
貼圖只是我舉的例, 它主要就是過濾代碼, 避免漏洞供黑客入侵.
谢谢博主分享,我不懂 代码中的comment_author 全部都要改为我的名字 还是? 请指点 ,谢谢
还有 你这个最新的评论会显示几条评论?
comment_author != 'willin' 後面這個 willin 改成你的名字.
LIMIT 10 是 10 篇評論, 可改為你想要的,
我想怎么登不了,原来是另辟蹊径啊
要不是悬浮在链接上的缩略图,我还以为是浏览器的问题呢。以前的主题华丽,现在的清爽,我觉得更适合给我用
這主題跟你的也很像, 追求簡單.
我其实是附庸风雅啦
小弟也来敬仰一下!顺便问一下,这个鼠标在名字上有缩略图是怎么做到的?
這你可參考 "ShrinkTheWeb – 網頁縮略圖服務":
http://kan.willin.org/?p=1275
浮現的js效果是自己加的.
这个模板的气势把我吓到了!
研究得好深入。。
对于wp插件我是那种拿来就用的。。
代碼不是很難, 看多自然就會了, 久了自己也會寫.
如果带邮件提醒功能就更完美了。
Ajax-Comments v1.26 是寫好了, 只是沒放出, 當有回覆會給你自動郵件.
你已经在用了,我已经收到你的回复邮件了,期待了^ ^
坐板凳慢慢看~
貴賓別坐板凳, 套房留給你.
呵呵,我就是用这个方法输出最近评论者头像的~~支持一下!
看来我要深入学习一下了
這些知識永遠都學不完哈~
几天不来。willin 大师又有新杰作了, 学习了
我把以前的剩飯拿出來熱炒一下而已... 其實沒什麼.
代码写得很漂亮~
喔~ 說的也漂亮~
willin大师的杰作总是这么平易近人
謝謝! WP 就是要簡單才會快~
又是一个好东西,请问下willin,我的是用小工具添加的侧边栏,这样的话要怎么做?如果直接写进sidebar.php的话貌似要全部禁用小工具才会显示。。。
小工具是在 if ... dynamic_sidebar() 和 endif; 區間, 在中間插入就能加了.
哦,等过会去研究下,笔记本刚刚花屏,实在悲剧,在此再次鄙视hp。。。。
我好像說錯了, 忘了加在裏面還是外面.... 我剛看我的是加外面, 你都試試.
hp, hp, hp 我的打印機什麼時候才能正常工作... 墨水又貴死人!!!
两种都不行。。。放在外面是出现错误,放里面没反应,我看之前有人问过如何缓存Recent Comments的头像,我用这方法吧,能指点下不?谢谢了。。
哈哈! 原來你也用 wp-recentcomments, 郵件已發.
恩,对啊,这东西太出名了,希望你的以后也能有这么出名,嘿嘿。
已经修改好了,运行良好。
再次感谢热心的Willin!
不客氣~
我不做插件, 也不望出名, 一切低調~ 再低調~
哪天如果太出名, "willin" 會失蹤, 用另一個名字再出來...
哈哈,willin很淡定啊~~
我很怕出名...
willin总能找到实现功能或者解决问题的最简捷方法~~
膜拜~~
謝謝! 客氣了~