WordPress как на ладони
Хостинг, VPS/VDS и отдельные сервера только на SSD дисках. 7 дней бесплатного тестирования.

wp_handle_upload() WP 2.0

Обрабатывает загрузку файла через $_FILES. Очищает название файла, проверяет расширение файла (на основе mime типа) и сохраняет файл в соответствующий каталог wp-content/uploads/....

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

Работает на основе PHP функции move_uploaded_file().

Является основой для: media_handle_upload()
Работает на основе: _wp_handle_upload()

Хуков нет.

Возвращает

Массив/любое значение.

При успешной загрузке возвращает ассоциативный массив данных, такого формата:

Array
(
	[file] => sites/wptest.ru/www/wp-content/uploads/2014/06/Daft-Punk-Something-About-Us.mp3
	[url] => http://wptest.ru/wp-content/uploads/2014/06/Daft-Punk-Something-About-Us.mp3
	[type] => audio/mpeg
)

type и file можно использовать в функции wp_insert_attachment().

При неудаче, возвращает:

  • $overrides['upload_error_handler']( &$file, $file['error'] ) - когда указан параметр upload_error_handler, в котором указывается название функции обрабатывающей неудачную загрузку. Функция получит 2 параметра &$file и $file['error']
  • array( 'error'=>$message ) - по умолчанию, когда не указана функция обработки ошибки.

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

$movefile = wp_handle_upload( $file, $overrides, $time );
$file(массив) (обязательный)
Элемент массива $_FILES, который содержит массив данных о принятом файле (название, тип, размер, временное расположение). Функцию нужно вызывать при загрузке каждого файла. Параметр передается по ссылке (&$file), поэтому нужно передавать переменную.
$overrides(массив)

Ассоциативный массив, чтобы перезаписать дефолтные переменные используемые в функции (переменные извлекаются так: extract( $overrides, EXTR_OVERWRITE )).

Чтобы произошла реальная загрузка файла обязательно нужно указать параметр 'test_form' => FALSE, в противном случае это будет просто тестирование работы формы.

Переменные которые можно перезаписать в этом параметре:

  • upload_error_handler - название функции обработки ошибок. По умолчанию 'wp_handle_upload_error';

  • unique_filename_callback - Название функции по уникализации переданного имени файла. По умолчанию null;

  • Параметры тестирования:
    • test_form - По умолчанию true;
    • test_size = По умолчанию true;
    • test_upload = По умолчанию true;
      Если перезаписать эти параметры, то нужно передать $ext и $type:
    • test_type - По умолчанию true;
    • mimes - По умолчанию false;

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

$time(строка)
Время в формате ГГГГ/мм. Указанное время передается в функцию wp_upload_dir().
По умолчанию: null

Примеры

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

Пример использования функции. Показывает как загрузить файл в каталог WP "uploads", который передается в форме. Пусть так выглядит наша форма:

<form enctype="multipart/form-data" action="" method="POST">
	<?php wp_nonce_field( 'my_file_upload', 'fileup_nonce' ); ?>
	<input name="my_file_upload" type="file" />
	<input type="submit" value="Загрузить файл" />
</form>

Атрибут enctype="multipart/form-data" обязателен, для того чтобы форма могла работать с файлами. Иначе поле type="file" просто не будет ничего передавать в $_FILES.

Тогда код загрузки файла будет такой:

if( wp_verify_nonce( $_POST['fileup_nonce'], 'my_file_upload' ) ){
	if ( ! function_exists( 'wp_handle_upload' ) ) 
		require_once( ABSPATH . 'wp-admin/includes/file.php' );

	$file = &$_FILES['my_file_upload'];
	$overrides = array( 'test_form' => false );

	$movefile = wp_handle_upload( $file, $overrides );

	if ( $movefile && empty($movefile['error']) ) {
		echo "Файл был успешно загружен.\n";
		print_r( $movefile );
	} else {
		echo "Возможны атаки при загрузке файла!\n";
	}
}

