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

wp_check_filetype_and_ext хук-фильтр . WP 3.0.0

Позволяет проверить загружаемый файл и изменить его реальный тип (MIME тип).

При загрузке файла WP проверяет реальный тип файла (не то что указано в расширении имени файла). Делается это функцией wp_check_filetype_and_ext(). Этот фильтр позволяет изменить результат работы этой функции.

Когда может пригодится хук?

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

Например:

Мы хотим разрешить загрузку SVG файлов. И добавили mime тип SVG файла в разрешенные миме типы:

add_filter( 'upload_mimes', function ( $mimes ) {
	$mimes['svg'] = 'image/svg+xml';
	return $mimes;
} );

Пробуем загрузить svg файл и видим ошибку:

Так происходит, потому что после проверки функцией wp_check_filetype_and_ext(), реальный миме тип SVG файла определится как 'text/plain' и функция вернет пустые данные типа файла (проверка типа файла не пройдена).

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

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

add_filter( 'wp_check_filetype_and_ext', 'filter_function_name_5242', 10, 4 );
function filter_function_name_5242( $wp_check_filetype_and_ext, $file, $filename, $mimes ){
	// filter...

	return $wp_check_filetype_and_ext;
}
$wp_check_filetype_and_ext(массив)

Данные файла в виде массива с ключами:

  • ext - расширение, например txt (file.txt)
  • type - миме тип, например text/plain
  • proper_filename - правильное имя файла. Если указано, то заменит элемент массива 'name' данных файла для загрузки: имя их $_FILES['name']. Если не указано, то имя будет использоваться оригинальное.
$file(строка)
Путь до файла. Например: userdata\temp\phpF581.tmp
$filename(строка)
Имя файла, например wp-amp-plugin_043848.svg.
$mimes(массив/false)
Массив названий разрешенных расширений и типов файлов. Если false, то это значит что будут взяты значения функции get_allowed_mime_types().

Примеры

#1 Демонстрация передаваемых в фильтр значений

add_filter( 'wp_check_filetype_and_ext', 'filter_function_name_497', 10, 4 );
function filter_function_name_497( $wp_check_filetype_and_ext, $file, $filename, $mimes ){

	/*
	$wp_check_filetype_and_ext

	// когда файл не прошел проверку
	array(
		[ext]  =>
		[type] =>
		[proper_filename] =>
	)

	// для .txt файла
	array(
		[ext]  => txt
		[type] => text/plain
		[proper_filename] =>
	)

	$file     = C:\OpenServer\userdata\temp\phpF581.tmp
	$filename = wp-plugin_043848.svg
	$mimes    = false // список по умолчанию
	*/

	return $wp_check_filetype_and_ext;
}

#2 Разрешим загружать SVG файл

Только для администратора и только, если размер файла не превышает 50КБ.

add_filter( 'wp_check_filetype_and_ext', 'filter_function_name_497', 10, 4 );
function filter_function_name_497( $type_and_ext, $file, $filename, $mimes ){

	// загружается файл с расширением .svg
	if( '.svg' === strtolower( substr($filename, -4) ) ){

		$filesize = filesize( $file ) / 1024; // КБ

		// разрешим
		if( $filesize < 50 && current_user_can('manage_options') ){
			$type_and_ext['ext']  = 'svg';
			$type_and_ext['type'] = 'image/svg+xml';
		}
		// запретим
		else {
			$type_and_ext['ext'] = $type_and_ext['type'] = false;
		}

	}

	return $type_and_ext;
}

В дополнении к этому коду, нужно добавить миме тип svg файла в белый список, чтобы загрузчик в редактировании записи проходил проверку:

// Разрешаем загружать типы файлов
add_filter( 'upload_mimes', 'upload_allow_types' );
function upload_allow_types( $mimes ) {
	$mimes['svg'] = 'image/svg+xml';
	return $mimes;
}

Где вызывается хук

wp_check_filetype_and_ext()
wp_check_filetype_and_ext
wp-includes/functions.php 2440
return apply_filters( 'wp_check_filetype_and_ext', compact( 'ext', 'type', 'proper_filename' ), $file, $filename, $mimes );

Где используется хук (в ядре WP)

Не используется.
Комментариев нет
    Здравствуйте, !     Войти . Зарегистрироваться