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 не должно быть. Что происходит, если перейти по URL напрямую? http://localhost/wp-admin/admin-ajax.php?action=write_here_img_upload&test=true
- вам нужно добавить die( 'here' );
перед проверкой nonce, чтобы увидеть, попадаете ли вы вообще в функцию.

Я получаю -1
на check_ajax_referer( 'image_upload_nonce', 'security');
при прямом доступе по URL

Да, он создал debug.log
, но там только написано Made it into the Ajax function safe and sound!
. Не могли бы вы подсказать, что делать дальше?

@Ohsik Отсюда нужно отлаживать проблему. Может, записать в лог значения $_POST
и $_GET
: error_log( print_r( $val, 1 ) );
. Если бы я был игроком, поставил бы на то, что $_FILES
пуст и вам нужно установить encrypttype.

Вам нужно добавить enctype к вашей форме: Смотрите http://stackoverflow.com/a/4526286/800452

В моем случае это не решение, так как я не отправляю форму. Я делаю AJAX запрос на $("#wh_image_upload").change
. Есть идеи?

Давайте продолжим обсуждение в чате.
