宝宝健康成长网首页刘易桉宝宝健康成长 林林微博 育儿护理知识 宝宝网址导航
当前位置: 首页 >> 宝宝建站 >> wordpress非插件实现评论邮件回复

wordpress非插件实现评论邮件回复

评论邮件回复通知的实现是WordPress的一大进步。它提供了良好的用户体验,促进了blogger之间的交流。虽然访客留言数极少,但我一直启用着WordPress 评论邮件回复功能。之前使用的是ThinkAgain的Mail To Commenter插件,它的功能其实非常简单,通过判断评论内容是否含有@user 这样的代码,如果有的话,会将评论内容用邮件发送给user。不过,在拜读Willin大师的Comment Mail Notify一文后,我尝试着在当前的theme下实现非插件评论回复邮件通知。

我现在这个theme制作好已经2年有余,很多代码已经落伍了,就拿这次尝试Wordpress非插件实现评论回复邮件通知功能来讲,首先遇到了“內置嵌套留言”不能实现的问题,(汗~)要知道WP2.7可就内置了嵌套回复。Comment Mail Notify 需要內置嵌套模板来支持,所以先来想想怎么激活Wordpress内置的嵌套回复

1、修改当前theme的comments.php,主要是在<?php if ($comments) : ?>后面添加Wordpress自带的wp_list_comments()函数。关于wp_list_comments函数更多请参阅官方文档

下面是Scird theme的comments.php,仅供参考

<?php // Do not delete these lines
if (‘comments.php’ == basename($_SERVER['SCRIPT_FILENAME']))
die (‘Please do not load this page directly. Thanks!’);

if (!empty($post->post_password)) { // if there’s a password
if ($_COOKIE['wp-postpass_' . COOKIEHASH] != $post->post_password) { // and it doesn’t match the cookie
?>

<p class=”nocomments”><?php _e(‘This post is password protected. Enter the password to view comments.’); ?></p>

<?php
return;
}
}

/* This variable is for alternating comment background */
$oddcomment = ‘class=”alt” ‘;
?>

<!– You can start editing here. –>
<div id=”cmts”>
<?php if ($comments) : ?>
<h3 id=”comments”><?php comments_number(‘No Responses’, ‘One Response’, ‘% Responses’ );?> to &#8220;<?php the_title(); ?>&#8221;</h3>

<ol class=”commentlist”>
<?php wp_list_comments(); ?>
</ol>

<?php else : // this is displayed if there are no comments so far ?>

<?php if (‘open’ == $post->comment_status) : ?>
<!– If comments are open, but there are no comments. –>

<?php else : // comments are closed ?>
<!– If comments are closed. –>
<p class=“nocomments”>Comments are closed.</p>

<?php endif; ?>
<?php endif; ?>

<?php if (‘open’ == $post->comment_status) : ?>

<div id=”respond”>

<h3><?php comment_form_title( ‘发表评论’, ‘Leave a Reply to %s’ ); ?></h3>

<div class=”cancel-comment-reply”>
<small><?php cancel_comment_reply_link(); ?></small>
</div>

<?php if ( get_option(‘comment_registration’) && !$user_ID ) : ?>
<p>You must be <a href=”<?php echo get_option(‘siteurl’); ?>/wp-login.php?redirect_to=<?php echo urlencode(get_permalink()); ?>“>logged in</a> to post a comment.</p>
<?php else : ?>

<form action=”<?php echo get_option(‘siteurl’); ?>/wp-comments-post.php” method=”post” id=”commentform”>

<?php if ( $user_ID ) : ?>

<p>Logged in as <a href=”<?php echo get_option(‘siteurl’); ?>/wp-admin/profile.php”><?php echo $user_identity; ?></a>. <a href=”<?php echo wp_logout_url(get_permalink()); ?>” title=”Log out of this account”>Log out &raquo;</a></p>

<?php else : ?>

<p><input type=”text” name=”author” id=”author” value=”<?php echo $comment_author; ?>” size=”22″ tabindex=”1″ />
<label for=”author”><small>称呼 <?php if ($req) echo “(必填)”; ?></small></label></p>

<p><input type=”text” name=”email” id=”email” value=”<?php echo $comment_author_email; ?>” size=”22″ tabindex=”2″ />
<label for=”email”><small>邮箱 (不会公开) <?php if ($req) echo “(必填)”; ?></small></label></p>

<p><input type=”text” name=”url” id=”url” value=”<?php echo $comment_author_url; ?>” size=”22″ tabindex=”3″ />
<label for=”url”><small>网站</small></label></p>

<?php endif; ?>

<p><textarea name=”comment” id=”comment” cols=”100%” rows=”10″ tabindex=”4″></textarea></p>

