wordpress是被脚本自动评论的重灾区,后台打开一堆的评论,要么清数据表要么人工来去移除,太恶心了。
好了,上代码。打开对应主题的comments.php文件,找到:add_filter(‘comment_form_default_fields’, ‘appointment_fields’);
$appointment_defaults = array(
'fields' => apply_filters('comment_form_default_fields', $appointment_comment_fields),
'comment_field' => '
<div class="blog-form-group-textarea" >
<p >请输入验证码:<img src="getcode.php" id="qingxinzui_get_code">
<button onclick="getCode();" type="button">获取验证码</button>
</p>
<p><input type="text" name="code"></p>
<textarea id="comments" rows="7" class="blog-form-control-textarea" name="comment" type="text" placeholder="' . esc_attr__('Leave your message', 'appointment') . '"></textarea></div>',
'logged_in_as' => '<p class="blog-post-info-detail">' . esc_html__("Logged in as", 'appointment') . '<a href="' . esc_url(admin_url('profile.php')) . '">' . $user_identity . '</a>' . '<a href="' . esc_url(wp_logout_url(get_permalink())) . '" title="' . esc_attr__('Logout from this Account', 'appointment') . '">' . esc_html__("Logout", 'appointment') . '</a>' . '</p>'
.'',
'id_submit' => 'blogdetail-btn',
'label_submit' => esc_html__('Send Message', 'appointment'),
'comment_notes_after' => '',
'comment_notes_before' => '',
'title_reply' => '<div class="comment-title"><h3>' . esc_html__('Leave a Reply', 'appointment') . '</h3></div>',
'id_form' => 'commentform'
);
这里我们会请求一个getcode.php文件。我们在wordpress根目录创建一个getcode.php显示图片的文件
<?php
session_start();
ob_clean();
$image = imagecreatetruecolor(100, 30); //创建一个100×30的画布
$white = imagecolorallocate($image,255,255,255);//白色
imagefill($image,0,0,$white);//覆盖黑色画布
$session = "";
$font = './th.ttf'; //字体
for($i=0;$i<4;$i++){
$size = 24;
$x = $i*25+7; //每个字体的宽度
$y = 25; //靠上边多少
$sizi_color = imagecolorallocate($image,mt_rand(100,220),mt_rand(100,220),mt_rand(100,220));
$char = join("",array_merge(range('a','z'),range(0,9))); //range('a','z'),range('A','Z'),range(0,9)
$char = str_shuffle($char);
$char = substr($char,0,1);
imagettftext($image,$size,0,$x,$y,$sizi_color,$font,$char);
$session .= $char ;
}
for($k=0;$k<200;$k++){
$rand_color = imagecolorallocate($image,mt_rand(100,200),mt_rand(100,200),mt_rand(100,200));
imagesetpixel($image,mt_rand(1,99),mt_rand(1,29),$rand_color);
}
for($n=0;$n<5;$n++){
$line_color = imagecolorallocate($image,mt_rand(80,220),mt_rand(80,220),mt_rand(80,220));
imageline($image,mt_rand(1,99),mt_rand(1,29),mt_rand(1,99),mt_rand(1,29),$line_color);
}
$_SESSION['code'] = $session;
header('content-type:image/png');//设置文件输出格式
imagepng( $image ); //以png格式输出$image图像
imagedestroy( $image ); //销毁图像
?>
这里我们需要一个th.ttf的字体包,下载ttf字体并且放到wordpress根目录
这个时候,默认就会引用出图片了,但是可能图片会有过期,所以需要一个JS的getCode()方法来获取最新的图片验证码
在对应模板footer.php最底下添加:
<script>
function getCode(){
var demoDom = document.getElementById("qingxinzui_get_code");
demoDom.src = "getcode.php";
}
</script>
这样默认打开初始化图片,或者人工点获取图片就已经完成了,然后接着就是校验了。
根目录的:wp-comments-post.php文件里
nocache_headers();
在这后面添加校验,因为前面是以SESSION的方式存储。
nocache_headers();
//这里开始添加
session_start();
if(!$_SESSION['code']){
wp_die(
'<p>验证码失效</p>',
__( 'Comment Submission Failure' ),
array(
'response' => $data,
'back_link' => true,
)
);exit;
}
if(empty($_POST['code'])){
wp_die(
'<p>请填写验证码</p>',
__( 'Comment Submission Failure' ),
array(
'response' => $data,
'back_link' => true,
)
);exit;
}
if($_SESSION['code'] != $_POST['code']){
wp_die(
'<p>验证码不正确</p>',
__( 'Comment Submission Failure' ),
array(
'response' => $data,
'back_link' => true,
)
);exit;
}
//这里结束添加。进入wordpress内部的内容
$comment = wp_handle_comment_submission( wp_unslash( $_POST ) );
最后在wp-comments-post.php文件底部写入数据库之后,进行销毁session
unset($_SESSION['code']);
wp_safe_redirect( $location ); //wp-comments-post.php文件最后的动作
关于作者