WordPress 主题制作技巧之二 [ 主动添加反垃圾留言代码 ]
跟许多园友一样,我的基于wordpress的独立博客建立之初也饱受垃圾留言的困扰,后来也用过包括Akismet和some chinese please在内的几个反垃圾留言插件,但是我本人最不愿看到后台中插件一大堆的情况,无论对博客加载速度还是对版本更新的稳定性都不好,后来在网上寻觅不使用插件的方法,经过综合与修改,我在网站中内置了一个简单实用的留言验证功能,一直沿用至今。不喜欢用插件的童鞋们可以看看。
本方法是利用rand()函数生成两个一位的自然数,评论者输入二者之和后,网页利用js代码和php代码进行输入结果验证,原理简单地像没有一样,但是稳定实用,用户体验很流畅,屏蔽垃圾留言的效果也很好。
首先在模板文件中打开 comments.php ,在评论提交表单中你认为合适的地方插入一项验证条目(我把它插到了提交按钮的上方),代码如下:
<?php if (!$user_ID) : ?> <?php $lt_sub_a=rand(0,5); $lt_sub_b=rand(3,9); ?> <p> <input type="text" size="17" name="lt_sub_ab" id="lt_sub_ab" tabindex="4" /> = <?php echo $lt_sub_a; ?> + <?php echo $lt_sub_b; ?> <label for="check"> 请完成等式 *</label> <input name="lt_sub_a" id="lt_sub_a" value="<?php echo $lt_sub_a; ?>" type="hidden" /> <input name="lt_sub_b" id="lt_sub_b" value="<?php echo $lt_sub_b; ?>" type="hidden" / ></p> <?php endif; ?>
下图是我博客上的留言表单
然后就是对留言者在表单中输入的验证码进行验证。为了使验证过程在当前页面完成从而达到快速直接的效果,需要在 comments.php 进行js验证,代码如下(这里我只贴出了与验证码有关的代码):
function trim(str){ //删除左右两端的空格 return str.replace(/(^\s*)|(\s*$)/g, ""); } function validate_form(thisform) { with (thisform) { if (validate_checknum(lt_sub_ab,"请正确输入两个数字之和...")==false) {email.focus();return false} } }
这里提醒一下,别忘了在form表单的onsubmit属性上添加上验证函数(这里是 onsubmit="return validate_form(this);" )。
按说这样就可以使用了,可我还是不放心,当前的网络环境下,有些浏览器会对js的执行实施一些限制。出于验证过程的稳定性以及用户体验的考虑,我在wordpress和程序中又加了一层验证,这个验证只有在js验证被限制时才会出现。
打开wordpress程序根目录下的评论提交页面 /wp-comments-post.php ,找到
if ( '' == $comment_content ) wp_die( __('Error: please type a comment.') );
在这句代码的前面插入下面的代码(当然,为了避免改动程序,这段代码的插入也可以利用勾子来实现,简单起见,本文不再阐述)。
if ( !$user->ID ) { $lt_sub_a = trim($_POST[lt_sub_a]); $lt_sub_b = trim($_POST[lt_sub_b]); $lt_sub_ab = trim($_POST[lt_sub_ab]); if((($lt_sub_a+$lt_sub_b)!=$lt_sub_ab)|| empty($lt_sub_ab)) {wp_die( __('错误: 请正确输入两个数字之和...') );} }
OK,全部完成。