【问题标题】:Why am I getting a Status Code: 400 Bad Request error with WP Ajax?为什么我收到状态代码:WP Ajax 出现 400 Bad Request 错误?
【发布时间】:2020-11-20 16:16:47
【问题描述】:

我已经解决这个问题几个小时了,我很难理解为什么会发生这个错误。

在我的 JS 中,我有以下 ajax:

var $ = jQuery; // define jquery
let name = "Mark";
let pies = "cherry";

$(document).ready(function(){
    $.ajax({
        type : 'POST',
        dataType : 'json',
        url : ajaxurl,
        nonce: nonce,
        data : {
            action: 'myfunction',
            name: name,
            pies: pies,
            nonce: nonce
        }
    }).done(function(response) {
        console.log(response);
    });
}); // end document ready

在我的插件的 PHP 中,我有

    function myfunction() {    
        if ( wp_verify_nonce( $_POST['nonce'], 'registration_nonce')) {
            $name = $_POST['name'];
            $pies = $_POST['pies'];
            file_put_contents('debug_output.txt', $pies);
            die();
        }
    }
    add_action( 'wp_ajax_myfunction', 'myfunction' );
    add_action( 'wp_ajax_nopriv_myfunction', 'myfunction');

这每次给我 400。这应该是一件简单的事情,我通常一直这样做,但由于某种原因,我严重遗漏了一些东西。有什么想法吗?我将它削减到最低限度,但仍然没有运气。 ajax URL 和 nonce 都很好。 WP 有什么变化吗?

【问题讨论】:

  • 你的payload中的wpnonce是你之前定义的变量吗?它包含什么?
  • @El_Vanja wpnonce 是一个已定义的变量,并正确显示在有效负载中。在 devtools 中检查请求时,我确实注意到它显示为 formdata,因此我尝试删除 dataType: "json",甚至以 JSON 格式发送并使用 stringify。没有运气。
  • 也许你的动作钩子没有被 WordPress 及时注册,所以 WordPress 不知道它们的存在,因此出现了错误的请求响应? (下面的迭戈也提出了建议)。您能否创建一个精简版的插件,以便我们帮助您调试它? (见How to Create a Minimal, Reproducible Example。)

标签: php ajax wordpress


【解决方案1】:

有些事情也许你应该修复/检查:

  1. 在您的 PHP 操作中以 echo json_encode($myDataArray) 之类的内容结尾,其中 $myDataArray 类似于 array("key" => "value") ecc..
  2. 您在 PHP 操作中的最后一个函数调用应该始终是“die”或“exit”,或者只使用 WP wp_send_json(); (您有成功/错误的替代方案)
  3. 仔细检查 ajaxurl 是否确实指向 admin_url('admin-ajax.php')
  4. 在实际发生 AJAX 调用之前,仔细检查您的 add_action 挂钩是否在页面中的某处被调用

【讨论】:

  • 我将其缩减到最低限度并编辑了上面的代码,但没有运气.. 400 后只有 400。任何理想的人吗??
  • 这是唯一一个在您的网站上不起作用的 ajax 功能吗?喜欢测试任何后端 wp ajax,如果你找到一些,也许是前端
  • #4 是魅力所在。我在代码中将 add_action 移到了更高的位置,它起作用了。干杯。
  • 如果解决了您的问题,请将其标记为已接受
【解决方案2】:

错别字?

add_action( 'wp_ajax_nopriv_myactiont', 'myaction');

// should be

add_action( 'wp_ajax_nopriv_myaction', 'myaction');

// final result

function myaction(){
  echo "success";
  exit;
}
add_action( 'wp_ajax_myaction', 'myaction' );
add_action( 'wp_ajax_nopriv_myaction', 'myaction');

迭戈的回答也有一些值得检查的地方。

【讨论】:

  • 是的.. 当我为 SO 重新创建时一个错字:-) 必须让公司的东西远离公共论坛。哈哈
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 2013-11-09
相关资源
最近更新 更多