WordPress ajax возвращает 404 неверных запроса? - PullRequest
0 голосов
/ 02 ноября 2018

Ошибка ниже

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 голосов
/ 03 ноября 2018

Основной выпуск

Проблема в вызове $.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() success не используйте JSON.parse( data ); и вот почему:

  1. Если dataType равно json, jQuery автоматически проанализирует вывод ответа в объект JSON & mdash; или это может быть также строка ; см. пункт № 2 ниже.

  2. В (PHP) rc_generate_p() функция $pass не является ни array, ни object / class; следовательно, в обратном вызове $.ajax() success data на самом деле является недопустимой строкой JSON , и JSON.parse( data ) вызовет синтаксическую ошибку JavaScript.

Так что ваши $.ajax() success могут быть переписаны в:

success: function(data){
  $('#p').val(data);
  console.log(typeof data); // test
})

Третий выпуск

В функции rc_generate_p() удалите echo $pass;, иначе вы получите синтаксическую ошибку JavaScript & mdash; Ваш AJAX-вызов ожидает ответа JSON, но эта часть echo делает недействительным JSON.

Я знаю, вы, вероятно, добавили это для отладки ошибки 400; но я подумал, что должен напомнить вам о том, как удалить его ..:)

И, возможно, вы захотите использовать wp_send_json() примерно так, когда вам не нужно звонить exit, die или wp_die():

function rc_generate_p() {
  $pass = wp_generate_password( 8 );
  wp_send_json( $pass );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...