Функция 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, и как правильно использовать её в вашем проекте.