Код wp_handle_upload: wp-admin/includes/file.php VER 4.9.8

<?php
function wp_handle_upload( &$file, $overrides = false, $time = null ) {
	/*
	 *  $_POST['action'] must be set and its value must equal $overrides['action']
	 *  or this:
	 */
	$action = 'wp_handle_upload';
	if ( isset( $overrides['action'] ) ) {
		$action = $overrides['action'];
	}

	return _wp_handle_upload( $file, $overrides, $time, $action );
}

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

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

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

Быстрая замена северного моста в ноутбуке

быстрая замена северного моста в ноутбуке

ingeneric.ru

6 комментов
  • Андрей

    Добрый день, а как нужно передавать значение например линка из этого массива в переменную?

    -1
    Ответить3.1 года назад #
  • Богдан

    Всем доброго времени суток!

    Может кому понадобиться мой коммент. Просто я пол-дня потратил dash из-за того, что файл ну никак не сохранялся, а массив $_FILES - был, попросту пуст с эрором "Unindefinded index my_file_upload" и т.д. Копал в сторону php и чего только не пробовал help . Но, "ларчик просто открывался": всё дело было в HTML-атрибуте формы "enctype" - узрел это через "сканирование" Файербагом.
    Вообщем, чтоб файл сохранялся, а $_FILES не был пуст - у формы, где находиться поле с искомым инпутом type="file" - нужно прописать следующее:

    "$('form#edittag').attr('enctype', 'multipart/form-data')"

    Может кому и пригодиться blush

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

      Спасибо за комментарий, полезный! thank_you

      Добавил под пример заметку на этот счет!

      Ответить2.5 года назад #
      • Максим

        Кама, подскажите пожалуйста, почеу когда я загружаю картинки через функцию wp_handle_upload то картинке в медиатеке отоюражаются иконками черными, всмысле вордпрессовскими картинками по умолчанию, когда нет фотки, но физически файлы загружаются, и в кастомных метабоксах все выводится, а в медиатеке нет.

        Вот код который отвечает за загрузку:

        $movefile = wp_handle_upload( $file, array( 'test_form' => false ) );
        		$filename = $movefile['file'];
        		$filetype = wp_check_filetype( basename( $filename ), null );
        		$wp_upload_dir = wp_upload_dir();
        		$attachment = array(
        			'guid'           => $wp_upload_dir['url'] . '/' . basename( $filename ),
        			'post_mime_type' => $filetype['type'],
        			'post_title'     => preg_replace( '/\.[^.]+$/', '', basename( $filename ) ),
        			'post_content'   => '',
        			'post_status'    => 'inherit'
        		);
        
        wp_insert_attachment( $attachment, $filename ) );

        в общем у меня все газружается, но проблема с отображением в медиатеке меня напрягает.

        А с помощью функции media_handle_upload все нормально отображается, но мне нужна именно wp_handle_upload, и я уже устал мучиться с этим(

        Ответить1.9 год назад #
  • Пытаюсь немного настроить плагин загрузки аватарок. Как сделать, чтобы картинки загружались в указанную папку, к примеру /img-avatar/

    Вот пример кода

    if ( ! function_exists( 'wp_handle_upload' ) )
    				require_once ABSPATH . 'wp-admin/includes/file.php';
    
    			// Delete old images if successful
    			$this->avatar_delete( $user_id );
    
    			// Need to be more secure since low privelege users can upload
    			if ( strstr( $_FILES['basic-user-avatar']['name'], '.php' ) )
    				wp_die( 'For security reasons, the extension ".php" cannot be in your file name.' );
    
    			// Make user_id known to unique_filename_callback function
    			$this->user_id_being_edited = $user_id; 
    			$avatar = wp_handle_upload( $_FILES['basic-user-avatar'], array( 'mimes' => $mimes, 'test_form' => false, 'unique_filename_callback' => array( $this, 'unique_filename_callback' ) ) );
Здравствуйте, !     Войти . Зарегистрироваться