增强 WordPress 2.7 的评论显示
本文为翻译+演绎文章,原文 Enhanced Comment Display
在 WordPress 2.7 中,内置了对评论嵌套和分页的支持。你所使用的主题可能仍然可以继续使用,但不做一些改动是不能使用这些新功能的。本文的目的就是给你一个指南,如何为主题加入评论嵌套和分页功能。
本文很大程度上参照了 Otto 的 WordPress 2.7 Comments Enhancements 一文。
为了能够更好的理解下面所讲述的内容,你可以参照默认主题的 comments.php 这个文件。
侦测 WordPress 2.7
如果要使主题能向前兼容,有个很简单的方法,调用 wp_list_comments(),就像下面这样:
// new comments.php stuff
else:
// old comments.php stuff
endif;
当然,还可以通过检测版本号来实现,不过上面的方法更好一些,因为我们针对某一特定的函数进行了侦测。
更进一步的,我们可以将老的评论代码写进一个独立的文件,比如说 legacy.comments.php,然后在适当的地方调用这一文件。下面的代码是一个简单的示例。
add_filter(’comments_template’, ‘legacy_comments’);
function legacy_comments($file){
if (!function_exists(’wp_list_comments’))
$file = TEMPLATEPATH . ‘/legacy.comments.php’;
return $file;
}
?>
把上面这段代码写入主题的 functions.php 中。如果使用的是 WordPress 2.7 之前的版本,系统会自动调用 legacy.comments.php,以保证主题向前兼容。
检测密码保护
将下面的代码写入 comments.php 的开头,它的作用是支持密码保护。这和以前通过检测 cookie 的作用是相同的,不过 WordPress 2.7 加入了专门的函数来实现。推荐使用新的方法,以免以后做出改动。这段代码本身会向前兼容。
die (’Please do not load this page directly. Thanks!’);
if(post_password_required()){
echo ‘<p class="nocomments">This post is password protected. Enter the password to view comments.</p>’;
return;
}
评论循环
WordPress 2.7 的评论循环大致如下,相对于之前的版本做了一定的简化。
<?php $comment_count = get_comment_count($post->ID); echo $comment_count['approved']; ?> Comments
<ul class="commentlist">
<?php foreach( $comments as $comment ) :
// stuff to display the comment in an LI here
endforeach;
?>
</ul>
<?php else:
if(’open’ == $post->comment_status):
// If comments are open, but there are no comments.
else:
// comments are closed
endif;
endif;
这段代码会进行一个循环检测,然后输出所需内容。看上去是很简单,不过对于喜欢自动以输出结果的人来说,显得过于不可定制化。
新的评论循环很简洁,而且看上去更像一个文章循环。
<h4 id="comments"><?php comments_number(’No Comments’, ‘One Comment’, ‘% Comments’ );?></h4>
<ul class="commentlist">
<?php wp_list_comments(); ?></ul>
<div class="navigation">
<div class="alignleft"><?php previous_comments_link(); ?></div>
<div class="alignright"><?php next_comments_link(); ?></div>
</div>
<?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.
else : // comments are closed
endif;
endif;
上面是一个完整的评论循环,没有被精简。除非你需要加入对“没有评论”或“评论关闭”的支持。
针对上面的代码,有三个部分要着重说明一下。
- 函数
have_comments()替换了原来对全局变量$comments的检测; - 函数
wp_list_comments()输出所有的评论,同时实现嵌套,加入一些 classes,和其他的一些功能; - 有一个新的导航部分对评论进行分页;
评论中 Javascript 的支持
为了能够充分使用评论中的 Javascript 支持,必须做出以下改动。
实现评论嵌套,请在主题的 header.php wp_head() 之前加入以下代码:
这段代码加入评论回复功能所需的 Javascript,WordPress 不会自动加入这段代码,所以手动加入是唯一选择。
在评论表格中加入以下代码:
这段代码向评论表格中加入了两个隐藏的输入框:comment_post_ID 和 comment_parent。如果评论表格中已经有了 comment_post_ID,必须将它删除。comment_parent 是共评论回复所需的 Javascript 使用,以实现评论的嵌套。
评论输入去的 textarea 必须有一个 id="comment",Javascript 通过它来实现聚焦。如果你在其他地方使用了这个 id,将它修改为其他的名字,因为 id 具有唯一性。
同时,整个评论表格必须嵌套在一个 div 中,并且赋予 id="respond"。在某些主题中往往会包含一个锚记:
这个锚记的作用是直接链接到文章的评论区。现在我们还需要这样的功能,但同时我们还要将它用于 Javascript,使整个评论表格移动到需要回复评论的地方。所以我们将整个评论表格嵌套在一个 div 中,并将 respond 这个 id 赋予它。
接下来,将 “Leave a Comment” 替换为:
这段代码会给评论表格一个 “Leave a Reply” 的标题,而当回复某人的评论时就会变成 “Leave a Reply to xxx”。如果要改变标题文字,可以修改这个函数的两个参数:
%s 会被自动替换称所回复评论的作者名字。如果没有包含上面的 wp_enqueue_script('comment-reply') 来调用所需 Javascript,就不会看到回复评论的链接。
最后,如果某人点击了回复评论的链接,评论表格已经出现了,而他却不想回复了,这时就需要一个取消回复的功能。下面的代码会实现取消回复,将这段代码放在评论表格的标题下。
<small><?php cancel_comment_reply_link() ?></small>
</div>
CSS 样式
新的评论循环,将每一个评论放入一个 li 中,也很好的做了嵌套的支持,将嵌套评论放入更深一层的 ul/li 中。而且还为每一个 li 加入了丰富的 class,简介如下。
comment/trackback/pingback:根据评论的类型加入三者之一;byuser:如果评论来自站点注册用户;comment-author-authorname:针对某一特定的注册用户;bypostauthor:针对该文章作者的评论;odd/even:针对评论的奇偶次序;alt:每隔一个评论加入;thread-odd/thread-even/thread-alt:类似于odd/even/alt,不过只针对一群评论和回复的顶级;depth-1:评论的顶级,depth-2是第二级,依此类推;
WordPress 提供了一个 comment_class filter,允许加入自己定义的 class,下面是一个例子。
这个例子为每个评论的评论作者和评论作者的 email 加入 microid,可以通过插件来实现,或者将代码写入主题的 functions.php。
function comment_add_microid($classes){
$c_email=get_comment_author_email();
$c_url=get_comment_author_url();
if(!empty($c_email) && !empty($c_url)){
$microid = ‘microid-mailto+http:sha1:’ . sha1(sha1(’mailto:’.$c_email).sha1($c_url));
$classes[] = $microid;
}
return $classes;
}
add_filter(’comment_class’,'comment_add_microid’);
这段代码将某个特定的 class 加入评论,而其他的 class 还是由 WordPress 自动加入。
自定义评论布局和显示格式
WordPress 默认通过内置的函数来显示评论,如果需要按照自己的方式来调整评论显示,通过设定 wp_list_comments() 的 callback 参数实现。(译者注:callback 的进一步资料这篇文章没有提供,有待后续补充。)
WordZine 的新 Feed: http://feed.wordzine.cn
© Andor for WordZine, 2008. |
Permalink |
No comment |
Add to
del.icio.us















