写这篇文章之前,我有一些话要说。原先我看见有不少站点都在使用一种滑动解锁的插件myQaptcha,感觉还挺漂亮,想想这也是自己想要实现的功能,于是就下载安装了一下,结果发现没有办法直接运行显示,经过一阵折腾后,主要是jq冲突,能正常显示也能正常滑动解锁功能了。但偶尔有一次我滑动范围大了点,结果那个中间的滑动块没了。见下图:
没有中间那滑动块,也就意味着解不了锁,也就意味着不能评论,解决的方法只能是重新刷新网页。我试了两款Chrome浏览器都有这问题,但FF没有,IE未试。
于是我到作者博客去留言反应此问题,由于某种众所皆知的可能原因,我的留言隔天没了。我顺便也点了下作者博客站点上的此滑动条,发现同样有相同的问题。你们有兴趣的话可以试试用Chrome访问作者博客http://blog.30c.org/2006.html鼠标按住滑动条往上方拖拉,然后在松开鼠标,很神奇吧。同样有问题的网站:http://www.itbobo.com/这样说明这个问题不是个例了。但是同样,也有正常的网站,http://www.52wordpress.net/
在我搞不清楚这个插件的状况的情况下,我只能自己写一个开关出来,于是就有了现在大家看到这个评论开关:
开关的作用仅仅在于开打评论输入框和激活submit按钮,没有Qaptcha(不是myQaptcha)的session机制,其实我到现在也搞不懂最简单的屏蔽通过comments.php页面提交的垃圾评论为啥要搞个session机制,也许它是想post一些参数,在最后的时候进行验证,但是如果这个session被拦截了,不都白搭了么,简简单单点设置button.disable不好吗?
由于这个评论开关牵涉到CSS样式,再加上我用的Freshblog主题的comments.php好像和默认主题twenty系列的comments.php用的元素相差太多,所以我暂时没有做成插件的打算(抱歉,没有对主题格式研究过,看上去Freshblog主题的评论好像集成了某个评论插件的功能,可以自动嵌套,我记得默认主题是没有这个功能的),如有需要,则再说了,下面放出所有代码,各位有能力者可以自行修改:
1.新建一个custom_radio.js,放在主题下的/javascripts目录,内容如下:
// Custom checkbox and radios var toggleHandler = function(toggle) { var toggle = toggle; var radio = $(toggle).find("input"); var checkToggleState = function() { if (radio.eq(0).is(":checked")) { $(toggle).removeClass("toggle-off"); } else { $(toggle).addClass("toggle-off"); } }; checkToggleState(); radio.eq(0).click(function() { $(toggle).toggleClass("toggle-off"); }); radio.eq(1).click(function() { $(toggle).toggleClass("toggle-off"); }); }; $(document).ready(function() { $(".toggle").each(function(index, toggle) { toggleHandler(toggle); }); });
2.主题目录下/images/toggle放两张按钮图,方的圆的随便,尺寸30×30:
3.comments.php相关位置,即网址输入框后,评论输入框前,加入以下代码:
评论前先开启评论开关: <div class="toggle"> <label class="toggle-radio" for="toggleOption2">ON</label> <input id="toggleOption1" type="radio" name="toggleOptions" value="option1" /> <label class="toggle-radio" for="toggleOption1">OFF</label> <input id="toggleOption2" type="radio" checked="checked" name="toggleOptions" value="option2" /> </div>
4.comments.php里的输入框和提交按钮属性里加上disabled属性,为了让网页打开时,输入框和提交按钮默认是无效状态,大致如下代码:
<textarea id="comment" tabindex="4" disabled="disabled" name="comment"></textarea> <input class="submit" id="submit" tabindex="5" type="submit" disabled="disabled" name="submit" value="Submit" />
5.最后在comments.php尾部,当然你也可以在footer.php里加上以下代码,注意下面的jquery库按照你自己的需要调整路径:
<script type="text/javascript" src="<?php bloginfo('template_url'); ?>/javascripts/jquery-1.8.3.min.js"></script> <script type="text/javascript" src="<?php bloginfo('template_url'); ?>/javascripts/custom_radio.js"></script> <script type="text/javascript"> $(function() { $(".toggle :radio").change(function() { var lineType = $("input[name='toggleOptions']:checked").val(); if(lineType == "option1") { commentform.comment.disabled = false; commentform.submit.disabled = false; } else { commentform.comment.disabled = true; commentform.submit.disabled = true; } }); }); </script>
6.将以下css样式加入到主题下的style.css中:
/***toggle button ***/ .toggle { background-color: #6db240; border-radius: 6px; color: white; height: 29px; width: 81px; margin: 10px 12px 2px 0; overflow: hidden; *zoom: 1; display: inline-block; zoom: 1; *display: inline; -webkit-transition: 0.25s; -moz-transition: 0.25s; -o-transition: 0.25s; transition: 0.25s; -webkit-backface-visibility: hidden; } .toggle.toggle-off { background-color: #ebebe4; } .toggle.toggle-off .toggle-radio { background-image: url("images/toggle/icon-off.png"); background-position: 0 0; color: white; left: 0; margin-left: 0.5px; margin-right: -13px; z-index: 1; } .toggle.toggle-off .toggle-radio:first-child { left: -120%; } .toggle .toggle-radio { background: url("images/toggle/icon-on.png") right top no-repeat; color: white; display: block; left: 120%; font-weight: 700; height: 22px; margin-left: -13px; padding: 5px 32px 2px; position: relative; text-align: center; z-index: 2; -webkit-transition: 0.25s; -moz-transition: 0.25s; -o-transition: 0.25s; transition: 0.25s; -webkit-backface-visibility: hidden; } .toggle .toggle-radio:first-child { margin-bottom: -29px; left: 0; } .toggle input { display: none; position: absolute; outline: none !important; display: block\9; opacity: 0.01; filter: alpha(opacity=1); zoom: 1; }
评论开关样式来自zoe提供的Flat UI 扁平化风格工具包。
2014.2.25 追加,如果需要设置发表过评论的用户能自动打开开关,则将上面第3段代码修改为
<div class="toggle"> <label class="toggle-radio" for="toggleOption2">ON</label> <?php if (empty($comment_author)) {?> <input type="radio" name="toggleOptions" id="toggleOption1" value="option1" > <label class="toggle-radio" for="toggleOption1">OFF</label> <input type="radio" name="toggleOptions" id="toggleOption2" value="option2" checked="checked"> <?php } else { ?> <input type="radio" name="toggleOptions" id="toggleOption1" value="option1" checked="checked"> <label class="toggle-radio" for="toggleOption1">OFF</label> <input type="radio" name="toggleOptions" id="toggleOption2" value="option2" > <?php } ?> </div>
如要防所有垃圾,则在wp-comment-post里追加两行
$comment_radio = ( isset($_POST['toggleOptions']) ) ? trim($_POST['toggleOptions']) : null; if ( 'option1' != $comment_radio ) wp_die( __('<strong>ERROR</strong>: please turn on the swtich first.') );
这个很好,可以防止垃圾评论。
谢谢分享···················· 太复杂了 能做成插件吗?
还有几个问题麻烦博主⊙ω⊙
1,为什么我改的效果是有,但发表过评论后姓名邮件等能够记住(不需再填,但这个开关还得开一次)?我看你这里开关也是能记住的哇~
2,不需修改wp-comment-post.php就能放垃圾评论机器人?
麻烦抽空不吝赐教,谢谢
1.那个是我之后加的,你把上面第3段代码加个if (empty($comment_author))的判定即可。
2.还是需要改的,文件需要加上对radio的识别。
看文章更新的最后那些,我刚加的。
好在有邮件通知,多谢博主!
可是Twenty系列都是直接调用模板评论框怎么办呢
comment_form( );
找一下模板函数对应的代码,直接改那边的代码呗。
谢谢,我已经改好了~
很人性化喔,之前评论过,现在不需再次开关~
话说之前我一看到评论开关就想找教程,无奈贵站没有搜索框,只好/?s =评论开关来找~(我真是太聪明了)
既然都新建了一个/custom_radio.js
那么这段代码可不可以也放在这个文件里呢
$(function() { $(“.toggle :radio”).change(function() { var lineType = $(“input[name=’toggleOptions’]:checked”).val(); if(lineType == “option1”) { commentform.comment.disabled = false; commentform.submit.disabled = false; } else { commentform.comment.disabled = true; commentform.submit.disabled = true; } }); });
右上角有搜索框的,大概不明显吧,当然可以合并在同一个文件里。
学习下,用到我那上面去
用了这个以后,垃圾评论的问题怎么样?
wp-comments-post上我加了对这个评论开关的判定。。。所以到目前为止是0。当然AK是开启的,补充一下,AK都是直接SPAM掉的,留在垃圾回收站的都是正常误判评论。
AK都是直接SPAM掉的 是怎么回事?
我现在把根目录那个文件都改名了,还有垃圾评论!虽然都被ak拦截了。
我也有点困惑AK的原理。照理来说AK应该是在wp-comments-post之后再处理的。
myQaptcha已经不更新啦,现在WP都3.6.1了,我开始装了这个但是怎么都出不来,刚刚才知道作者已经停止更新了。感谢博主提供了另一种类似的解决方案!
点击的好,我的是选中
博主很牛比啊~~~
体验效果很不错!
最讨厌滑动解锁的,经常要滑几次,点击的还好,点一下就可以。
呵呵,和我想得差不多。
原来Flat UI是基于Twitter Bootstrap实现一套界面工具,它包含许多基本的和复杂的 UI 部件,例如按钮,输入框,组合按钮,复选框,单选按钮,标签,菜单,进度条和滑块,导航元素等等。
现在扁平化风格从手机UI到PC web都能看到在大量使用。简单,脱俗,会让人有眼前一亮的感脚。最主要的是: free! 话不多说,上图先~~ 下载接链在图后。
值得注意的是它用了不少JQ特效和css3样式,如果舍不得抛弃低版本浏览器的用户,就别用了。
这个我喜欢,拿来折腾去。
如果使用中有问题,请反馈。。
呵呵,最近有发现这个东东,感觉挺有意思的.
还好,有人说按钮过大了,小一点好看。
请问博主用什么代码插件 我用不了代码 代码一方 出来就是效果了
还有 如何实现不能复制 ?
我用的 WP Code Highlight这款,你后台插件中心搜索就能找到。
你指的不能复制是啥?右键不能弹框?CTRL+C不能用还是别的?
其实,现在用一些评论插件似乎还不错,至少垃圾留言少了,只是留言内容搜索引擎都看不到,所以我放弃了
留言内容看不到么,我没试过WP默认模板留言是不是能google。。。
这个也相当的实用!!
还好,但是这个不能完全屏蔽国外的垃圾留言。
嘿嘿 能不能小巧一点 敢不敢啊
有的浏览器不兼容很坑,这样就无法评论了
我只试了chrome,ff,ie7,360,IE6没试,不知道行不行。