提高 WordPress 访客评论时的用户体验
简介:
前几天见到某 Blog (忘记名字和网址了) 有一个相当实用的评论功能. 访客留言之后资料输入框会被隐藏起来, 如同登录了一般. 访客可以选择修改相关资料再进行评论. 给予访客很好的用户体验.
今天我将这个功能移植到了自己的主题上, 制作不难, 分享一下吧.
需求:
细心的朋友可能已经注意到了: 当在某个 WordPress 发表评论后再次访问该 Blog, 资料就不需要再次填写, 因为它们都已经在资料输入框里面. 但没评论过的或者清除了 Cookie 之后, 资料输入框将空空如也.
1. 当访客的资料已经存在的情况下, 访客很少关注资料本身, 那些资料输入框就会变成 "碍眼的东西", 我们要想办法将它们隐藏起来. 同时, 我们需要将这位访客的名字显示出来, 否则他/她根本不知道自己的身份.
2. 访客有可能邮箱更换了, 或者就想换个酷点的名字, 此时的他/她肯定想更改一下那些资料. 所以要求有一些措施, 让访客可以重新看到资料输入框.
3. 对于那些从未提供资料的访客, 资料输入框必须让他们看到.
分析:
由需求可以看到, 我们要处理的是两种状态的访客: 有资料的, 无资料的.
对于有资料的, 具有显示资料输入框 (显示昵称) 和 隐藏资料输入框 (显示昵称) 两种状态.
而无资料的访客只有显示资料输入框 (没有昵称) 一种状态.
好, 我们就为有资料的访客配备两个按钮 (更改和取消), 一个用来显示资料输入框, 一个用来隐藏它.
思路:
1. 页面怎么写? 编码前, 我们还应该理一下头绪. 用伪代码吧.
if (有资料的访客) { 放置访客昵称 放置更改按钮 (点击后: 隐藏更改按钮, 显示取消按钮, 显示资料输入框) 放置取消按钮 (点击后: 显示更改按钮, 隐藏取消按钮, 隐藏资料输入框) } 放置资料输入框 if (有资料的访客) { 隐藏取消按钮 隐藏资料输入框 }
2. 怎么获知访客是否评论过? 前面已经谈到, 已评论访客的资料会在显示出来, 也就是说, 代码中已经实现了获取资料的方法. 那我们找找吧...
<input type="text" name="author" id="author" value="<?php echo $comment_author; ?>" tabindex="1" />
就是它! $comment_author 是访客的昵称, 当它为空的时候就说明访客资料为空.
3. 有些控件又显示又隐藏的, 怎么弄呢? 我们不需要为此转跳页面, 用 JavaScript 吧. 我们可以写一个方法, 用来设定某些控件的显示与否, 只是一个很简单的方法:
/** * 设定控件的显示风格 * @param id 控件的 ID * @param status 控件的显示状态 (显示时为 '', 隐藏时为 'none') */ function setStyleDisplay(id, status) { document.getElementById(id).style.display = status; }
编码:
接着干嘛? 大概可以写代码了. 看我的...
<!-- 有资料的访客 --> <?php if ( $comment_author != "" ) : ?> <!-- 转换显示状态用的 JavaScript Q1: 为什么这段代码放在这里呢? A1: 因为只有当访客有资料时, 它才被用上, 这样可以减少无资料访客下载页面时的开销. Q2: 为什么不用外部文件将 JavaScript 放起来? 也许那样维护起来更方便. A2: 因为它只在这个地方用到了. 而且加载文件的数量也会影响页面下载速度, 为了这么点字节的代码, 不值得新开一个文件. --> <script type="text/javascript">function setStyleDisplay(id, status){document.getElementById(id).style.display = status;}</script> <div class="form_row small"> <!-- 访客昵称 (随便欢迎一下) --> <?php printf(__('Welcome back <strong>%s</strong>.'), $comment_author) ?> <!-- 更改按钮 (点击后: 隐藏更改按钮, 显示取消按钮, 显示资料输入框) --> <span id="show_author_info"><a href="javascript:setStyleDisplay('author_info','');setStyleDisplay('show_author_info','none');setStyleDisplay('hide_author_info','');"><?php _e('Change »'); ?></a></span> <!-- 取消按钮 (点击后: 显示更改按钮, 隐藏取消按钮, 隐藏资料输入框) --> <span id="hide_author_info"><a href="javascript:setStyleDisplay('author_info','none');setStyleDisplay('show_author_info','');setStyleDisplay('hide_author_info','none');"><?php _e('Close »'); ?></a></span> </div> <?php endif; ?> <!-- 资料输入框 --> <div id="author_info"> <div class="form_row"> <input type="text" name="author" id="author" value="<?php echo $comment_author; ?>" tabindex="1" /> <label for="author" class="small"><?php _e('Name'); ?> <?php if ($req) _e('(required)'); ?></label> </div> <div class="form_row"> <input type="text" name="email" id="email" value="<?php echo $comment_author_email; ?>" tabindex="2" /> <label for="email" class="small"><?php _e('E-Mail (will not be published)');?> <?php if ($req) _e('(required)'); ?></label> </div> <div class="form_row"> <input type="text" name="url" id="url" value="<?php echo $comment_author_url; ?>" tabindex="3" /> <label for="url" class="small"><?php _e('Website'); ?></label> </div> </div> <!-- 有资料的访客 --> <?php if ( $comment_author != "" ) : ?> <!-- 隐藏取消按钮, 隐藏资料输入框 --> <script type="text/javascript">setStyleDisplay('hide_author_info','none');setStyleDisplay('author_info','none');</script> <?php endif; ?>
后记:
其实这个方法有个小缺陷: 这是因为靠 JavaScript 将一些控件隐藏起来而引起. 也就是说, 控件必须在那段简短的 JavaScript 加载完成之后才能被隐藏起来, 而控件的定义却是在那段 JavaScript 之前. 如果你的文章够短, 眼睛够快, 或许你会看到资料输入框转眼即逝的一幕.
是不是很简单? 你现在应该已经知道怎么处理了, 只需要修改一下 comments.php 这个文件.
想看看效果? 在此评论一次, 你就可以看到效果了...

