前言
2.7新增了评论嵌套和分页功能。虽然并没有人要求你的主题必须和2.7兼容,但如果不升级主题以使其与2.7兼容,你就无法使用评论新功能。这篇文章将向大家介绍如何实现这一功能。
本篇文章是根据Otto的佳作WordPress 2.7 Comments Enhancements改编而成。
检查comments.php文件
首先,检查默认主题的comments.php文件。
检测WordPress 2.7
如果要使主题同时也可以向后兼容,只需编辑wp_list_comments()函数即可:
if ( function_exists('wp_list_comments') ) : // new comments.php stuff else : // old comments.php stuff endif;
虽然写出WordPress版本号也是个不错的方法,但这个方法则更好,因为它直接查看了需要使用的函数,而不是根据版本号推测。我们要尽量避免根据版本号主观臆测要使用的函数。
另一个更有趣的方法是把"old comments" php文件放在单独的文件中,include不同的php文件,让新版本与旧版本显示不同的内容(上面的写法也是,只是写在相同的文档而已)。这能让主题更好的兼容以前的版本:
<?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 文件后,老版本的主题就会使用"legacy.comments.php"文件。这样,你直接重命名旧comments.php文件以区别于新文件就可以了。以后修改代码就更方便了,聪明吧?!
密码保护
把以下代码插入到comments.php文件顶端就可实现日志的密码保护功能。
或许你已经注意到了这个代码和以前的使用方式类似(直接检查cookie),但是现在WordPress新增了具体函数来完成这一功能。现在,你应该使用这个函数以使其可以向前兼容更新的版本。
if (!empty($_SERVER['SCRIPT_FILENAME']) && 'comments.php' == basename($_SERVER['SCRIPT_FILENAME'])) 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; }
评论循环(Loop)
过去的评论循环是这样的(其实,真实的旧版本比其还要复杂):
if ($comments) : <?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;
一般来说,评论循环会手动检查评论,然后输出相应内容。虽然也非常容易,但毕竟还要手动执行。另外,这个代码并不连贯,主题编辑器(特别是定制比较复杂的主题时)对其也难以编辑管理。
新的评论循环则更为简单,和日志循环更为相似:
if ( have_comments() ) : ?> <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;
以上代码是完整的评论循环,没有精简任何内容。当然,除非你还想显示"no comments" (无评论)或"comments closed"(关闭评论)。
此外,还需了解以下三点:
- have_comments()函数代替了对全局变量$comments的检查。
- wp_list_comments()函数现在会输出所有评论。它还会实现嵌套评论,给评论分级和其它新功能。
- 评论分页已有新的导航。
Javascript评论功能
若在2.7实现JavaScript的所有评论功能,就需要在主题模板文件中作以下更改:
在调用wp_head()之前需把以下内容插入到
header.php中可实现评论嵌套:
if ( is_singular() ) wp_enqueue_script( 'comment-reply' );
这个代码把comment-reply JavaScript添加到了每篇日志页面,它使评论回复链接能够正常运行。WordPress本身并不具备这个功能,因为以上脚本的使用需要在评论表单中添加具体的命名规范和参数。
在评论表单中,插入以下参数:
<?php comment_id_fields(); ?>
这个参数给评论表单新增的代码使其可以显示两个隐藏输入: comment_post_ID
和 comment_parent
。如果表单带有 comment_post_ID,你必须将其删除。为了正确嵌套评论回复,应该使用
JavaScript的comment_parent。
在评论textarea(文本域)应该有 id="comment"。
JavaScript需要它来定位。如果使用了其它参数,请首先更改过来。正是由于它的使用,页面上的其它元素才没有"comment" ID。
为了使评论区域能够链接其它资源,使JavaScript能够正常运行,所有的评论表单都要用带有id="respond"的
DIV括起来。以前版本的主题(包括默认主题)都包括了以下的定位标记:
<a id="respond"></a>
这会使链接从主页直接转到尚未评论的回复区域。这个代码仍适用于2.7,但现在已它有两个功能了。JavaScript把评论表单移到了回复链接所在区域,因此现在它应该是用来括住评论表单的DIV,而不再是以前的定位标记了。
因此,你要删除以上定位标记,添加带有id="respond"的DIV来括住整个评论表单。但是浏览器仍能打开主页上的链接,而
JavaScript则会使页面上的表单可以随意移动。
接下来,用以下内容代替你平常调用的 "Leave a Comment"文本:
<h3><?php comment_form_title(); ?></h3>
当有人直接回复时,这将使原来的"Leave a Reply"这个评论表单标题转化成 "Leave a Reply to Whoever"。当然,你也可以使用以下两个参数定制它:
<?php comment_form_title( 'Leave a Reply', 'Leave a Reply to %s' ); ?>
%s将被替换成人名。如果你没有 comment-reply JavaScript,正如以上所述,系统根本不会显示单个评论回复链接。
最后,当有人点击"回复(reply)"时,评论表单就会出现,但他们可能又想撤消回复。因此,回复区域还应该设有撤消链接。以下代码就可用来实现这个功能,可把它放在评论表单区域的"leave a message" 标题的正下方:
<div id="cancel-comment-reply"> <small><?php cancel_comment_reply_link() ?></small></div>
2.7新增的JavaScript功能代码也使设置下的评论子面板得以运行。你也可根据自己主题的特点对其作相应修改。
CSS 样式
编辑好评论代码后,就可设计评论区域了,2.7用户拥有了更多的可设选项。
评论循环会自动给每个评论添加LI标签,并内嵌UL/LI标签使其线程化。它还给所有的LI添加等级,用以下形式包装评论:
- 评论,trackback, pingback根据评论类别都会被添加等级
- 注册用户的评论前会添加byuser
- 特定的注册用户前添加comment-author-authorname
- 如果评论是由日志作者所作,bypostauthor会被添加
- 奇数和偶数评论会被添加奇数和偶数等级
- 每隔一个评论就添加一个alt
- thread-odd, thread-even,和thread-alt等级和 odd/even/alt等级一样,但前者只应用于评论和回复的最高等级
- depth-1分配给最高级别的评论,depth-2分配给稍次级别的评论,依此类推。
2.7还提供了comment_class过滤器以用来定制评论等级。请看下例:
这个函数给所有评论都添加了microid(即评论作者的URL和邮件地址)。可在WordPress插件或主题的functions.php文件中进行此类操作。
// add a microid to all the comments 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');
这段代码其实就是在给定等级的基础上新增了等级,并让comment display (评论显示)函数执行剩余操作。
定制评论格式
默认情况下,WordPres使用内部函数的默认评论格式显示评论。若定制评论的显示格式,可在 wp_list_comments()中设置"callback"参数。
分类:中文手册