让代码更简单

WordPress使用ajax提交评论WP_ERROR导致布局错乱

重要:本文最后更新于2018-12-29 08:59:50,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗

WordPress使用ajax提交评论WP_ERROR导致布局错乱问题出现在大前端dux主题中,其它主题没有测试,只要提交相同评论,就会触发WordPress检查重复评论机制,如果评论重复了,就会给你返回一个WP_ERROR信息,提示你可能已经提交了相同评论,接着就会让布局变乱,下面是某站使用的大前端dux主题的评论测试截图。

WordPress使用ajax提交评论WP_ERROR导致布局错乱

WordPress使用ajax提交评论WP_ERROR导致布局错乱

快月底了加班时间少,抽空写下代码狗博客的评论模板,比来比去还是觉得大前端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文件中。或许那些抄袭大前端代码的主题也有可能出现这种错误,比如那什么唯爱资源网之类的。

感觉很棒!可以赞赏支持我哟~

2 打赏

评论 (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(/([^]*)/,''));
即可
QQ咨询 邮件咨询 狗哥推荐