admin-ajax.php возвращает 0. Как отладить и исправить?
Пытаюсь использовать admin-ajax.php для загрузки изображения из фронтенд-формы. Постоянно получаю 0 с приведённым ниже кодом и не понимаю, как это отладить или где ошибка.
У меня есть HTML input для файла
<input type="file" name="wh_image_upload" id="wh_image_upload" multiple="false" />
и локализованный скрипт для AJAX-запроса
$img_nonce = wp_create_nonce('image_upload_nonce');
wp_localize_script( 'ajax-script', 'ajax_image', array( 'ajax_url' => admin_url( 'admin-ajax.php' )) );
и PHP-функция
function write_here_featured_image_upload() {
var_dump($_FILES);
die();
}
add_action( 'wp_ajax_write_here_img_upload', 'write_here_featured_image_upload' );
add_action( 'wp_ajax_nopriv_write_here_img_upload', 'write_here_featured_image_upload' );
JS
// Загрузка изображения через AJAX
$("#wh_image_upload").change(function(){
var userFile = new FormData();
var fileInput = $( "#wh_image_upload" )[0].files[0];
//console.log(fileInput);
userFile.append("file", fileInput);
userFile.append("action", "write_here_img_upload");
$.ajax({
type: "POST",
url: ajax_object.ajax_url,
data: userFile,
processData: false,
contentType: false,
error: function(jqXHR, textStatus, errorMessage) {
console.log(errorMessage);
},
success: function(data) {
console.log("Изображение загружено! " + data);
}
});
});
Получаю сообщение об успешном выполнении AJAX с ответом 0. Изображение загружено! 0
Обновление Обновил свой рабочий код.
Включение отладки
В WordPress есть константы, определенные в файле wp-config.php, которые позволяют выводить ошибки на экран и записывать их в отдельный файл /wp-content/debug.log. Они выглядят так:
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_DISPLAY', true );
define( 'WP_DEBUG_LOG', true );
Вы можете записывать свою информацию в лог отладки в определенных точках и точно определять, где (или вообще вызывается ли функция) возникает ошибка:
function write_here_featured_image_upload() {
error_log( 'Функция Ajax успешно вызвана!' );
/** ... Остальной код ... **/
}
Проверка консоли инструментов разработчика
Почти все современные браузеры имеют Инструменты разработчика и Консоль, куда выводятся ошибки JavaScript. Если вы видите ошибку в консоли инструментов разработчика, ее нужно исправить в первую очередь.
Что касается возможного решения, у вас есть условие, которое предотвращает выполнение ajax на фронтенде сайта:
if ( is_admin() ) {
add_action( 'wp_ajax_write_here_img_upload', 'write_here_featured_image_upload' );
add_action( 'wp_ajax_nopriv_write_here_img_upload', 'write_here_featured_image_upload' );
}
Функция is_admin() указывает WordPress выполнять эти действия только в панели администратора / админке, поэтому на фронтенде сайта ничего не происходит. Попробуйте удалить условие и просто добавить действия как есть:
add_action( 'wp_ajax_write_here_img_upload', 'write_here_featured_image_upload' );
add_action( 'wp_ajax_nopriv_write_here_img_upload', 'write_here_featured_image_upload' );
Спасибо за ответ, к сожалению, удаление is_admin() не дает никакого эффекта. Я по-прежнему получаю 0 в ответе. Я включил все три режима отладки, но не вижу, чтобы создавался файл debug.log. Может быть, проблема в работе на Localhost??
Ohsik
@Ohsik не должно быть. Что происходит, если перейти по URL напрямую? http://localhost/wp-admin/admin-ajax.php?action=write_here_img_upload&test=true - вам нужно добавить die( 'here' ); перед проверкой nonce, чтобы увидеть, попадаете ли вы вообще в функцию.
Howdy_McGee
Я получаю -1 на check_ajax_referer( 'image_upload_nonce', 'security'); при прямом доступе по URL
Ohsik
Да, он создал debug.log, но там только написано Made it into the Ajax function safe and sound!. Не могли бы вы подсказать, что делать дальше?
Ohsik
@Ohsik Отсюда нужно отлаживать проблему. Может, записать в лог значения $_POST и $_GET: error_log( print_r( $val, 1 ) );. Если бы я был игроком, поставил бы на то, что $_FILES пуст и вам нужно установить encrypttype.
Howdy_McGee
Вам нужно добавить enctype к вашей форме: Смотрите http://stackoverflow.com/a/4526286/800452
Howdy_McGee
В моем случае это не решение, так как я не отправляю форму. Я делаю AJAX запрос на $("#wh_image_upload").change. Есть идеи?
Ohsik
Давайте продолжим обсуждение в чате.
Howdy_McGee