WordPress Ajax返回404错误请求?

时间:2018-11-02 18:19:31

标签: php jquery ajax wordpress

错误在下面

POST http://localhost/...../wp-admin/admin-ajax.php 400 (Bad Request)

send @ load-scripts.php?c=1…e,utils&ver=4.9.8:4 ajax @ load-scripts.php?c=1…e,utils&ver=4.9.8:4 (anonymous) @ my-ajax-handler.js?ver=0.1.0:24 i @ load-scripts.php?c=1…e,utils&ver=4.9.8:2 fireWith @ load-scripts.php?c=1…e,utils&ver=4.9.8:2 ready @ load-scripts.php?c=1…e,utils&ver=4.9.8:2
K @ load-scripts.php?c=1…e,utils&ver=4.9.8:2

                $.ajax({
                    type: "POST",
                    url    : my_ajax_handler_var.ajaxurl,
                    
                    data   : {
                         action: 'rc_generate_pa'// "wp_ajax_*" action hook
                    },
                    contentType: "application/json; charset=utf-8",
                    dataType: "json"
                    ,success:function(data) {
                         //This outputs the result of the ajax request
                        var pass = JSON.parse( data );
                        $('#p').val(data);
                        alert( JSON.parse(data));
                    },
                    error: function(errorThrown){
                        console.log(errorThrown);
                    }
                })
//                .done( function( response ) {
//                    var pass = response;
//                    $('#p').val(pass);
//                })
                .fail( function() {
                    console.log("failed");
                });

用于排队脚本和处理请求的PHP代码

add_action('admin_enqueue_scripts', 'enqueue_st_page_scripts');
 function enqueue_st_page_scripts() {       
wp_register_script('my-ajax-handler', $plugin_url .'js/my-ajax-handler.js', array('jquery'), '0.1.0', true );
       wp_enqueue_script(array('my-ajax-handler'));
       $vars = array('ajaxurl' => admin_url('admin-ajax.php'));
       wp_localize_script('my-ajax-handler', 'my_ajax_handler_var', $vars); 
   }

    add_action( 'wp_ajax_rc_generate_pa', 'rc_generate_p' );
        function rc_generate_p(){
            $pass = (string)wp_generate_password(8, true, false); 
            echo $pass;
            header('Content-Type: application/json');
            $results = json_encode($pass);
            echo $results;
            exit;
        }    

我在此站点上看到了类似的问题,并尝试了解决方案,但没有成功。我是WordPress插件开发的新手。

1 个答案:

答案 0 :(得分:0)

主要问题

问题出在$.ajax()调用中,您应该contentType设置为JSON:

$.ajax({
  url: my_ajax_handler_var.ajaxurl,
  contentType: "application/json; charset=utf-8",
  ...
});

因为那样(从PHP端),该操作(即rc_generate_pa)在$_REQUEST['action']中不可用,WordPress使用该操作来确定被调用的AJAX操作,以及该操作未知时,WordPress会引发400 Bad Request错误。

要解决该错误,只需删除contentType属性:(或使用JSON类型以外的其他内容)

$.ajax({
  url: my_ajax_handler_var.ajaxurl,
  // Don't set contentType
  ...
});

第二期

$.ajax()的{​​{1}}回调中,请勿使用success;这就是为什么:

  1. JSON.parse( data )dataType时,jQuery将自动将响应输出解析为JSON对象-或者也可以是 string ;参见下面的第二点。

  2. 在(PHP)json函数中,rc_generate_p()既不是$pass也不是array / object;因此,在class的{​​{1}}回调中,$.ajax()实际上是无效的JSON字符串,并且success将引发JavaScript语法错误。 / p>

因此,您的data的{​​{1}}可以重写为:

JSON.parse( data )

第三期

在您的$.ajax()函数中,删除success,否则会出现JavaScript语法错误-您的AJAX调用需要JSON响应,但是success: function(data){ $('#p').val(data); console.log(typeof data); // test }) 部分使JSON。

我知道您可能已经添加了它来调试rc_generate_p()错误;但我想我应该提醒您有关删除它的信息..:)

您可能需要考虑像这样使用wp_send_json(),而无需致电echo $pass;echowp_die()

400