WordPress как на ладони
Новые WordPress шаблоны Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

media_handle_sideload() WP 2.6

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

media_handle_upload() работает напрямую с глобальным массивом $_FILES, это не всегда удобно. Иногда удобнее указать произвольные данные файла и обработать их, для этого и нужна 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';

Если нужно загрузить картинку (а не любой тип файла), используете аналогичную функцию 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";

// Установим данные файла
$file_array = array();
$tmp = download_url( $url );
preg_match('/[^\?]+\.(jpg|jpe|jpeg|gif|png)/i', $url, $matches );
$file_array['name'] = basename( $matches[0] );
$file_array['tmp_name'] = $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( $file_array['tmp_name'] );

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

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

// во фронтэнде нужны эти файлы
//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";
$file_array = array();

$tmp = download_url( $url );
// корректируем умя файла в строках запроса.
preg_match('/[^?]+\.(jpg|jpe|jpeg|gif|png)/i', $url, $matches);
$file_array['name'] = basename($matches[0]);
$file_array['tmp_name'] = $tmp;

media_handle_sideload( $file_array, 0 );

// удалим временный файл
@unlink( $file_array['tmp_name'] );

#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 );

	// Устанавливаем переменные для размещения
	preg_match('/[^\?]+\.(jpg|jpe|jpeg|gif|png)/i', $file, $matches );
	$file_array['name'] = basename( $matches[0] );
	$file_array['tmp_name'] = $tmp;

	// Удаляем временный файл, при ошибке
	if ( is_wp_error( $tmp ) ) {
		@unlink( $file_array['tmp_name'] );
		$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 ) ) {
		@unlink($file_array['tmp_name']);
		var_dump( $id->get_error_messages() );
	}
	else
		update_post_meta( $post_id, '_thumbnail_id', $id );

	// удалим временный файл
	@unlink( $file_array['tmp_name'] );
}

Код media_handle_sideload: wp-admin/includes/media.php VER 4.9.8

<?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('/\.[^.]+$/', '', 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);
	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 772alkoweb.ru
