Как создать изображение и загрузить его в медиатеку WordPress?

Я занимаюсь обрезкой загружаемого изображения с помощью jCrop. Пользователь выбирает область для обрезки, нажимает кнопку, и файл отправляется на сервер, где он обрезается, после чего я успешно отображаю полученное изображение на экране пользователя. 

Вот мой код для вывода обрезанного изображения:

<pre><code>ob_start();
imagejpeg( $img_o, NULL, 100 );
imagedestroy( $img_o );
$i = ob_get_clean();
echo "&lt;img src='data:image/jpeg;base64," . base64_encode( $i )."'&gt;";</code></pre>

Однако я хочу сразу загружать это изображение в библиотеку медиафайлов WordPress. Я пробовал использовать функции media_handle_sideload($img_o) и media_handle_sideload($i), но получаю ошибку. Можете подсказать, в каком направлении мне стоит двигаться или как можно реализовать данную задачу?
  • 3 февраля 2025 г. 10:54
Ответы на вопрос 2
Чтобы загрузить обрезанное изображение в медиатеку WordPress, вам необходимо использовать подходящий метод для обработки изображений и их загрузки. Вот шаги, которые вам помогут реализовать вашу задачу:

1. **Сохранение обрезанного изображения на сервере**: Прежде чем загружать изображение в медиатеку, необходимо сохранить его на диск. Вы можете использовать `imagejpeg()` для этого.

2. **Использование функции `media_handle_sideload`**: После того как изображение сохранено на сервере, вы можете воспользоваться функцией `media_handle_sideload()` для загрузки его в медиатеку.

Вот примерный код, который может помочь вам:

```php
// После того, как вы создали и обрезали изображение
$upload_dir = wp_upload_dir();
$filename = 'cropped_image.jpg'; // Дайте уникальное имя файлу
$file_path = $upload_dir['path'] . '/' . $filename;

// Сохраните обрезанное изображение на сервере
imagejpeg($img_o, $file_path, 100);
imagedestroy($img_o);

// Подготовьте массив для media_handle_sideload
$file_array = array(
    'name'     => basename($file_path),
    'type'     => 'image/jpeg', // Убедитесь, что MIME-тип соответствует формату изображения
    'tmp_name' => $file_path,
    'error'    => 0,
    'size'     => filesize($file_path),
);

// Подключите необходимый файл, если он не подключен
if (!function_exists('media_handle_sideload')) {
    require_once(ABSPATH . 'wp-admin/includes/media.php');
    require_once(ABSPATH . 'wp-admin/includes/file.php');
    require_once(ABSPATH . 'wp-admin/includes/image.php');
}

// Загрузите файл в медиатеку
$attachment_id = media_handle_sideload($file_array, 0); // 0 - это ID поста, если нет, установите 0

// Проверка на ошибки
if (is_wp_error($attachment_id)) {
    echo "Ошибка загрузки: " . $attachment_id->get_error_message();
} else {
    echo "Изображение успешно загружено в медиатеку, ID: " . $attachment_id;
}
```

### Описание кода:

1. **Сохранение изображения**: В этом коде сначала изображение сохраняется на сервере в каталоге загрузок WordPress (`wp_upload_dir()`) с именем `cropped_image.jpg`.

2. **Подготовка массива**: Создаётся массив `$file_array`, который соответствует формату данных, ожидаемому функцией `media_handle_sideload()`.

3. **Проверка и подключение методов**: Убедитесь, что необходимые файлы загружены, если вы работаете вне контекста админки.

4. **Загрузка изображения**: Используйте `media_handle_sideload()` для загрузки изображения в медиатеку. Результатом будет ID вложения, который можно использовать для работы с загруженным изображением.

5. **Обработка ошибок**: Обрабатываем возможные ошибки загрузки с помощью `is_wp_error()`.

Таким образом, вы сможете успешно загружать обрезанные изображения в медиатеку WordPress с помощью вышеописанного метода.
1. wp_tempnam() - создать временный файл $tmp для его последующей перезаписи из п3. 
2. Объявить ассоциативный массив с данными изображения, где среди прочего передать 'name' => basename($tmp),
3. Перезаписать временный файл из п1 - media_handle_sideload() , возвращается id изображения.
4. Удалить временный файл - unlink() .
5. Зная id уже загруженного изображения на сервер (п3), можно получить его превью.

Выглядеть это будет примерно так (это очень грубый пример):
$tmp = wp_tempnam('img');
imagejpeg($img_o, $tmp, 100);
imagedestroy($img_o);

$file_data = [
    'name' => basename($tmp),
    'tmp_name' => $tmp,
];

$id = media_handle_sideload($file_data);
unlink($tmp);

echo wp_get_attachment_image_url($id, 'thumbnail');
Похожие вопросы