首先要说明的是,这个功能目前还只是自己个人实验性质的东西,而且并不打算应用到博客里面。如果需要较好的实现此功能,有更好的插件能实现。

所谓“悄悄话”,很明显,就是该评论只对某人和自己显示(管理员也是可见的),同时他人没有回复的权利(看不到内容还回个毛),这个玩过随便一种社交产品的都能理解。个人感觉对于 1.没有女朋友 2.没什么人气 3.博客这样的地方,实际用处并不是很大,不过就一玩票性质的东西嘛,纯粹就是练练手,尝试写点简单的东西,由浅入深,以后才能做点像样的东西出来嘛 :smile:


我这注释非常详细,因为没准我自己什么时候就忘掉了。
主题 function.php 加入:

<?php
//创建名为comment_whisper的函数,参数为评论的ID。
function comment_whisper($comment_id) {
//获取评论ID的完整内容。
$comment_whisper = get_comment($comment_id);
//判断这条评论是否存在父级,有存入真,无存入假。
$parent_id = $comment_whisper->comment_parent ? $comment_whisper->comment_parent : '0';
//如果有父级评论:
if ($parent_id != '0'){
//获取父级评论 ID 的完整内容
$comment_parent =  get_comment($parent_id);
//父级是否为悄悄话,是存入真,否存入假
$parent_whisper = $comment_parent->comment_whisper ? '1' : '0' ;
};
//声明
global $wpdb;
//如果数据库中 comments 得 table 不存在 comment_whisper 的 column。
if ($wpdb->query("Describe {$wpdb->comments} comment_whisper") == '')
//则新建一个 column,设默认值为0。
$wpdb->query("ALTER TABLE {$wpdb->comments} ADD COLUMN comment_whisper TINYINT NOT NULL DEFAULT 0;");
//如果1:父级为悄悄话;2:此评论本身就为最高级并且选中了悄悄话的 checkbox
if ($parent_whisper == '1' || ($parent_id == '0' && isset($_POST['comment_whisper'])))
//将数据库相关 column 写为1
$wpdb->query("UPDATE {$wpdb->comments} SET comment_whisper='1' WHERE comment_ID='$comment_id'");
}
//加入钩子,在发表评论时执行。
add_action('comment_post', 'comment_whisper');
?>

主题 function.php 显示评论处加入:

//在类似语句之后
<?php
function comment($comment, $args, $depth) {
//先获取评论内容
$GLOBALS['comment'] = $comment; 
//获取评论是否为悄悄话
$comment_whisper = get_comment($comment_id);
//是否显示评论的判断式 1:评论不是悄悄话 2:是否是管理员 3:是否是评论者本人 。以上符合一点就可以显示。
$whisper_display= $comment->comment_whisper == 0 || current_user_can('level_10') || ($comment->comment_author_email == $_COOKIE["comment_author_email_" . COOKIEHASH]) ? 1 : 0 ;
 
//当前评论是否有权限显示,无权限则显示(这是一条悄悄话评论...)。
<div class="comment_text">
<?php if ($whisper_display): comment_text();else :echo '(这是一条悄悄话评论...)';endif;?>
</div>
//判断是否需要隐藏回复按钮。
<div class="reply">
<?php if ($whisper_display):?>
<?php comment_reply_link(array_merge( $args, array('depth' => $depth, 'max_depth' => $args['max_depth']))) ?>
<?php endif; ?>
</div>

大体即为如此,是按照最大为两层嵌套实现的。多层嵌套中容易出现很多问题,限于语言表达能力十分有限,不细说,所以最终还是决定,只有在父级评论为隐藏时,所有的子级评论都是悄悄话(此时只有评论者和管理员才能查看和回复)。非悄悄话的父级评论,子评论不能使用悄悄话回复功能(其实对于复杂的悄悄话的逻辑判断,最好还是将被回复者的 email 加入到评论的表中,这样对于是否显示的判断和多层嵌套会有更好的帮助)。按需隐藏悄悄话 checkbox 也很简单,只需要在不能被悄悄话回复的 ID 中加上一个特殊的 class,利用 jQuery 判断 class 是否存在来隐藏或显示 checkbox。
此外还有一个很重要的缺点,这个功能目前还不能隐藏 feed 输出中的悄悄话评论,不过这应该不会太难。

写完之后感觉其实最大的收获就是俩地方:
第一个是is_admin(),乍一看总是觉得就是判断当前用户是否为管理员的,可实际上这是判断是否是后台的函数,和is_page()等的性质一样,是判断页面的。应该用current_user_can('level_10')判断用户的权限。
第二个是 $_COOKIE["comment_author_email_" . COOKIEHASH]是获取用户 cookie 中 email 信息的,利用这个来判断当前访问者是否是过去发表悄悄话的人,只要 email 一致,就认为是同一人,就对当前用户显示自己和管理员回复的悄悄话。
等有时间了再继续完善吧。

  1. 曾经在别的博客看到过类似的。但是对于不是那种人流量高的博客来说,实用性的确是…… :appall: