最新評論 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 無法更新.
 
 

92 篇回應 (訪客:53 篇, 博主:35 篇, 引用:4 篇)

  1. 阿疯 ~

    能问下,为什么我使用代码添加到侧边栏会出现重复的。最近评论。
    wordpress3.01的。
    我无奈。
    http://www.yshe.net

    • 阿疯 ~

      是我自己的问题。找到解决方法了。
      能给下你的CSS截断语句吗?
      上面这部分没有截断语句,超出部分会乱成一团

  2. 新主题上用上这个吧。。呵呵

  3. 今天帮朋友折腾了下出问题了,应该是
    $a = 'avatar/'.md5(strtolower($rc_comm->comment_author_email)).'.jpg';
    是不是应该改为:
    $a = get_bloginfo('wpurl') . '/avatar/'.md5(strtolower($rc_comm->comment_author_email)).'.jpg';

  4. 还是用你这个吧,我那查询数太多

  5. ~

    使用了你的代码,用SUBSTRING(comment_content,1,16) AS com_excerpt 有些评论无法显示,但是 不用又不能截断评论字数

  6. 野兔 ~

    今天心血來潮,也來這裡折騰一番
    其中我稍微加了一些東西,太感謝willin提供的教學 ^^

  7.   太好了!大師這裡到處都是寶,怪我粗心了。加上這段代碼,就可以精簡掉我用的WP-RecentComments了。
      有些疑問:1.這段代碼究竟加在哪裡,有什麼要注意的嗎?2.我那裡需要將頭像顯示在左邊,如何設置?3.頭像的大小、評論的字數是自動調整,無需人工干預嗎?

    • willin ~

      1. 哪裏用就貼哪裏, 一般是在 sidebar.php. 其中 h3 和 class 要改和你模板匹配.
      2. 頭像的 class="avatar", 要在 style.css 定義 .avatar{ ..你設計的式樣.. }
      3. 頭像的大小就用 .avatar 定義, 其中 SUBSTRING(comment_content,1,22) 的 22 就是評論的字數.

  8. Carrie ~

    您好,我使用了您這個代碼想實現無插件的 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 代碼功能呢!

    • Carrie ~

      我改用帶頭像顯示的最新評論代碼 - 完善篇這篇改寫你的代碼的文章之後就正常了,但是頭像還是無法顯示 :?:

      • willin ~

        有沒有錯誤訊息?

        • Carrie ~

          用 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

          不知道是什麼原因引起的 :(

          • willin ~

            我代碼中用了緩存, 要改為不用緩存的代碼.

            • Carrie ~

              不好意思,可是我在這裡只看到你這個有加上頭像緩存的代碼呢……哪一個才是沒有緩存的呢?抱歉,對這些代碼不是很熟悉。

              • willin ~

                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 頭像位址.

              • willin ~

                還有一件事要提醒, 這個版本是將 comment_content 全文輸出, 再用 css 定義 overflow:hidden; 隱藏超出的部份, 如果要用 SUBSTRING() 截斷字數也可以, 請參考 zwwooooo 的版本.

                • Carrie ~

                  按照你的解說,我將代碼改成了

                  <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

                  不曉得是不是我改錯了,或是我哪裏理解錯誤呢?

                  • willin ~

                    看來是 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>

                    • Carrie ~

                      嗯,改成這樣的代碼的確就能正常顯示了,不過留言者的頭像卻變成都是預設的謎樣人物頭像,反而不會顯示他們在 Gravatar 的頭像了耶~

                      我現在部落格首頁的 sidebar 有掛上,你可以抽空幫我看一下嗎?我這次貼的代碼完全就是你上面改過的那段代碼,其它我都沒有變更了。

                  • willin ~

                    get_avatar($comment,$size='50', ...
                    改:
                    get_avatar($rc_comm,$size='18', ...
                    剛沒注意到變量改了, sorry.
                    而且 $size 就是大小.

                    • Carrie ~

                      成功了~謝謝!現在已經正常顯示了,好開心喔 :idea:
                      要謝謝你這段時間以來一直這麼有耐心回覆我的種種問題喔 :!:

                      因為這樣,我的插件已經減量為 25 個了,你上次說過我的插件多到讓你眼花撩亂,現在已經減少很多囉 :lol:

  9. mytion ~

    谢谢博主你的文章帮了我很大的忙,这样我又少用了一个插件。

  10. LAONB ~

    客服给我的回复“这种情况就算现在可以用,过两天照样用不了。现在管理SPAM邮件太严了。没有正式域名的IP发出的邮件全部当成SPAM处理。所以为了长久请使用ESMTP发送”
    不是程序问题,是空间完蛋了。

  11. LAONB ~

    留言发错了地方,我收藏了这页,想起来就直接留言了 :smile:

  12. LAONB ~

    郁闷了,为了原生的嵌套评论我换了评论模板,正常了,而且AJAX提交特效也正常了,就是这邮件提醒没弄明白 :?:

  13. 发现个问题,请教willin:就是如果评论是“带链接的 @用户”开头的评论不能截取评论内容,有没有方法解决?也就是说不能 [a href=""]xxx[/a]开头评论

  14. ql2445 ~

    谢谢博主分享,我不懂 代码中的comment_author 全部都要改为我的名字 还是? 请指点 ,谢谢
    还有 你这个最新的评论会显示几条评论?

  15. manu ~

    我想怎么登不了,原来是另辟蹊径啊
    要不是悬浮在链接上的缩略图,我还以为是浏览器的问题呢。以前的主题华丽,现在的清爽,我觉得更适合给我用 :idea:

  16. g ~

    小弟也来敬仰一下!顺便问一下,这个鼠标在名字上有缩略图是怎么做到的?

  17. kevin ~

    这个模板的气势把我吓到了!

  18. A.shun ~

    研究得好深入。。
    对于wp插件我是那种拿来就用的。。

  19. SMILE ~

    如果带邮件提醒功能就更完美了。

  20. 阿修 ~

    呵呵,我就是用这个方法输出最近评论者头像的~~支持一下! :!:

  21. 看来我要深入学习一下了

  22. 啊军 ~

    几天不来。willin 大师又有新杰作了, 学习了

  23. kangzj ~

    代码写得很漂亮~

  24. 万戈 ~

    willin大师的杰作总是这么平易近人 :arrow:

  25. Leo.N ~

    又是一个好东西,请问下willin,我的是用小工具添加的侧边栏,这样的话要怎么做?如果直接写进sidebar.php的话貌似要全部禁用小工具才会显示。。。

  26. willin总能找到实现功能或者解决问题的最简捷方法~~
    膜拜~~ :arrow:

留下評論

:?: :razz: :sad: :!: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: :smile: :evil:
貼圖 表情 ( ps. 若要貼代碼, 請將 "<" 改成 "&lt;" 即可, 此方法在所有 WP 網站均適用. )

Trackbacks/Pingbacks

  1. 带头像显示的最新评论代码 - 疯狂的世界 - 阿疯 --- 2010年 08月 19日
  2. 折腾之干掉插件疯狂篇 – 静夜燃香 --- 2010年 08月 03日
  3. Wordpress折腾手记 6 | A.shun's Blog --- 2010年 07月 08日
  4. 免插件最新评论代码-纠错篇 | 阿邙’S Blog --- 2010年 06月 23日

這篇文章上的評論 RSS feed TrackBack URL