WP_UPLOAD_BITS() Function: Upload Files in WordPress │ WP 2.0.0

# WP_UPLOAD_BITS() │ WP 2.0.0

Функция wp_upload_bits() создает файл в папке для загрузки с заданным содержимым. 

Если возникает ошибка, в массиве вернется ключ error с сообщением об ошибке. Если все прошло успешно, то будет возвращен ключ file с уникальным путем к файлу, ключ url с ссылкой на новый файл и ключ error, который будет равен false.

Обратите внимание, что эта функция не перемещает загруженный файл в папку загрузок. Она создает новый файл с содержимым, полученным из параметра $bits. Если вы хотите переместить загруженный файл, сначала прочитайте его содержимое, а затем передайте имя файла и содержимое в эту функцию, чтобы добавить файл в папку загрузок.

Права доступа для нового файла устанавливаются автоматически.

## Использует:
- wp_check_filetype()
- wp_upload_dir()
- wp_unique_filename()

## Хуки
- wp_upload_bits
- wp_handle_upload

## Возврат
Функция возвращает массив с информацией о новом загруженном файле.

## Применение
```php
wp_upload_bits( $name, $deprecated, $bits, $time );

Где:

  • $name (string) (обязательный) — имя файла.
  • $deprecated (null|string) (обязательный) — не используется. Устанавливается в null.
  • $bits (string) (обязательный) — содержимое файла.
  • $time (string|null) — время в формате 'yyyy/mm'. По умолчанию null.

Примеры

Пример 1: Как загрузить файл в собственный каталог в WordPress

Этот пример загружает PDF-документ в папку wp-content/uploads/customDirectory:

Выберите файл для загрузки:
global $wp_filesystem;
WP_Filesystem();

$content_directory = $wp_filesystem->wp_content_dir() . 'uploads';
$custom_dirname = 'CustomDirectory';
$wp_filesystem->mkdir( "$content_directory/$custom_dirname" );
$target_dir_location = "$content_directory/$custom_dirname";

if ( isset( $_POST['submittheform'] ) && isset( $_FILES['fileToUpload'] ) ) {
    $name_file = $_FILES['fileToUpload']['name'];
    $tmp_name = $_FILES['fileToUpload']['tmp_name'];

    $cont = file_get_contents( $tmp_name );
    $upload = wp_upload_bits( $name_file, null, $cont );

    // Проверяем наличие ошибки
    if( $upload['error'] ) {
        echo 'Произошла ошибка: '. $upload['error'];
    } else {
        $move = move_uploaded_file( $upload['file'], "$target_dir_location/$name_file" );

        if ( $move ) {
            echo "Файл был успешно загружен";
        } else {
            echo "Файл не был загружен";
        }
    }
}

Пример 2: Демонстрация загрузки файла в папку

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

$cont = file_get_contents('http://example.com/some_img.png');
$new_file_name = 'uploaded.png';
$upload = wp_upload_bits( $new_file_name, null, $cont );

// Проверяем наличие ошибки
if( $upload['error'] )
    echo 'Произошла ошибка: '. $upload['error'];
else
    echo 'Успешно! Путь к файлу: '. $upload['file'] .'; URL файла: '. $upload['url'];

В массиве $upload будет следующая информация:

Array ( 
    [file] => /home/user/site/public_html/wp-content/2013/03/uploaded.png 
    [url] => http://example.com/wp-content/uploads/2013/03/uploaded.png 
    [type] => image/png
    [error] => 
)

Теперь, например, мы можем отобразить загруженное изображение, используя URL:

Пример 3: Создание файла из формы

Этот пример показывает, как создать файл, передав его через форму. Предполагается, что запрос сделан из формы с "field1":

$upload = wp_upload_bits( 
    $_FILES["field1"]["name"],  
    null, 
    file_get_contents( $_FILES["field1"]["tmp_name"] ) 
);

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

Журнал изменений

Функция была представлена в версии 2.0.0.

Код функции

function wp_upload_bits( $name, $deprecated, $bits, $time = null ) {
    if ( ! empty( $deprecated ) ) {
        _deprecated_argument( __FUNCTION__, '2.0.0' );
    }

    if ( empty( $name ) ) {
        return array( 'error' => __( 'Пустое имя файла' ) );
    }

    $wp_filetype = wp_check_filetype( $name );
    if ( ! $wp_filetype['ext'] && ! current_user_can( 'unfiltered_upload' ) ) {
        return array( 'error' => __( 'Извините, вы не можете загружать файлы этого типа.' ) );
    }

    $upload = wp_upload_dir( $time );

    if ( false !== $upload['error'] ) {
        return $upload;
    }

    $upload_bits_error = apply_filters(
        'wp_upload_bits',
        array(
            'name' => $name,
            'bits' => $bits,
            'time' => $time,
        )
    );
    if ( ! is_array( $upload_bits_error ) ) {
        $upload['error'] = $upload_bits_error;
        return $upload;
    }

    $filename = wp_unique_filename( $upload['path'], $name );

    $new_file = $upload['path'] . "/$filename";
    if ( ! wp_mkdir_p( dirname( $new_file ) ) ) {
        if ( str_starts_with( $upload['basedir'], ABSPATH ) ) {
            $error_path = str_replace( ABSPATH, '', $upload['basedir'] ) . $upload['subdir'];
        } else {
            $error_path = wp_basename( $upload['basedir'] ) . $upload['subdir'];
        }

        $message = sprintf(
            __( 'Не удалось создать директорию %s. Родительская директория доступна для записи?' ),
            $error_path
        );
        return array( 'error' => $message );
    }

    $ifp = @fopen( $new_file, 'wb' );
    if ( ! $ifp ) {
        return array(
            'error' => sprintf( __( 'Не удалось записать файл %s' ), $new_file ),
        );
    }

    fwrite( $ifp, $bits );
    fclose( $ifp );
    clearstatcache();

    // Установите правильные права доступа к файлу
    $stat  = @ stat( dirname( $new_file ) );
    $perms = $stat['mode'] & 0007777;
    $perms = $perms & 0000666;
    chmod( $new_file, $perms );
    clearstatcache();

    // Вычисляем URL
    $url = $upload['url'] . "/$filename";

    if ( is_multisite() ) {
        clean_dirsize_cache( $new_file );
    }

    return apply_filters(
        'wp_handle_upload',
        array(
            'file'  => $new_file,
            'url'   => $url,
            'type'  => $wp_filetype['type'],
            'error' => false,
        ),
        'sideload'
    );
}


Эта улучшенная статья объясняет, как использовать функцию wp_upload_bits() в WordPress, с примерами и понятными разъяснениями для начинающих.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *