10

我对 wordpress admin-ajax.php 文件有一个奇怪而令人沮丧的行为,当我发出 ajax 请求时,它返回 400 错误错误请求。

(function( $ ) {
    var ajaxscript = { ajax_url : 'mydomain.com/wp-admin/admin-ajax.php' }
    $.ajax({
        url : ajaxscript.ajax_url,
        data : {
            action : 'cart_clb',
            id : 1
        },
        method : 'POST',
        success : function( response ){ console.log(response) },
        error : function(error){ console.log(error) }
    })
})(jQuery)

在我的functions.php里面

add_action( 'wp_ajax_post_cart_clb', 'cart_clb' );
add_action( 'wp_ajax_nopriv_post_cart_clb', 'cart_clb' );

function cart_clb(){
    echo json_encode($_POST);
    die();
}

如上所述,当我执行请求时:

mydomain.com/wp-admin/admin-ajax.php 400 (Bad Request)
{readyState: 4, getResponseHeader: ƒ, getAllResponseHeaders: ƒ, setRequestHeader: ƒ, overrideMimeType: ƒ, …}

有人可以帮我取悦吗?谢谢你。

4

7 回答 7

20

首先,使用带有协议(或至少与协议无关的形式)的完整和绝对 url:

var ajaxscript = { ajax_url : '//mydomain.com/wp-admin/admin-ajax.php' } 

其次,您的 ajax 操作名称不是 php 回调函数名称,而是 hook 的动态部分wp_ajax_{action_name} / wp_ajax_nopriv_{action_name},因此在您的情况下应该是:

data : {
    action : 'post_cart_clb',
    id : 1
},
于 2017-12-29T17:45:30.320 回答
10

我已经修改了你的代码,看看这个:

(function( $ ) {
var ajaxscript = { ajax_url : 'mydomain.com/wp-admin/admin-ajax.php' }
$.ajax({
    url : ajaxscript.ajax_url,
    data : {
        action : 'post_cart_clb',
        id : 1
    },
    method : 'POST', //Post method
    success : function( response ){ console.log(response) },
    error : function(error){ console.log(error) }
  })
})(jQuery)

这是 WordPress ajax 的语法: wp_ajax_{Your_action_name} wp_ajax_nopriv_{Your_action_name}

于 2017-12-29T18:03:09.093 回答
4

就我而言,我使用的是基于类的方法。我发现问题是因为我在构造函数中使用了 wp_ajax_ 请求。

如果您在类内使用 ajax 方法,请将 wp_ajax_ 句柄移到类外(写入主插件文件)并传递类名和方法名。例如:

add_action( 'wp_ajax_your_handle', [ 'Class_Name', 'function_name' ] );
add_action( 'wp_ajax_nopriv_your_handle', [ 'Class_Name', 'function_name' ] ); 
于 2020-11-18T07:54:13.387 回答
2

只需使用

add_action( 'wp_ajax_my_action', 'my_action' );
add_action( 'wp_ajax_nopriv_my_action', 'my_action' );

有关更多详细信息,请查看以下链接
https://codex.wordpress.org/AJAX_in_Plugins

于 2021-07-01T15:35:14.647 回答
1

wp_ajax_nopriv_(action)为未登录的用户执行。因此,如果您希望它在前端为访问者和登录用户触发,您可以这样做:

add_action( 'wp_ajax_my_action', 'my_action' );// 登录用户

add_action( 'wp_ajax_nopriv_my_action', 'my_action' );// 对于非登录用户

于 2021-06-24T17:55:07.437 回答
1
  1. 在 url 使用/wp-admin/admin-ajax.php并尝试拥有一个本地域,因为使用 localhost 或 localhost/wordpress 这可能很奇怪,在服务器上这将正常工作

  2. 尝试使用 fetch 或 XMLHttpRequest 来更好地控制请求,并且不要将数据作为 json 发送到 formData 对象中const formData = new FormData();

     fetch(loader.ajax_url, {
         method: "POST",
         body: formData,
     }).then((resp) => {
             console.log(resp);
     }).catch((resp) => {
             console.log(resp);
     });
    

它可以与其他组合一起使用,但我发现这几乎完美

于 2021-03-03T20:32:46.570 回答
1

在 Vanilla JavaScript 中,如果您不将此标头附加到 POST 请求,则会收到错误请求:

request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;');

所以请确保 jQuery 也附加了该标头。

于 2020-03-04T21:10:15.687 回答