@我试试
真的!
@Yacca
为什么用 JS 就不行了?
js方法 厄 我现在是能不用就不用js...用起来么我那个theme要抛弃掉了...
真的?
真的么?
拜托, 我不叫瑞风, 而是锐风!! 瑞风是车啊..
@瑞风
这个应该不是在 K2 看到的, 是另一个主题, 我忘记名字了.
AJAX 必须是有需要的时候才用的.
直到现在才知道, 原来你这个效果是抄 K2 的..
你可以让 AJAX 和 Web 端处理 两个并存嘛.. 问题不就解决了?
@JAY 和 锐风
(- -!) 由 Web 服务器处理的话需要翻页, 如果可以那样就不会有人用 AJAX 了...
貌似确实是个很不错的 Idea ..
哈, 有些意思啊~
为啥不把这部分交由服务器处理,而不是用JS来做呢?
你好哇!你的博客很漂亮哇!!
来踩踩喇!
我是深圳的哟!
@okyle
我也不清楚, 貌似你的 Cookie 是失效了.
博主您好,看了您的文章觉得很好,牛人
可是我有个问题想请教一下
我的播客也是wordpress,可是为什么不支持cookie啊??
记不住登录过的访客……
有没有办法能解决啊??
我是个小菜鸟,还望博主能指点一下
http://www.okyle.cn
test
谢谢分享,我了解了
你的主题太好了,谢谢你的分享,用你的主题好久了。
你blog的用户体验很好,功能很实用。:eek:
不错,很酷!
哈哈 看到这样的效果了,确实很赞!
看上去很好的样子。
看上去貌似很好用的样子。
很人性化 试试看
重点还是博客有好文章才能留住过客!
不错...
@beethoven
或许我说得不够具体, 你可以参照一下 Heey 的深化教程, 或者等下个版本的主题发布.
@Heey
能用上就好.
不错的功能
很人性化 试试看
应该不对,我照上操作,结果syntax error
...wp的评论屏蔽尖括号,我忘了,重发一下:
有不明白的同学,我说一个傻瓜教程:
就是把原文中最后一大段的代码放在comment.php里面的第一个《?php endif; ?》到《?php endif; ?》之间,替换原来的部分。
对吧,mg12老师。
有不明白的同学,我说一个傻瓜教程:
就是把原文中最后一大段的代码放在comment.php里面的第一个到之间,替换原来的部分。
对吧,mg12老师。
@空间端点
学习了,谢谢。
@mg12
总算搞明白了,谢谢
将这个功能集成到下一版本的主题上面吧
文章更新的真快。。。
哦, 原来是 K2...
Elegant Box 主题的下一个版本会支持这个...
体验,又是体验
原先一直用K2,以至于以为这个是wordpress自带的功能....- -
哦 ,YE~~ 结果要在原来的文件上改~~
我看旷了。。。。 请问下加在哪里,还是在原来的comments.php里面改??
还是不会改呵呵,你的这个风格怎么弄啊?
k2是这样的 我记得
好功能哈!
@atmo
@空间端点
写得很好哦, 条理很清晰.
@Black-Xstar
不会很难的, 或许你被众多文字吓到, 其实你可以只看最后的代码. 那些文字只是写出我的思路而已, 我希望看过这篇日志的人在自己有好的想法时, 知道怎样将它转换成代码.
@Delacro
因为你留言过了, 只要你不清 Cookie, 就一直隐藏着.
@chada
应该是 FeedSky 的问题. FeedSky 看到也叠加在一起.
@ChenShiAn
端午放假, 全民快乐!
果然8错。
你真有心,端午节快乐!
之前用阅微堂的评论插件的时候注意到过那个插件有这个功能。
P.S: 这篇日志的后半部分在GR里面出现错乱,估计是文中使用的代码作祟。
呀,我的是隐藏地
貌似有点难度,我还是不改了
这个功能不错啊!
有空我也改一下。
很巧,我也刚刚发了一篇日志,说的是如何改造外国人写的wordpress主题以创造更好的中文阅读体验,欢迎来提提意见:http://www.spacetip.net/index.php/2008/06/08/wordpress-theme-optimization/
纯属测试
@schuen
很多 Blog 都是用 Cookie 保存这个的.
WordPress 应该也是.
还是要用到cookie啊