media_handle_sideload() WP 2.6.0

Завантажує файл у медіатеку 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()

Хуків немає.

Повертає

int|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

Приклади

0

#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://sworg/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);

// все, файл завантажений і з'явиться в адмінці в медіафайлах
0

#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://sworg/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);
0

#3 Завантаження зовнішньої картинки та встановлення мініатюри запису

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

// ініціалізація функції
$post_id = 3061;
$file = 'http://sworg/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Введено.
З версії 5.3.0The $post_id parameter був зроблений optional.

Код media_handle_sideload() WP 6.0.2

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

	if ( isset( $post_data['post_date'] ) && substr( $post_data['post_date'], 0, 4 ) > 0 ) {
		$time = $post_data['post_date'];
	} else {
		$post = get_post($post_id);
		if ( $post && substr( $post->post_date, 0, 4 ) > 0 ) {
			$time = $post->post_date;
		} else {
			$time = current_time( 'mysql');
		}
	}

	$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 та caption defaults if possible.
	$ image_meta = wp_read_image_metadata ($ file);

	if ( $image_meta ) {
		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
	);

	// Це повинно бути неправильно, як це необхідно, щоб отриматизаписи і існуючі дії.
	unset( $attachment['ID'] );

	// Save the attachment metadata.
	$ attachment_id = wp_insert_attachment ($ attachment, $ file, $ post_id, true);

	if ( ! is_wp_error( $attachment_id ) ) {
		wp_update_attachment_metadata( $attachment_id, wp_generate_attachment_metadata( $attachment_id, $file ) );
	}

	return $attachment_id;
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *