Ошибка ниже
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.info(errorThrown);
}
})
// .done( function( response ) {
// var pass = response;
// $('#p').val(pass);
// })
.fail( function() {
console.info("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.
Он печатает локальный хост /...../ WP-админ / админ-ajax.php
Все эти точки делают запрос плохим, но я не понимаю, откуда они. Может быть, есть файл конфигурации, в котором что-то вроде $url = "localhost/....." определено как пример URL-адреса?
Нет, вы это неправильно поняли. Я поставил ...... точки. Прошу прощения за то, что сбил вас с толку. Исходный URL-адрес, который он печатает, - localhost / mysitename / wp-admin / admin-ajax.php. Я очень ценю ваши комментарии.
Посетите /wp-admin/admin-ajax.php?action=rc_generate_pa и посмотрите, будет ли вызван ваш rc_generate_p(). Если нет, то для WordPress нормально выдает ошибку 400.
Да, я посетил /wp-admin/admin-ajax.php?action=rc_generate_pa, и он выводит SnEI @ ca #, который, вероятно, является результатом в кодировке json, возвращаемым из rc_generate_p (), я просто предполагаю
На самом деле, я думаю, что запрос AJAX был успешным; однако вы не отправляете действительный ответ JSON - или часть echo $pass; делает вывод ответа недействительным. Попробуйте прокомментировать его или просто удалить, а затем повторите вызов AJAX.
Если «dataType» вашего AJAX - json, вам не нужен «JSON.parse». ваши данные json
Я пробовал предложенные вами способы, но безуспешно. Я даже установил $ pass = "hello world", это тоже не сработало. Может ли кто-нибудь из вас воспроизвести проблему и найти решение? Кстати, я использую WordPress версии 4.9.8. Спасибо, ребята, за постоянную поддержку.






Проблема заключается в вызове $.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 ); и вот почему:
Когда dataType - это json, jQuery автоматически анализирует вывод ответа в объект JSON - или это также может быть нить; см. пункт 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.info(typeof data); // test
})
В вашей функции rc_generate_p() удалите echo $pass;, иначе вы получите синтаксическую ошибку JavaScript - ваш вызов 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 );
}
Спасибо всем за спасение моего проекта, особенно Салли СиДжей за то, что она так быстро решила проблему. Я застрял на этом несколько дней. Еще раз большое спасибо.
Я хотел дать вам голосование, но у меня недостаточно репутации (как минимум 15) для этого. Надеюсь, когда-нибудь в будущем.
Добро пожаловать, я рад, что смог вам помочь. И это нормально насчет голосования. :) Ваше здоровье!
запустите код в comsole и сообщите мне, какой результат был напечатан: console.info (my_ajax_handler_var.ajaxurl);