Wordpress admin-ajax.php 404错误请求

时间:2017-12-29 16:56:35

标签: ajax wordpress wordpress-theming admin-ajax

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

(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: ƒ, …}

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

7 个答案:

答案 0 :(得分:8)

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

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

其次,你的ajax动作名称不是php回调函数名,而是钩子wp_ajax_{action_name} / wp_ajax_nopriv_{action_name}的动态部分,所以在你的情况下它应该是:

data : {
    action : 'post_cart_clb',
    id : 1
},

答案 1 :(得分:4)

我修改了您的代码并查看此内容:

(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}

答案 2 :(得分:1)

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

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

因此,请确保jQuery还要附加该标头。

答案 3 :(得分: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);
     });
    

它可以与其他组合一起使用,但我觉得这几乎是完美的

答案 4 :(得分:0)

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

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

add_action( 'wp_ajax_your_handle', [ 'Class_Name', 'function_name' ] );
add_action( 'wp_ajax_nopriv_your_handle', [ 'Class_Name', 'function_name' ] ); 

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

随便用

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

欲了解更多详情,请查看以下链接
https://codex.wordpress.org/AJAX_in_Plugins

相关问题