Функция download_url() в WordPress: использование и параметры

Функция download_url() в WordPress

Функция download_url() предназначена для загрузки файла по указанному URL в локальный временный файл с использованием HTTP-класса WordPress. Обратите внимание, что после завершения загрузки вызывающая функция должна удалить или переместить загруженный файл.

Примечания

Обязательно удалите или переместите файл после его использования.

Используется в:

  • media_sideload_image()

Хуки функции

  • download_url_error_max_body_size
  • wp_signature_hosts
  • wp_signature_url
  • wp_signature_softfail

Возврат значения

Функция возвращает строку (имя файла) при успешной загрузке или объект WP_Error в случае ошибки.

Использование

download_url( $url, $timeout, $signature_verification );

Параметры

  • $url (строка, обязательный) — URL файла для загрузки.
  • $timeout (int) — время ожидания для загрузки файла. По умолчанию: 300 секунд.
  • $signature_verification (bool) — выполнять ли проверку подписи. По умолчанию: false.

Пример использования

Загрузка файла в временную директорию PHP

В следующем примере мы загружаем логотип WordPress и проверяем наличие ошибок при загрузке. Также мы удаляем временный файл на сервере после его обработки.

// Если функция недоступна, подключаем её.
require_once ABSPATH . 'wp-admin/includes/file.php';

$sourse_url = 'https://s.w.org/style/images/wp-header-logo.png';
$dest_path = wp_upload_dir()['basedir'] . '/wp-header-logo.png'; // wp-content/uploads/wp-header-logo.png

$tmp_file = download_url( $sourse_url );

if( is_wp_error( $tmp_file ) ){
    echo $tmp_file->get_error_message(); // Выводим сообщение об ошибке
}
else {
    // Копируем файл в конечное место и удаляем временный файл.
    copy( $tmp_file, $dest_path );
    echo "Скопировано в: $dest_path";
}

// Удаляем временный файл
@ unlink( $tmp_file );

Изменения в версии

  • С 2.5.0: Введена функция.
  • С 5.2.0: Добавлена проверка подписи с возможностью мягкого сбоя.
  • С 5.9.0: Добавлена поддержка имени файла в заголовке Content-Disposition.

Исходный код функции

function download_url( $url, $timeout = 300, $signature_verification = false ) {
    // ВНИМАНИЕ: файл не удаляется автоматически, скрипт должен сам удалить или переместить файл.
    if ( ! $url ) {
        return new WP_Error( 'http_no_url', __( 'Не указан URL.' ) );
    }

    $url_path     = parse_url( $url, PHP_URL_PATH );
    $url_filename = basename( $url_path ) ?: '';

    $tmpfname = wp_tempnam( $url_filename );
    if ( ! $tmpfname ) {
        return new WP_Error( 'http_no_file', __( 'Не удалось создать временный файл.' ) );
    }

    $response = wp_safe_remote_get(
        $url,
        array(
            'timeout'  => $timeout,
            'stream'   => true,
            'filename' => $tmpfname,
        )
    );

    if ( is_wp_error( $response ) ) {
        unlink( $tmpfname );
        return $response;
    }

    $response_code = wp_remote_retrieve_response_code( $response );

    if ( 200 !== $response_code ) {
        $data = array(
            'code' => $response_code,
        );

        $tmpf = fopen( $tmpfname, 'rb' );

        if ( $tmpf ) {
            $response_size = apply_filters( 'download_url_error_max_body_size', KB_IN_BYTES );

            $data['body'] = fread( $tmpf, $response_size );
            fclose( $tmpf );
        }

        unlink( $tmpfname );

        return new WP_Error( 'http_404', trim( wp_remote_retrieve_response_message( $response ) ), $data );
    }

    $content_disposition = wp_remote_retrieve_header( $response, 'Content-Disposition' );

    if ( $content_disposition ) {
        $content_disposition = strtolower( $content_disposition );

        if ( str_starts_with( $content_disposition, 'attachment; filename=' ) ) {
            $tmpfname_disposition = sanitize_file_name( substr( $content_disposition, 21 ) );
        } else {
            $tmpfname_disposition = '';
        }

        if ( $tmpfname_disposition && is_string( $tmpfname_disposition )
            && ( 0 === validate_file( $tmpfname_disposition ) )
        ) {
            $tmpfname_disposition = dirname( $tmpfname ) . '/' . $tmpfname_disposition;

            if ( rename( $tmpfname, $tmpfname_disposition ) ) {
                $tmpfname = $tmpfname_disposition;
            }

            if ( ( $tmpfname !== $tmpfname_disposition ) && file_exists( $tmpfname_disposition ) ) {
                unlink( $tmpfname_disposition );
            }
        }
    }

    $content_md5 = wp_remote_retrieve_header( $response, 'Content-MD5' );

    if ( $content_md5 ) {
        $md5_check = verify_file_md5( $tmpfname, $content_md5 );

        if ( is_wp_error( $md5_check ) ) {
            unlink( $tmpfname );
            return $md5_check;
        }
    }

    if ( $signature_verification ) {
        $signed_hostnames = apply_filters( 'wp_signature_hosts', array( 'wordpress.org', 'downloads.wordpress.org', 's.w.org' ) );

        $signature_verification = in_array( parse_url( $url, PHP_URL_HOST ), $signed_hostnames, true );
    }

    if ( $signature_verification ) {
        $signature = wp_remote_retrieve_header( $response, 'X-Content-Signature' );

        if ( ! $signature ) {
            $signature_url = false;

            if ( str_ends_with( $url_path, '.zip' ) || str_ends_with( $url_path, '.tar.gz' ) ) {
                $signature_url = str_replace( $url_path, $url_path . '.sig', $url );
            }

            $signature_url = apply_filters( 'wp_signature_url', $signature_url, $url );

            if ( $signature_url ) {
                $signature_request = wp_safe_remote_get(
                    $signature_url,
                    array(
                        'limit_response_size' => 10 * KB_IN_BYTES,
                    )
                );

                if ( ! is_wp_error( $signature_request ) && 200 === wp_remote_retrieve_response_code( $signature_request ) ) {
                    $signature = explode( "n", wp_remote_retrieve_body( $signature_request ) );
                }
            }
        }

        $signature_verification = verify_file_signature( $tmpfname, $signature, $url_filename );
    }

    if ( is_wp_error( $signature_verification ) ) {
        if ( apply_filters( 'wp_signature_softfail', true, $url ) ) {
            $signature_verification->add_data( $tmpfname, 'softfail-filename' );
        } else {
            unlink( $tmpfname );
        }

        return $signature_verification;
    }

    return $tmpfname;
}

Связанные функции

  • media_handle_sideload()
  • media_handle_upload()
  • media_sideload_image()
  • и другие, связанные с загрузкой файлов.

Эта информация поможет вам лучше понять, как работает функция download_url() в WordPress, и как правильно использовать её в вашем проекте.

Leave a Reply

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