<p><input name=”submit” type=”submit” id=”submit” tabindex=”5″ value=”发表评论” />
<?php comment_id_fields(); ?>
</p>
<?php do_action(‘comment_form’, $post->ID); ?>

</form>

<?php endif; // If registration required and not logged in ?>
</div>

<?php endif; // if you delete this the sky will fall on your head ?>
</div>

2、修改当前theme的 functions.php, 添加以下代码到<?php ….. ?>中

function mytheme_comment($comment, $args, $depth) {
$GLOBALS['comment'] = $comment; ?>
<li <?php comment_class(); ?> id=”li-comment-<?php comment_ID() ?>“>
<div id=”comment-<?php comment_ID(); ?>“>
<div class=”comment-author vcard”>
<?php printf(__(‘<cite class=”fn”>%s</cite>’), get_comment_author_link()) ?>
</div>
<?php if ($comment->comment_approved == ’0′) : ?>
<em><?php _e(‘Your comment is awaiting moderation.’) ?></em>
<br />
<?php endif; ?>
<div class=”comment-meta commentmetadata”><a href=”<?php echo htmlspecialchars( get_comment_link( $comment->comment_ID ) ) ?>“><?php printf(__(‘%1$s at %2$s’, ‘stheme’), get_comment_date(), get_comment_time()) ?></a><?php edit_comment_link(__(‘(Edit)’, ‘stheme’),‘  ‘,) ?></div>
<?php get_avatar($comment,$size=’32′,$default=‘ ‘ ); ?>
<?php comment_text() ?>
<div class=”reply”>
<?php comment_reply_link(array_merge( $args, array(‘depth’ => $depth, ‘max_depth’ => $args['max_depth']))) ?>
</div>
</div>
<?php
}

3、通过以上两步已经实现嵌套回复,我们还需要添加一些css代码到style.css

