升级插件和主题到 2.7/评论新增功能

1条评论

前言

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_IDcomment_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"参数。

#1
呵呵 我搜索部分代码来到这。