WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Рекомендуемые продукты со скидкой от Template Monster

media_handle_sideload() WP 2.6

Загружает файл в медиатеку WordPress из переданного массива с данными о файле, аналогично media_handle_upload().

media_handle_upload() работает напрямую с глобальным массивом $_FILES, это не всегда удобно. Иногда удобнее указать произвольные данные файла и обработать их, для этого и нужна эта функция.

Во фронтенде для работы функции нужны следующие файлы:

require_once ABSPATH . 'wp-admin/includes/image.php';
require_once ABSPATH . 'wp-admin/includes/file.php';
require_once ABSPATH . 'wp-admin/includes/media.php';

Если нужно загрузить картинку по URL (именно картинку), используете аналогичную функцию media_sideload_image().

Является основой для: media_sideload_image()
Работает на основе: wp_handle_sideload(), wp_insert_attachment()

Хуков нет.

Возвращает

Число/WP_Error. ID добавленного вложения. Объект WP_Error в случае неудачи.

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

$id = media_handle_sideload( $file_array, $post_id, $desc = null, $post_data = array() );
$file_array(массив) (обязательный)
Массив с данными файла - аналогичный $_FILES.
$post_id(число) (обязательный)
ID поста, к которому нужно прикрепить файл после загрузки.
$desc(строка)
Описание загружаемого файла. Станет значением поля post_title в wp_posts.
По умолчанию: null
$post_data(массив)

Позволяет перезаписывать данные добавляемого вложения. Указываются данные вложения, которые будут записаны в таблицу wp_posts: post_parent, post_title, post_excerpt и т.д. По умолчанию:

array(
	'post_mime_type' => $type,
	'guid'           => $url,
	'post_parent'    => $post_id,
	'post_title'     => $title,
	'post_content'   => $content,
)

По умолчанию: null

Примеры

#1 Загрузка файла по URL

Этот пример показывает как работать с функцией. Этот код загрузит картинку из внешнего источника, добавить её в медиатеку 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';

$url     = 'http://s.w.org/style/images/wp-header-logo.png';
$post_id = 3061;
$desc    = "Логотип WordPress";

// Загрузим файл
$tmp = download_url( $url );

// Установим данные файла
$file_array = [
	'name'     => basename( $url ), // ex: wp-header-logo.png
	'tmp_name' => $tmp,
	'error'    => 0,
	'size'     => filesize($tmp),
];

// загружаем файл
$id = media_handle_sideload( $file_array, $post_id, $desc );

// если ошибка
if( is_wp_error( $id ) ) {
	@unlink($file_array['tmp_name']);
	return $id->get_error_messages();
}

// удалим временный файл
@unlink( $tmp );

// все, файл загружен и должен появится в админке в медиафайлах

#2 Загрузка файла по URL без привязки к конкретному посту

// во фронтэнде нужны эти файлы
//require_once ABSPATH . 'wp-admin/includes/image.php';
//require_once ABSPATH . 'wp-admin/includes/file.php';
//require_once ABSPATH . 'wp-admin/includes/media.php';

$url = "http://s.w.org/style/images/wp-header-logo.png";
$desc = "Логотип WordPress";

// загрузим файл
$tmp = download_url( $url );

// корректируем умя файла в строках запроса.
$file_array = [
	'name'     => basename( $url ),
	'tmp_name' => $tmp
];

media_handle_sideload( $file_array, 0 );

// удалим временный файл
@unlink( $tmp );

#3 Загрузка внешней картинки и установка миниатюры записи

Функция, которая будет загружать внешнюю картинку с указанного УРЛ, сохранять картинку в директорию uploads и прикреплять её к записи как миниатюру:

// инициализация функции
$post_id = 3061;
$file = 'http://s.w.org/style/images/wp-header-logo.png?1';
if( is_single( $post_id ) )
	my_sideload_image( $post_id, $file, $desc = 'Описание картинки' );

// код функции
function my_sideload_image( $post_id, $file, $desc = null ){
	global $debug; // определяется за пределами функции как true

	if( ! function_exists('media_handle_sideload') ) {
		require_once ABSPATH . 'wp-admin/includes/image.php';
		require_once ABSPATH . 'wp-admin/includes/file.php';
		require_once ABSPATH . 'wp-admin/includes/media.php';
	}

	// Загружаем файл во временную директорию
	$tmp = download_url( $file );

	// Устанавливаем переменные для размещения
	$file_array = [
		'name'     => basename( $file ),
		'tmp_name' => $tmp
	];

	// Удаляем временный файл, при ошибке
	if ( is_wp_error( $tmp ) ) {
		$file_array['tmp_name'] = '';
		if( $debug ) echo 'Ошибка нет временного файла! <br />';
	}

	// проверки при дебаге
	if( $debug ){
		echo 'File array: <br />';
		var_dump( $file_array );
		echo '<br /> Post id: ' . $post_id . '<br />';
	}

	$id = media_handle_sideload( $file_array, $post_id, $desc );

	// Проверяем работу функции
	if ( is_wp_error( $id ) ) {
		var_dump( $id->get_error_messages() );
	} else {
		update_post_meta( $post_id, '_thumbnail_id', $id );
	}

	// удалим временный файл
	@unlink( $tmp );
}

Список изменений

С версии 2.6.0 Введена.

Код media handle sideload: wp-admin/includes/media.php WP 5.2.4

<?php
function media_handle_sideload( $file_array, $post_id, $desc = null, $post_data = array() ) {
	$overrides = array( 'test_form' => false );

	$time = current_time( 'mysql' );
	if ( $post = get_post( $post_id ) ) {
		if ( substr( $post->post_date, 0, 4 ) > 0 ) {
			$time = $post->post_date;
		}
	}

	$file = wp_handle_sideload( $file_array, $overrides, $time );
	if ( isset( $file['error'] ) ) {
		return new WP_Error( 'upload_error', $file['error'] );
	}

	$url     = $file['url'];
	$type    = $file['type'];
	$file    = $file['file'];
	$title   = preg_replace( '/\.[^.]+$/', '', wp_basename( $file ) );
	$content = '';

	// Use image exif/iptc data for title and caption defaults if possible.
	if ( $image_meta = wp_read_image_metadata( $file ) ) {
		if ( trim( $image_meta['title'] ) && ! is_numeric( sanitize_title( $image_meta['title'] ) ) ) {
			$title = $image_meta['title'];
		}
		if ( trim( $image_meta['caption'] ) ) {
			$content = $image_meta['caption'];
		}
	}

	if ( isset( $desc ) ) {
		$title = $desc;
	}

	// Construct the attachment array.
	$attachment = array_merge(
		array(
			'post_mime_type' => $type,
			'guid'           => $url,
			'post_parent'    => $post_id,
			'post_title'     => $title,
			'post_content'   => $content,
		),
		$post_data
	);

	// This should never be set as it would then overwrite an existing attachment.
	unset( $attachment['ID'] );

	// Save the attachment metadata
	$id = wp_insert_attachment( $attachment, $file, $post_id, true );
	if ( ! is_wp_error( $id ) ) {
		wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $file ) );
	}

	return $id;
}

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

Из метки: upload download (файловая система file загрузка)

Еще из раздела: Загрузка (download upload)

petrozavodsky 790alkoweb.ru
Делаю веб руками.
Редакторы: Kama 7611
28 комментов
Полезные 1 Вопросы 1 Все
  • petrozavodsky790 alkoweb.ru

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

    Ответитьмесяц назад #
Здравствуйте, !     Войти . Зарегистрироваться