#cmts {width:500px;height:100%;overflow:hidden;margin:0 20px;}
ol.commentlist li {list-style:none;border:1px solid #CAEBF6;background:#E7F6FB;margin:10px 0;padding:3px 10px;}
.commentlist li .avatar{float:right;border:1px solid #eee;background:#fff;padding:2px;}
.commentlist cite,.commentlist cite a{font-weight:700;font-style:normal;}
.commentlist p {line-height:120%;padding:0 5px;}
.nocomments{text-align:center;margin:0;padding:0;}
#commentform #email,#commentform #author,#commentform #url{border:1px solid #CAEBF6;margin:3px 0;padding:2px;}
#commentform textarea{width:450px;height:200px;border:1px solid #CAEBF6;margin:3px 0;}
#commentform #submit{background:#E7F6FB;border:2px solid #CAEBF6;margin:3px 0;}
.reply{margin:0;padding:0 0 2px;}
.reply a{background:#E7F6FB;border:2px solid #CAEBF6;padding:2px 5px;}

以上三步即可实现Wordpress内置的嵌套回复,贴出我的theme代码只是为了更直观理解,使用时酌情增删。

下面一部分就是添加回复邮件通知代码。这里需要注意:你的服务器一定要有 mail() 功能。测试方式:在后台登陆页故意按下”忘記密码”, 收到邮件通知就有 mail() 功能。否则没有,需要SMPT 插件。

Willin大师的Comment Mail Notify一文中提供了三种代码。我采用了第三种,不多说,上代码(已简化哈!)

function comment_mail_notify($comment_id) {
$comment = get_comment($comment_id);
$parent_id = $comment->comment_parent ? $comment->comment_parent : ”;
$spam_confirmed = $comment->comment_approved;
if (($parent_id != ”) && ($spam_confirmed != ‘spam’)) {
$wp_email = ‘no-reply@’ . preg_replace(‘#^www\.#’, ”, strtolower($_SERVER['SERVER_NAME']));
$to = trim(get_comment($parent_id)->comment_author_email);
$subject = ‘您在 [' . get_option("blogname") . '] 的留言有了回应’;
$message = ‘
<div style=”background-color:#eef2fa; border:1px solid #d8e3e8; color:#111; padding:0 15px; -moz-border-radius:5px; -webkit-border-radius:5px; -khtml-border-radius:5px;”>
<p>’ . trim(get_comment($parent_id)->comment_author) . ‘, 您好!</p>
<p>您曾在《’ . get_the_title($comment->comment_post_ID) . ‘》的留言:<br />’
. trim(get_comment($parent_id)->comment_content) . ‘</p>
<p>’ . trim($comment->comment_author) . ‘ 給您的回应:<br />’
. trim($comment->comment_content) . ‘<br /></p>
<p>您可以点击 <a href=”‘ . htmlspecialchars(get_comment_link($parent_id)) . ‘”>查看回应完整内容</a></p>
<p>感谢您对 <a href=”http://biotechgo.net/blog”>百奥博</a> 的关注, 欢迎<a href=”http://biotechgo.net/blog/feed/” target=”_blank”>订阅本站</a></strong></p>
<p>(此邮件由系统自动发布,不可以直接回复此邮件与我联系)</p>
</div>’;
$from = “From: \”" . get_option(‘blogname’) . “\” <$wp_email>”;
$headers = “$from\nContent-Type: text/html; charset=” . get_option(‘blog_charset’) . “\n”;
wp_mail( $to, $subject, $message, $headers );
//echo ‘mail to ‘, $to, ‘<br/> ‘ , $subject, $message; // for testing
}
}
add_action(‘comment_post’, ‘comment_mail_notify’);

这段代码要加在嵌套回复代码的前面。还有,就是没有添加jQuery,但效果已经不错了。

好了,就到这里。请试着在本文留言则个。

敬请留言当前共有 31 条评论

  1. Dianso 说道:

    实现嵌套回复很麻烦。。。。。。。。

  2. hzlzh 说道:

    老早就打算去掉mail to comment 插件了,一直懒得这趟。还好现在就10个插件启用着

  3. 学夫子 说道:

    我实在是太懒了,直接用插件了,哈哈,在wp由于主机不支持,硬是没有弄成,用了emlog后,一个插件就搞定了

  4. SJY 说道:

    我现在用免费主机,mail函数被屏蔽了,不过还是学了点东西。

  5. 二手科学家 说道:

    可以试试SMPT 插件。欢迎来访!

  6. 二手科学家 说道:

    我还剩3个plugin了!减少插件并不是最主要的,主要的是享受去掉插件的挑战。吼吼

  7. SJY 说道:

    试了几个不行,还在观望。我用的的是godaddy的免费win主机

  8. bojone 说道:

    很好呀,看来扩展性很强,能不能为typecho也研究这样的功能(不用插件)

  9. 抓虾米 说道:

    博主下面那个手气不错是怎么搞的?挺喜欢。

  10. 午夜客 说道:

    太麻烦 了。

    还是用个插件算了!

  11. 二手科学家 说道:

    欢迎著名的午夜客光临!我最早用的也是免费的ru域名,现在还在。

  12. 皇家元林 说道:

    嗯 这个很不错,我希望以后可以整合在主题里。。不太喜欢那么多插件

  13. 宝宝健康成长 说道:

    ru域名好像已经被那个了

  14. 二手科学家 说道:

    我是在挑战少用插件,目前只剩3个了。

  15. 吓我一跳 说道:

    感谢分享 我试着一定要添加这个功能

  16. 二手科学家 说道:

    非插件调用,可以减少不必要的js等文件,提速效果很明显

  17. 很模糊。。 说道:

    我留言了,看下回复的邮件是什么个地址。。
    我一直不太清楚那个邮件是用哪个地址发的,哪个账号密码。。或许根本就是只要给个回复邮件用的的邮箱地址就可以了?(我以前就有记过一个网址可以随意模拟发件人来发邮件,难道WP就是这种的?)

  18. 很模糊。。 说道:

    自己回复下会有邮件不0.0

  19. 二手科学家 说道:

    回复的邮件地址是个虚构的email,好象是admin@domain.name

  20. 很模糊。。 说道:

    你这里的是用的no-reply#domain
    主要我换过3次空间,关于回复通知的插件也试过几个,可是一直没成功,很无奈。。我用postie发文章到挺好的= =!

  21. C瓜哥 说道:

    有点复杂,受教了!

  22. proe 说道:

    好复杂啊,不是在function文件增加函数就可以了吗?

  23. 二手科学家 说道:

    首先要保证当前theme的comments.php支持嵌套回复。然后才修改function.php

  24. 胡雪岩 说道:

    看起来是乎有点复杂,学习中,博主是乎很优秀啊

  25. yesureadmin 说道:

    学习了,马上试试

  26. 阿溪 说道:

    好像很麻烦的样子!!!
    还是算了吧!

  27. glass fence 说道:

    our favourite websites:…

    todays best sites:…

  28. 二手科学家 说道:

    折腾我一晚上,还好搞定了。不管怎么样,又少了个插件。你的blog太漂亮了,再赞一个

  29. 二手科学家 说道:

    用的随机文章代码

发表评论

^留言没头像?教你设置头像!
我的应用 Follow@cnbabyup 宝宝问答>  0-1岁  1-3岁  3-6岁 手气不错