前一阵给TTT弄了个博客:http://ttt.jennal.cn/
TTT周五有个要求,她要博客的首页可以看到评论,不要点进去才能看到,那样太麻烦。
在网上找了很多资料,没有找到单独对这个进行介绍的。所以只好找了其他很多资料,加上不断的尝试,昨晚做到快4点,为了防止这次伟大的事件在我的记忆中被删除,还是写下来纪录一下。
要在首页显示评论,我们需要修改四个文件(可能你的文件命名会有些不同,没有关系)。
这些文件都位于wp-content/themes/我的主题目录下
1 2 3 4 |
index.php : 首页模板 homepage_comments.php : 评论模板 functions.php : 放回调函数,当然你也可以写在homepage_comments.php里面 comments.css : 放评论的css,当然你也可以写在homepage_comments.php里面 |
index.php很简单,在你要放评论的地方加上如下代码,当然要放在日志的循环里面:
1 |
<?php $withcomments=1; comments_template('/homepage_comments.php'); ?> |
$withcomments 是一定要设置的,首页默认为0
至于comments_template这个函数,它会帮你comments先取出来,供你的模板使用。如果有看文档的话,应该知道有一个wp_list_comments函数,这个函数的参数没有接受postId,它是不做数据库查询工作的,具体它是怎么工作的,我也没有深究,只是用到它的回调功能来自定义我们的comments列表,这个在下面会提到。
下面我们来看一下homepage_comments.php怎么写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<ul class="homepage_comments"> <?php wp_list_comments(array( 'walker' => null, 'max_depth' => '', 'style' => '', 'callback' => 'homepage_comments', 'end-callback' => null, 'type' => 'all', 'page' => '', 'per_page' => '3', 'avatar_size' => 32, 'reverse_top_level' => true, 'reverse_children' => '')); ?> </ul> |
本来以为直接在comments模板里面写结构和样式就可以了。但是发现不行,除非直接去取$wp_query->comments,但是这样不好,最好还是调用它的API,不然以后版本升级可能要出问题。
这里我把wp_list_comments的全部参数都列出来了,其实没有必要,只要设置你想要的参数就可以了。
这里要补充一下需求,我不希望把所有的评论都列出来,我只要列出最新的3条,而且要倒序,就是最新评论的在最上面。所以我把per_page设置成3,reverse_top_level设置成true。但是这样有个问题,显示的时候是显示最后一页,可能你有4条评论,那它只会显示第4条。在不改变和添加新API的情况下,我没想出解决的办法。如果在看这篇文章的你知道怎么解决,请告诉我。顺便说一下,type如果设置成别的可能会出问题。我之前就学别的模板,把它设置成comments,结果每个post的comment全变成一样了。然后设会all就好了,这个问题也不去深究,有兴趣的自己看源码/wp-includes/comment-template.php。
重点来了,重点是'callback' => 'homepage_comments'这个参数。顾名思义,这是设置回调函数,那homepage_comments就是函数名。为了代码的整洁和统一,我把这个函数放在functions.php里了。那在循环遍历comments的时候,就会调用这个函数。
下面来看functions.php这个文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?php function homepage_comments($comment, $args, $depth){ $GLOBALS['comment'] = $comment; global $commentcount; if(!$commentcount) { $commentcount = 0; }?> <li><div class="comment_header"> <?php if (function_exists('get_avatar') && get_option('show_avatars')) { echo sprintf('<span class="comment_avatar">%s</span>', get_avatar($comment, 20)); } if (get_comment_author_url()) : ?> <a id="commentauthor-<?php comment_ID() ?>" class="url <?php if($comment->comment_author_email == get_the_author_email()) {echo 'admin-url';} else {echo 'guest-url';} ?>" href="<?php comment_author_url() ?>" rel="external nofollow"> <?php else : ?> <span id="commentauthor-<?php comment_ID() ?>"> <?php endif; ?> <?php comment_author(); ?> <?php if(get_comment_author_url()) : ?> </a> <?php else : ?> </span> <?php endif;?> <span class='comment_date'> <?php echo get_comment_time(__('Y-m-d', 'monochrome')); ?> </span> </div> <div class="comment_content" id="comment-content-<?php comment_ID() ?>"> <?php if ($comment->comment_approved == '0') : ?> <span class="comment-note"><?php _e('Your comment is awaiting moderation.', 'monochrome'); ?></span> <?php endif; ?> <?php comment_text(); ?> </div> </li> <?php } ?> |
这个太长了,就不一一详细介绍了,重点讲一下$GLOBALS['comment'] = $comment;,这个是为下面那些API作准备的,类似comment_text()等。这个主要是结构,HTML和PHP混合在一起,所以代码比较乱。但是wp的API函数都能顾名思义出来,需要改结构的请自行调整。
最后我们看一下样式文件comments.css
1 2 3 4 5 |
.homepage_comment_title { padding-bottom:10px; color:#aaa; font-size:11px; } .homepage_comments .comment_header { height:49px; } .homepage_comments .comment_date { float:right; } .homepage_comments .comment_content { text-align:left; } .homepage_comments .comment_content p { border-bottom:1px solid #333; } |
OK,一切搞定,如果出问题请自行解决,哈哈哈,本人概不负责。
可惜现在没有示例网站可以看,因为TTT看了首页显示出评论的页面以后说“但我现在想让它变回去”。唉。。辛苦了半天。。算了,至少提高了职业技能,哈哈哈