WordPress使用ajax提交评论WP_ERROR导致布局错乱问题出现在大前端dux主题中,其它主题没有测试,只要提交相同评论,就会触发WordPress检查重复评论机制,如果评论重复了,就会给你返回一个WP_ERROR信息,提示你可能已经提交了相同评论,接着就会让布局变乱,下面是某站使用的大前端dux主题的评论测试截图。
快月底了加班时间少,抽空写下代码狗博客的评论模板,比来比去还是觉得大前端DUX的评论比较好看,在扒的过程中发现使用ajax提交评论返回的WP_ERROR错误会导致布局错乱。
出现这个问题后我的想法是,通过WordPress校验评论是否被允许的函数wp_allow_comment来更改WordPress返回的数据。
wp_allow_comment简单使用
wp_allow_comment( array $commentdata, bool $avoid_die = false )
参数说明
$commentdata
欲评论的数组数据
$avoid_die
是否返回wp_error错误数据,默认为false不返回。
返回值
如果$avoid_die参数设置为true,评论将不被允许,返回wp_error错误信息(其实就是一个错误网页)。false返回0、1、spam。我测试过,重复评论会返回1,其它的没试过,有兴趣自己试试。
在ajax提交评论的接口文件中加入判断,测试评论后发现这样做虽然可以修改重复评论时产生的WP_ERROR信息,但是,它会导致正常评论时出现has_cap()函数传递参数的错误。
WordPress的WP_ERROR类在检测到评论重复时,会返回一个409状态码给浏览器,表示提交数据与服务器已有数据冲突,百度了好久都没解决问题,直到以为WordPress大佬指点了下,才发现这个问题是那么的简单。
ajax评论布局错乱解决办法
方法一、使用wp_insert_comment方法插入评论
wp_insert_comment方法也是向评论数据表插入一条评论,这个方法与wp_new_comment插入评论的区别在于后者会检查评论是否重复,而wp_insert_comment方法不会检查,所以也就不会返回wp_error错误了。
方法二、is_wp_error判断返回结果
不管使用wp_insert_comment方法还是wp_new_comment方法插入评论,成功后都会返回一个关于评论的id。wp_new_comment方法在插入失败后会返回一个wp_error错误对象。is_wp_error函数就是用来判断是否是wp_error错误的,那么我们只需要安装如下代码判断即可。
$comment_id = wp_new_comment( $commentdata,true); if(is_wp_error($comment_id)){ err( '重复评论' ); }
err是自定义错误函数,定义了响应头,如下代码:
function err($ErrMsg) { header('HTTP/1.1 405 Method Not Allowed'); echo $ErrMsg; exit; }
这样再提交重复评论就不会出现返回wp_error错误对象,导致布局错乱问题了。这个解决方案适用于大前端dux5.1主题及以前版本,问题文件在主题目录下action文件夹下的comment.php文件中。或许那些抄袭大前端代码的主题也有可能出现这种错误,比如那什么唯爱资源网之类的。
评论 (5)
$('.comt-error').slideDown(300).html(request.responseText.replace(/([^]*)/,''));
$('.comt-error').slideDown(300).html(request.responseText.replace(/([^]*)/,''));
修改comment.js
$('.comt-error').slideDown(300).html(request.responseText.replace)
为
$('.comt-error').slideDown(300).html(request.responseText.replace(/([^]*)/,''));
即可