来自自定义AJAX调用的错误请求400

时间:2020-07-21 作者:JPL

我想尽一切办法,但还是收到了400 Ajax WordPress的坏请求。我尝试应用在其他线程中找到的序列化和答案,但仍然得到400个错误。

Custom Page Template index.php

add_action( \'wp_enqueue_scripts\', \'myblog_ajax_enqueue\' );
function myblog_ajax_enqueue() {
  wp_enqueue_script(\'myblog-ajax-script\', get_stylesheet_directory_uri() . \'/template-parts/templates/blog/js/ajax.js\',array(\'jquery\'));
  wp_localize_script(   \'myblog-ajax-script\',\'myblog_ajax_obj\', array(\'ajaxurl\' => admin_url( \'admin-ajax.php\' ),\'nonce\' => wp_create_nonce(\'ajax-nonce\')));
}

blogcontent.php

function myblog_ajax_request() {
    $nonce = $_POST[\'nonce\'];
    if ( ! wp_verify_nonce( $nonce, \'myblog-ajax-script\' ) ) {
        die( \'Nonce value cannot be verified.\' );
    }
    // The $_REQUEST contains all the data sent via ajax
    if ( isset($_REQUEST) ) {
        $fruit = $_REQUEST[\'fruit\'];
        // Let\'s take the data that was sent and do something with it
        if ( $fruit == \'Banana\' ) {
            $fruit = \'Apple\';
        }
        echo $fruit;
    }
   die();
}

add_action( \'wp_ajax_myblog_ajax_request\', \'myblog_ajax_request\' );
add_action( \'wp_ajax_nopriv_myblog_ajax_request\', \'myblog_ajax_request\' );

Ajax.Js

jQuery(document).ready(function($) {


  var fruit = \'Banana\';

  // This does the ajax request
  $.ajax({
    url: myblog_ajax_obj.ajaxurl,
    data: JSON.stringify({
      \'action\': \'myblog_ajax_request\',
      \'fruit\': fruit,
      \'nonce\': myblog_ajax_obj.nonce
    }),
    success: function(data) {
      // This outputs the result of the ajax request
      console.log(data);
    },
    error: function(errorThrown) {
      console.log(errorThrown);
    },
    dateType: \'json\',
    contentType: \'application/json; charset=utf-8\'
  });

});

3 个回复
SO网友:Jacob Peattie

管理ajax出现400错误的原因只有一个。php:wp_ajax_{$action}wp_ajax_nopriv_{$action} 操作未与挂钩{$action}action 随请求发送的数据参数。因此,要么您的回调没有挂接,要么您没有正确发送操作。您的代码同时出错。

您正在将发送到服务器的数据编码为JSON。WordPress查找$_REQUEST[\'action\'] 触发适当的操作。当数据作为JSON发送到服务器时,$_REQUEST 无法填充,因此$_REQUEST[\'action\'] 不存在,意味着您的回调永远不会运行。您需要删除JSON.stringify() 从您的代码add_action() 对于wp_ajax_myblog_ajax_request 在页面模板中。这行不通。您正在将请求发送到wp-admin/admin-ajax.php, 但该代码不会加载模板,因此您的回调不会挂接该请求。您需要使用add_action() 在加载的文件中wp-admin/admin-ajax.php, 例如主题的功能。php文件或插件

SO网友:Tom J Nowell

这是您的问题:

博客内容。php

当联系WP处理管理AJAX请求时,它不会加载页面模板。记住,每个对WP的请求都会从一张白板上加载WP。它对之前的请求一无所知,只知道它告诉了什么。

因此,由于您没有请求该页面,模板永远不会加载,过滤器永远不会运行,因此没有AJAX处理程序来处理您的请求。

因此,请将过滤器移动到functions.php. 还可以考虑使用现代REST API来处理您的请求,使用人类可读的错误消息进行调试更容易、更好,如果您告诉它如何进行验证,它将为您清理身份验证和验证!你甚至可以得到一个友好的URL。

完成后,撤消您为尝试修复此问题所做的所有其他操作,例如设置数据类型或内容类型,这会对您造成伤害。

SO网友:Az Rieil

发送是作为对象,而不是JSON字符串

删除内容类型,您应该让默认值(application/x-www-form-urlencoded)

删除数据类型-您可以将响应作为文本而不是json发送。(用于JSON响应wp_send_json )

确保在init文件(插件主文件或functions.php)中注册ajax操作

您还可以尝试在wp admin/admin ajax中一步一步地调试它。php。400错误表示您代码获取此文件,但无法识别操作

 url: myblog_ajax_obj.ajaxurl,
 data: {
   action: \'myblog_ajax_request\',
   fruit: fruit,
   nonce: myblog_ajax_obj.nonce
 },
 success: function(data) {
   console.log(data);
 }

相关推荐

使用jQuery检查是否选中了类别中的第二级复选框

我有两个级别的类别列表。第一个级别是多个级别(超过30个)。此外,关联的子项来自WP管理员,我想在选中至少一个第二级(子项)复选框时进行检查。提交#帖子后,我将运行jquery函数。这一部分很简单,但我不知道如何检查孩子们是否接受过检查。已经连续几天撞到我的头了:)