Можно ли использовать media_sideload_image для загрузки локальных файлов?

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

Я хочу добавить 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 при ручной загрузке медиафайлов.

Шаги для загрузки локальных файлов:

  1. Создание 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>
  1. Обработка данных формы на сервере

Используйте следующий фрагмент 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.

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

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