admin-ajax.php возвращает 0. Как отладить и исправить?

24 нояб. 2015 г., 21:00:57
Просмотры: 15.6K
Голосов: 4

Пытаюсь использовать 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

Обновление Обновил свой рабочий код.

2
Комментарии

Если вам нужно выполнять AJAX только в административной части, удалите хук nopriv - Кодекс говорит: Этот хук функционально идентичен wp_ajax_(action), но используется для обработки AJAX-запросов на фронтэнде

Howdy_McGee Howdy_McGee
24 нояб. 2015 г. 21:12:59

Обновленный рабочий код в вопросе.

Ohsik Ohsik
25 нояб. 2015 г. 00:14:49
Все ответы на вопрос 2
10

Включение отладки

В 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' );
24 нояб. 2015 г. 21:21:40
Комментарии

Спасибо за ответ, к сожалению, удаление is_admin() не дает никакого эффекта. Я по-прежнему получаю 0 в ответе. Я включил все три режима отладки, но не вижу, чтобы создавался файл debug.log. Может быть, проблема в работе на Localhost??

Ohsik Ohsik
24 нояб. 2015 г. 22:47:02

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

Howdy_McGee Howdy_McGee
24 нояб. 2015 г. 22:50:07

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

Ohsik Ohsik
24 нояб. 2015 г. 22:55:36

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

Ohsik Ohsik
24 нояб. 2015 г. 23:00:18

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

Howdy_McGee Howdy_McGee
24 нояб. 2015 г. 23:04:45

Да, $_FILES кажется пустым. Значит, проблема в JS?

Ohsik Ohsik
24 нояб. 2015 г. 23:10:04

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

Howdy_McGee Howdy_McGee
24 нояб. 2015 г. 23:11:22

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

Ohsik Ohsik
24 нояб. 2015 г. 23:17:16

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

Howdy_McGee Howdy_McGee
24 нояб. 2015 г. 23:18:41

Параметр action передается вместе с data. Я удалил action: "write_here_img_upload", в $ajax и добавил userFile.append("action", "write_here_img_upload");

Ohsik Ohsik
25 нояб. 2015 г. 00:07:22
Показать остальные 5 комментариев
1

Добавьте этот код в файл admin-ajax.php

ini_set('display_errors', 1); // Включить отображение ошибок
ini_set('display_startup_errors', 1); // Включить отображение стартовых ошибок
error_reporting(E_ALL); // Установить уровень отчетности обо всех ошибках
16 апр. 2020 г. 13:42:14
Комментарии

Пожалуйста, [отредактируйте] ваш ответ и добавьте объяснение: почему это может решить проблему?

fuxia fuxia
16 апр. 2020 г. 19:52:58