Делаю веб руками.
18 комментов
Полезные 1 Вопросы 1 Все
  • Beer cайт: beer.ru

    А подскажите пожалуйста как перехватить загружаемое изображение и наложить watermark.
    Заранее спасибо за помощь.

    Ответить3.5 года назад #
  • Благодарю Вас за примеры

    Ответить2.9 года назад #
  • lincaseidhe70 cайт: lincaseidhe.ru

    Здравствуйте. Подскажите, если использовать "#1 Загрузка файла из 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');
    // а для плагина?
    

    и еще вопрос: как вывести сообщение о успешной загрузке на страницу настроек плагина? может ссылку киньте на функцию? или это самому прописывать надо?

    Ответить2.5 года назад #
  • Alio

    А если мне надо загружать картинку не из внешнего адреса, а из директории сайта?

    1
    Ответить2.5 года назад #
    • Имею ту же проблему, подставляю путь - ему не нравится. sad

      Ответить1.5 год назад #
      • Kama6896

        Укажи путь до файла в $file_array['tmp_name'] = $tmp; и другие параметры и передай массив данных в функцию, она все сделает дальше. Все это в примерах есть...

        Ответить1.5 год назад #
  • margin cайт: movie.dp.ua

    как сделать проверку, если есть в записи внешняя картинка то загрузить + прикрепить её к записи как миниатюра

  • dontbbs2004

    Добрый день.
    Пример работает, но при импорте с некоторых сайтов дает ошибку

     [tmp_name] => WP_Error Object ( [errors] => Array ( [http_404] => Array ( [0] => Forbidden ) ) [error_data] => Array ( ) ) )

    Хотя сама картинка открывается по указанному адресу.
    В чем может быть проблема?

    • @ campusboy3051 cайт: www.youtube.com/c/wpplus

      Скорее всего у сайта стоит какая-то защита и блокирует обращение с помощью такого способа.

      1
      • dontbbs2004

        как понять есть она или нет?

        • petrozavodsky772 cайт: alkoweb.ru

          Возможно сервер неправильно сконфигурирован директория tmp недоступна для записи или чтения или проблемы с curl, советую в этом направлении искать проблемы

          1
  • vvtex cайт: mediadozer.ru

    ошибка 500, что посоветуете .htaccess как-то поправить, файл ставил 755 и 777 все равно ошибка

    Ответить4 месяца назад #
  • @ Мария

    Коллеги, использую такой код

        $post_id = '';
    	$desc    = "";
    
    	// Установим данные файла
    	$file_array = array();
    	$tmp = download_url( $url );
    	preg_match('/[^\?]+\.(jpg|jpe|jpeg|gif|png)/i', $url, $matches );
    	$file_array['name'] = basename( $matches[0] );
    	$file_array['tmp_name'] = $tmp;
    
    	$wp_upload_dir = wp_upload_dir();
    	$post_data = array(
    	  'post_mime_type' => 'image/jpeg',
    	  'guid'           => $wp_upload_dir['url'] . '/' . $file_array['name'],
    	'post_parent'    => '',
    	'post_title'     => '' ,
    	'post_content'   => ''
    	); 
    
    	// загружаем файл
    	$img_ID = media_handle_sideload( $file_array, $post_id, $desc, $post_data );
    
    	// если ошибка
    	if( is_wp_error( $id ) ) {
    		@unlink($file_array['tmp_name']);
    		return $id->get_error_messages();
    	}
    
    	// удалим временный файл
    	@unlink( $file_array['tmp_name'] );

    НО! в базу записывается guid - https://domen.ru/wp-content/uploads/2018/10/simpletext.jpg

    А физически файл сохраняется - https://domen.ru/wp-content/uploads/2016/11/simpletext-834.jpg

    1. Имя в guid не уникализируется.
    2. Сохраняется почему-тор в 2016/11/
    3. Если подключить add_filter( 'upload_dir' после media_handle_sideload , от 500 ошибка (((((

    Заранее спасибо, если сможете помочь. Нужно чтобы media_handle_sideload сохранял в папку привязанную к дате, т.е. в текщий год / месяц.

    Откуда называние simpletext берется - это вобще загадка....

    gamer

    1
    Ответить8 дней назад #
    • @ Мария

      Пришлось принудительно указывать директорию в Functions.php

      add_filter( 'upload_dir', 'filter_upload_dir' );
      function filter_upload_dir($args)
      {
      	  $d = getdate();     
      	  $args['path'] = $args['basedir'] . '/'. $d ['year'].'/'.$d ['mon']; 
        return $args;
      }

      Это все исправило. С названиями файлов тоже удалось справится...

          $d = getdate();
      	$filename = $d['mday'].'-'.uniqid();
      	$post_id = '';
      	$desc    = "";
      
      	// Установим данные файла
      	$file_array = array();
      	$tmp = download_url( $url );
      	//у меня точно картинки, так что это не надо
      	//preg_match('/[^\?]+\.(jpg|jpe|jpeg|gif|png)/i', $url.'?'.$filename.'.jpg', $matches );
      
      	$file_array['name'] = $filename.'.jpg';
      	$file_array['tmp_name'] = $tmp;
      
      	$wp_upload_dir = wp_upload_dir();
      	$post_data = array(
      	  'post_mime_type' => 'image/jpeg',
      	  'guid'           => $wp_upload_dir['url'] . '/' .  $filename.'.jpg',
      	'post_content'   => ''
      	); 
      
      	// загружаем файл
      	$img_ID = media_handle_sideload( $file_array, $post_id, $desc, $post_data );
      
      	// если ошибка
      	if( is_wp_error( $id ) ) {
      		@unlink($file_array['tmp_name']);
      		return $id->get_error_messages();
      	}
      
      	// удалим временный файл
      	@unlink( $file_array['tmp_name'] );
      

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

      Если кто-то знает в чем минус такого способа загрузок картинок, то скажите.

      cool

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