自定义短码AJAX 400错误请求

时间:2019-05-26 作者:Harry Williams

我正在编写一个自定义的短代码,需要在一些用户事件之后通过AJAX调用一些PHP文件。但我收到了错误的400号请求wp_ajax_* 未绑定操作。

下面是我的插件代码的一个简单示例

function aj_ajax_demo_shortcode() {
    return \'<h4>Shortcode</h4>\';
}
add_shortcode( \'ajax_demo\', \'aj_ajax_demo_shortcode\' );

add_action( \'wp_ajax_nopriv_aj_ajax_demo\', \'aj_ajax_demo_process\' );
add_action( \'wp_ajax_aj_ajax_demo\', \'aj_ajax_demo_process\' );
function aj_ajax_demo_process() {
    wp_send_json((object) array(\'msg\' => \'hello world\'));
}

add_action( \'wp_enqueue_scripts\', \'aj_enqueue_scripts\' );
function aj_enqueue_scripts() {
    wp_enqueue_script(
        \'aj-demo\', 
        plugin_dir_url( __FILE__ ) . \'aj-demo-ajax-code.js\'
    );

    wp_localize_script(
        \'aj-demo\',
        \'aj_ajax_demo\',
        array(
            \'ajax_url\' => admin_url( \'admin-ajax.php\' ),
            \'aj_demo_nonce\' => wp_create_nonce(\'aj-demo-nonce\') 
        )
    );
}
这是我的JS:

fetch(aj_ajax_demo.ajax_url, {
    method: \'POST\',
    data: {
        action : \'aj_ajax_demo\',
        nonce : aj_ajax_demo.aj_demo_nonce,
    }
}).then(response => {
    if (response.ok) {
        response.json().then(response => {
            console.log(response);
        });
    }
});
就我所研究的而言,我是按照正确的顺序做事的,所以不知道为什么我的AJAX函数没有被调用。因为这是一个短代码,所以我遗漏了什么吗?

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

问题是您试图将jQuery AJAX API的参数与本机Fetch API一起使用。具体来说,问题是JS Fetch API不支持data 论点

对于管理ajax。php请求在WordPress中工作$_REQUEST[\'action\'] 属性需要填充,要使用Fetch API执行此操作,需要传递FormData 对象到body 参数:

var data = new FormData();

data.append( \'action\', \'aj_ajax_demo\' );
data.append( \'nonce\', aj_ajax_demo.aj_demo_nonce );

fetch(aj_ajax_demo.ajax_url, {
    method: \'POST\',
    body: data,
}).then(response => {
    if (response.ok) {
        response.json().then(response => {
            console.log(response);
        });
    }
});