thumbnail

WordPress注册自定义Ajax事件,以及POST请求400报错的处理办法

WordPress支持用户注册自己的Ajax方法,这个很简单,以下是一个栗子:

//已登录用户执行
add_action('wp_ajax_demo_ajax', 'demo_ajax_echo');
//未登录用户执行
add_action('wp_ajax_nopriv_demo_ajax','demo_ajax_echo');
function demo_ajax_echo(){
    if(isset($_POST['check_it'])){
        echo 'Success!';
    }
    die();
} 

其中,wp_ajax_wp_ajax_nopriv_后面的demo_ajax就是这个函数的请求参数(action)。

WordPress会根据action参数来判断应该执行哪个Aajax事件,所以这个参数应该是唯一的。

WordPress在执行Ajax请求的时候每次都会输出0或1(false或true)作为结果,如果不需要,则需要在函数处理完成后执行die或者exit提前结束。

前台请求的接口统一为admin-ajax.php,为了方便使用,我们可以在WordPress中定义一下这个地址。

wp_localize_script('new-js', 'my_ajax_demo', array('ajax_url' => admin_url('admin-ajax.php')));

于是问题就来了,前台请求的时候一直返回400错误,然后输出结果'0'

研究了一下,发现虽然WordPress的文档里虽然说请求的时候需要带上action参数就可以,但实际上WordPress对于请求格式是有要求的,以下是一个jQuery的栗子:

<input name="check_it" class="form-control" id="check_it" type="text" placeholder="" required="" aria-required="true">
<button class="btn" id="check" type="submit" >查询</button>
<div class="info-back"></div>
<!--JS-->
<script type="text/javascript"> 
jQuery(document).ready(function ($) {
    $("#check").click(function (){
        var this = $("#check_it").val();
        if (this != undefined) {
            $.ajax({
                url: my_ajax_demo.ajax_url,
                type: "POST",
                dataType: "HTML",
                data: {
                    action: "demo_ajax",
                    "check_it": this ,
                },
                success: function(data){
                    $(".info-back").html(data);
                }
            });
        }
    });
});
</script>

使用GET请求,或者后端Curl请求的方法就不列举了,总之传入的数据必须带上action参数,因为jQuery不会严格检查字符串,所以写的很随意。

如果是用其他前端调用的话需要注意传入和传出时候的数据格式,否则也会报400错误,这种情况下其实用RestAPI更省事,但是RestAPI默认不会鉴权,容易遭到滥用,也得注意。

另外,这个接口不支持直接提交from表单,如果非得提交的话先将数据处理成json的格式才行。如果是登录注册的表单直接提交给wp-login.php比较省事。

 

THE END
夜华子酱我知道你很急,但你先别急