Помощь в загрузке вложений постов из Ajax

Вопрос или проблема

Моя проблема заключается в том, что я не могу загрузить вложения к посту через форму на фронтенде. Я отправляю данные через AJAX в свои php файлы, содержащие функции. Позвольте мне прояснить: все работает отлично, пост создаётся со всей необходимой информацией. Единственная недостающая часть заключается в том, что изображения, которые я отправляю, не прикреплены к посту.

Моя проблема, вероятно, в моей php функции для прикрепления изображений.

Мой html

<input id="moreimages" type="file" name="moreimages[]" multiple >

Моя php функция

$pid = // id проекта
$uid = // текущий пользователь

if ( $_FILES ) { 
$files = $_FILES["moreimages"];  
foreach ($files['name'] as $key => $value) {            
            if ($files['name'][$key]) {
                $upload_overrides             = array('test_form' => false);
                $uploaded_file                = wp_handle_upload($_FILES['file'], $upload_overrides);
                $file_name_and_location       = $uploaded_file['file'];
                $file_title_for_media_library = $_FILES['file']['name'];
                $arr_file_type      = wp_check_filetype(basename($_FILES['file']['name']));
                $uploaded_file_type = $arr_file_type['type'];
                $image = array( 
                    'post_mime_type' => $uploaded_file_type,
                    'post_title' => addslashes($file_title_for_media_library),
                    'post_content' => '',
                    'post_status' => 'inherit',
                    'post_parent' => $pid,
                    'post_author' => $uid
                ); 
                $_FILES = array ("moreimages" => $image); 
                foreach ($_FILES as $images => $array) {              
                    $image_id = wp_insert_attachment($image, $file_name_and_location, $pid);
                    $attach_data = wp_generate_attachment_metadata($image_id, $file_name_and_location);
                    wp_update_attachment_metadata($image_id, $attach_data); 
                }
            } 
        } 
    }

Повторяю, я вижу в своем console.log, что изображения корректно отправляются AJAX в объект FormData. Я вижу это, когда загружаю FIRST.jpg.

Content-Disposition: form-data; name="moreimages[]"; filename="FIRST.jpg"
Content-Type: image/jpeg

Таким образом, проблема, вероятно, в цикле php для прикрепления изображений. Можете помочь мне, пожалуйста? Заранее спасибо!

На самом деле я забыл создать функцию для загрузки и прикрепления изображений. Я нашел правильный метод в другом вопросе здесь Загрузка нескольких вложений с фронтенда с описанием.

Ответ или решение

Как загрузить вложения постов с помощью AJAX

Введение

Одной из распространенных задач для разработчиков веб-приложений является загрузка файлов с помощью AJAX. В данной статье мы рассмотрим, как правильно реализовать загрузку изображений через AJAX на стороне клиента и их последующее сохранение на сервере с помощью PHP и WordPress. Вы уже сделали много хорошей работы, и нам лишь нужно внести несколько корректировок в ваш PHP-код.

Ваш код и обнаруженные проблемы

В вашем коде присутствует несколько моментов, которые необходимо исправить и оптимизировать для корректной загрузки и присоединения изображений:

  1. Работа с массивами файлов: Вы пытаетесь загрузить файлы, используя только первое изображение из массива, вместо обработки каждого изображения по отдельности.
  2. Правильное использование функции wp_handle_upload: Вам нужно передавать текущий загружаемый файл, а не всегда только первый.
  3. Убедитесь, что вы передаете не массив, а отдельный файл в функции: Проверьте как вы передаете массив файлов в $_FILES для обработки.

Исправленный код PHP

Приведем исправленный пример кода:

$pid = // идентификатор проекта
$uid = // текущий пользователь

if ( ! empty( $_FILES['moreimages']['name'][0] ) ) { // Проверяем, были ли загружены файлы
    $files = $_FILES['moreimages'];  
    foreach ($files['name'] as $key => $filename) {
        if ($files['name'][$key]) {
            $file_temp = $files['tmp_name'][$key]; // Получаем временное имя файла
            $file_type = wp_check_filetype($filename); // Получаем тип файла

            // Настройки для загрузки
            $upload_overrides = array('test_form' => false);
            $uploaded_file = wp_handle_upload($_FILES['moreimages'], $upload_overrides);

            if ( isset($uploaded_file['file']) ) {
                // Создание массива для вложения
                $image_data = array(
                    'post_mime_type' => $file_type['type'],
                    'post_title'     => sanitize_file_name($filename),
                    'post_content'   => '',
                    'post_status'    => 'inherit',
                    'post_parent'    => $pid,
                    'post_author'    => $uid
                );

                // Вставляем вложение в базу данных
                $image_id = wp_insert_attachment($image_data, $uploaded_file['file'], $pid);

                // Генерация метаданных вложения
                $attach_data = wp_generate_attachment_metadata($image_id, $uploaded_file['file']);
                wp_update_attachment_metadata($image_id, $attach_data);
            } else {
                // Обработка ошибки
                echo 'Ошибка загрузки файла: ' . $uploaded_file['error'];
            }
        }
    }
}

Объяснение исправленного кода

  1. Проверка загруженных файлов: Мы добавили проверку, чтобы убедиться, что в массиве $_FILES есть загруженные файлы.
  2. Цикл по каждому файлу: Код теперь обрабатывает каждый файл в цикле. Мы извлекаем временное имя и тип файла для дальнейшей загрузки.
  3. Правильная инициализация wp_handle_upload: Параметры wp_handle_upload должны использовать актуальные данные загруженного файла, а не только первый файл из массива.
  4. Создание и вставка вложения: Код корректно создает вложение и вставляет его в базу данных, включая обработку метаданных.

Заключение

Теперь ваш код должен корректно загружать и прикреплять изображения к постам через AJAX. Если вы будете следовать этим рекомендациям, возникающие проблемы должны быть минимизированы. Убедитесь, что вы также обрабатываете возможные ошибки загрузки и возвращаете соответствующие сообщения клиенту. Надеюсь, эта информация была полезной, и вы сможете успешно реализовать функциональность загрузки изображений на вашем сайте.

Оцените материал
Добавить комментарий

Капча загружается...