Вопрос или проблема
Моя проблема заключается в том, что я не могу загрузить вложения к посту через форму на фронтенде. Я отправляю данные через 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-код.
Ваш код и обнаруженные проблемы
В вашем коде присутствует несколько моментов, которые необходимо исправить и оптимизировать для корректной загрузки и присоединения изображений:
- Работа с массивами файлов: Вы пытаетесь загрузить файлы, используя только первое изображение из массива, вместо обработки каждого изображения по отдельности.
- Правильное использование функции
wp_handle_upload
: Вам нужно передавать текущий загружаемый файл, а не всегда только первый. - Убедитесь, что вы передаете не массив, а отдельный файл в функции: Проверьте как вы передаете массив файлов в
$_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'];
}
}
}
}
Объяснение исправленного кода
- Проверка загруженных файлов: Мы добавили проверку, чтобы убедиться, что в массиве
$_FILES
есть загруженные файлы. - Цикл по каждому файлу: Код теперь обрабатывает каждый файл в цикле. Мы извлекаем временное имя и тип файла для дальнейшей загрузки.
- Правильная инициализация
wp_handle_upload
: Параметрыwp_handle_upload
должны использовать актуальные данные загруженного файла, а не только первый файл из массива. - Создание и вставка вложения: Код корректно создает вложение и вставляет его в базу данных, включая обработку метаданных.
Заключение
Теперь ваш код должен корректно загружать и прикреплять изображения к постам через AJAX. Если вы будете следовать этим рекомендациям, возникающие проблемы должны быть минимизированы. Убедитесь, что вы также обрабатываете возможные ошибки загрузки и возвращаете соответствующие сообщения клиенту. Надеюсь, эта информация была полезной, и вы сможете успешно реализовать функциональность загрузки изображений на вашем сайте.