Вопрос или проблема
Я хочу добавить media_sideload_image
, чтобы загрузить файл программно. У меня это работает, когда URL изображения в интернете (например, http://etc..), но не работает, когда это локальный файл с моего жесткого диска или сетевого диска (например, file://etc). Я получаю ошибку Catchable fatal error: Object of class WP_Error could not be converted to string
.
Это возможно? Я предполагаю, что должна быть какая-то возможность обойти это, так как админ-сайт WordPress может загружать локальные файлы.
Вы можете сделать это, используя функцию media_handle_upload(). Вот рабочий пример, который вы можете использовать в качестве руководства для ваших нужд:
Сначала создайте вашу HTML-форму
<form method="post" id="uploadCartaAnno" enctype="multipart/form-data">
<input class="text-input" name="carta_ano" type="file" id="carta_ano" multiple="false"/>
<?php wp_nonce_field( 'my_image_upload', 'my_image_upload_nonce' ); ?>
<input name="updatecarta_ano" type="submit" id="updatecarta_ano" class="hp-btn-file -icon-upload" value="Subir formato" />
<input name="action" type="hidden" id="action" value="update-user" />
</form>
Затем ваш PHP код
if (
isset( $_POST['my_image_upload_nonce'] )
&& wp_verify_nonce( $_POST['my_image_upload_nonce'], 'my_image_upload' )
) {
// Nonce действителен, и можно продолжать.
// Эти файлы необходимо включить в качестве зависимостей на фронт-энде.
require_once( ABSPATH . 'wp-admin/includes/image.php' );
require_once( ABSPATH . 'wp-admin/includes/file.php' );
require_once( ABSPATH . 'wp-admin/includes/media.php' );
// Позвольте WordPress обработать загрузку.
$attachment_id = media_handle_upload( 'carta_ano', $comId );
if ( is_wp_error( $attachment_id ) ) {
// Произошла ошибка при загрузке изображения.
} else {
// Изображение было успешно загружено!
}
} else {
// Покажите сообщение об ошибке, если nonce не удалось.
}
Ответ или решение
Да, вы можете использовать функцию media_sideload_image
для загрузки изображений из сетевых мест, но с ограничениями, поскольку эта функция предназначена для обработки URL-адресов, доступных в сети. Попытка загрузить локальные файлы (например, через file://
) этим методом вызовет ошибки, поскольку WordPress не поддерживает использование протоколов file://
для загрузки через эту функцию.
Перенаправление к решению с использованием media_handle_upload
:
Для загрузки локальных файлов в WordPress лучше воспользоваться функцией media_handle_upload
, которая предназначена для управления процессом загрузки файлов на сервер через формы HTML. Это аналог метода, который используется в административной части WordPress при ручной загрузке медиафайлов.
Шаги для загрузки локальных файлов:
- Создание HTML формы
Пример формы для загрузки:
<form method="post" id="uploadCartaAnno" enctype="multipart/form-data">
<input class="text-input" name="carta_ano" type="file" id="carta_ano" multiple="false"/>
<?php wp_nonce_field('my_image_upload', 'my_image_upload_nonce'); ?>
<input name="updatecarta_ano" type="submit" id="updatecarta_ano" class="hp-btn-file -icon-upload" value="Subir formato"/>
<input name="action" type="hidden" id="action" value="update-user"/>
</form>
- Обработка данных формы на сервере
Используйте следующий фрагмент PHP-кода для обработки загрузки:
if (
isset($_POST['my_image_upload_nonce']) &&
wp_verify_nonce($_POST['my_image_upload_nonce'], 'my_image_upload')
) {
// Подключение необходимых файлов WordPress.
require_once(ABSPATH . 'wp-admin/includes/image.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/media.php');
// Используем WordPress для обработки загрузки.
$attachment_id = media_handle_upload('carta_ano', $comId);
if (is_wp_error($attachment_id)) {
// Произошла ошибка при загрузке изображения.
} else {
// Изображение успешно загружено!
}
} else {
// Обработка для случая ошибки nonce.
}
Ключевые моменты:
-
Nonce для безопасности: Проверьте, что перед загрузкой данных с клиента на сервер используется nonce для предотвращения CSRF-атак. Ваша форма включает
wp_nonce_field
, который генерирует поле с nonce, а на сервере проверяется его правильность с помощьюwp_verify_nonce
. -
Зависимости WordPress: Подключите необходимые модули WordPress для работы с медиафайлами, которые включают
image.php
,file.php
иmedia.php
. Эти модули обязательны для работы функцииmedia_handle_upload
. -
Ошибка обработки: Используйте
is_wp_error
для проверки успешности загрузки и обработки возможных ошибок. Это поможет создать более надежное и устойчивое приложение.
Это метод, который профессионалы в области разработки WordPress используют для надежной загрузки локальных медиафайлов, обеспечивая при этом безопасность и функциональность, характерные для экосистемы WordPress.