當(dāng)前位置:首頁>WordPress建站>WordPress開發(fā)>WordPress 限制不同用戶角色可上傳的文件類型及大小

WordPress 限制不同用戶角色可上傳的文件類型及大小

開放注冊的WordPress站點(diǎn),一般都會根據(jù)不同等級的用戶角色來賦予不同的權(quán)限。文件上傳功能就是一個(gè)比較常用的功能,那么,如何限制不同用戶角色可上傳的文件類型及大小呢?下面倡萌就來說說這個(gè)問題。

讓用戶擁有上傳文件的權(quán)限

默認(rèn)情況下,有些用戶是不允許上傳文件的,你可以在主題的 functions.php 添加下面的代碼:

//允許用戶投稿時(shí)上傳文件
if ( current_user_can('contributor') && !current_user_can('upload_files') )
   add_action('admin_init', 'allow_contributor_uploads');
 
   function allow_contributor_uploads() {
      $contributor = get_role('contributor');
      $contributor->add_cap('upload_files');
}

上面的代碼就是給 ‘contributor’ 這個(gè)用戶角色添加了 ‘upload_files’ (上傳文件)的權(quán)限。

限制用戶上傳文件的類型

首先,大家可以先了解一下 WordPress 默認(rèn)允許上傳的文件類型,打開WordPress的 /wp-includes/functions.php 文件,然后搜索 function wp_get_mime_types 定位到那里,你就會看到詳細(xì)的文件類型:

function wp_get_mime_types() {
	// Accepted MIME types are set here as PCRE unless provided.
	return apply_filters( 'mime_types', array(
	// Image formats
	'jpg|jpeg|jpe' => 'image/jpeg',
	'gif' => 'image/gif',
	'png' => 'image/png',
	'bmp' => 'image/bmp',
	'tif|tiff' => 'image/tiff',
	'ico' => 'image/x-icon',
	// Video formats
	'asf|asx|wax|wmv|wmx' => 'video/asf',
	'avi' => 'video/avi',
	'divx' => 'video/divx',
	'flv' => 'video/x-flv',
	'mov|qt' => 'video/quicktime',
	'mpeg|mpg|mpe' => 'video/mpeg',
	'mp4|m4v' => 'video/mp4',
	'ogv' => 'video/ogg',
	'mkv' => 'video/x-matroska',
	// Text formats
	'txt|asc|c|cc|h' => 'text/plain',
	'csv' => 'text/csv',
	'tsv' => 'text/tab-separated-values',
	'ics' => 'text/calendar',
	'rtx' => 'text/richtext',
	'css' => 'text/css',
	'htm|html' => 'text/html',
	// Audio formats
	'mp3|m4a|m4b' => 'audio/mpeg',
	'ra|ram' => 'audio/x-realaudio',
	'wav' => 'audio/wav',
	'ogg|oga' => 'audio/ogg',
	'mid|midi' => 'audio/midi',
	'wma' => 'audio/wma',
	'mka' => 'audio/x-matroska',
	// Misc application formats
	'rtf' => 'application/rtf',
	'js' => 'application/javascript',
	'pdf' => 'application/pdf',
	'swf' => 'application/x-shockwave-flash',
	'class' => 'application/java',
	'tar' => 'application/x-tar',
	'zip' => 'application/zip',
	'gz|gzip' => 'application/x-gzip',
	'rar' => 'application/rar',
	'7z' => 'application/x-7z-compressed',
	'exe' => 'application/x-msdownload',
	// MS Office formats
	'doc' => 'application/msword',
	'pot|pps|ppt' => 'application/vnd.ms-powerpoint',
	'wri' => 'application/vnd.ms-write',
	'xla|xls|xlt|xlw' => 'application/vnd.ms-excel',
	'mdb' => 'application/vnd.ms-access',
	'mpp' => 'application/vnd.ms-project',
	'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
	'docm' => 'application/vnd.ms-word.document.macroEnabled.12',
	'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
	'dotm' => 'application/vnd.ms-word.template.macroEnabled.12',
	'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
	'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12',
	'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
	'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
	'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12',
	'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12',
	'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
	'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',
	'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
	'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12',
	'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template',
	'potm' => 'application/vnd.ms-powerpoint.template.macroEnabled.12',
	'ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12',
	'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
	'sldm' => 'application/vnd.ms-powerpoint.slide.macroEnabled.12',
	'onetoc|onetoc2|onetmp|onepkg' => 'application/onenote',
	// OpenOffice formats
	'odt' => 'application/vnd.oasis.opendocument.text',
	'odp' => 'application/vnd.oasis.opendocument.presentation',
	'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
	'odg' => 'application/vnd.oasis.opendocument.graphics',
	'odc' => 'application/vnd.oasis.opendocument.chart',
	'odb' => 'application/vnd.oasis.opendocument.database',
	'odf' => 'application/vnd.oasis.opendocument.formula',
	// WordPerfect formats
	'wp|wpd' => 'application/wordperfect',
	) );
}

=> 的前面為格式,后面為格式描述。如果你要禁止上傳其中的某些類型,可以參考下面的例子:

將下面的代碼添加到主題的 functions.php 文件:

//禁止上傳avi和mp4格式的文件

add_filter('upload_mimes', 'custom_upload_mimes');

function custom_upload_mimes ( $existing_mimes=array() ) {

unset ($existing_mimes['avi']);
unset ($existing_mimes['mp4']);

return $existing_mimes;

}

如果你還要禁止更多,可以按照 unset ($existing_mimes[‘格式’]);  樣例添加即可。

如果你僅僅只需要允許用戶上傳幾種類型而已,還可以通過下面的更簡潔的方法,代碼添加到主題的 functions.php 文件:

//只允許上傳圖片文件
add_filter('upload_mimes', 'custom_upload_mimes');

function custom_upload_mimes ( $existing_mimes=array() ) {

unset ($existing_mimes);//禁止上傳任何文件

$existing_mimes['jpg|jpeg|gif|png']='image/image';//允許用戶上傳jpg,gif,png文件

return $existing_mimes;

}

如果你還要允許上傳其他格式,重復(fù)使用 $existing_mimes[‘格式’]=’描述’;  即可。

限制用戶上傳的文件大小

同樣在主題的 functions.php 文件中,添加下面的代碼:

//限制上傳文件的最大體積
function max_up_size() {

return 500*1024; // 500 kb

}

add_filter('upload_size_limit', 'max_up_size');

上面的例子是限制所有用戶上傳的文件的最大體積為 500 kb (1M =1024*1024)。

注意:主機(jī)空間和WordPress本身一般設(shè)置了允許上傳的文件的最大體積,所以在這里設(shè)置需要考慮到這點(diǎn)。

限制不同用戶角色可上傳的文件類型及大小

其實(shí)上面已經(jīng)給出了限制類型和大小的方法,要根據(jù)不同用戶角色來限制,只需要添加角色判斷代碼即可。倡萌舉個(gè)綜合的例子:

//不同用戶上傳的類型
function custom_upload_mimes ( $existing_mimes=array() ) {

	unset ($existing_mimes);//禁止上傳任何文件

	if( current_user_can( 'publish_posts' ) && !current_user_can( 'publish_pages' ) ) {

		//允許作者(Author)上傳的類型
		$existing_mimes['jpg|jpeg|gif|png']='image/image';//允許用戶上傳jpg,gif,png文件
		$existing_mimes['zip']='application/zip'; //允許用戶上傳zip壓縮包
		$existing_mimes['pdf']='application/pdf'; //允許用戶上傳pdf文件

	}elseif( current_user_can( 'edit_posts' ) && !current_user_can( 'publish_posts' ) ) {

		//允許投稿者(Contributor)上傳的類型
		$existing_mimes['jpg|jpeg|gif|png']='image/image';
		$existing_mimes['pdf']='application/pdf'; 

	}else{

		//其他用戶角色上傳的類型
		$existing_mimes['jpg|jpeg|gif|png']='image/image';

	}

	return $existing_mimes;

}

//不同用戶上傳的大小
function max_up_size() {

	if( current_user_can( 'publish_posts' ) && !current_user_can( 'publish_pages' ) ) {

		return 2048*1024; // 允許作者(Author)上傳 2M

	}elseif( current_user_can( 'edit_posts' ) && !current_user_can( 'publish_posts' ) ) {

		return 1024*1024; // 允許投稿者(Contributor)上傳 1M

	}else{

		return 500*1024; // 其他用戶角色上傳 500 kb

	}

}

//只對非管理員執(zhí)行這兩個(gè)函數(shù)(即:對管理員不生效)
if( !current_user_can( 'manage_options' ) ) {

	add_filter('upload_mimes', 'custom_upload_mimes');
	add_filter('upload_size_limit', 'max_up_size');

}

大家只要靈活使用 if 語句判斷不同的角色賦予不同的權(quán)限即可,關(guān)于用戶角色的判斷,請閱讀《WordPress如何判斷登錄用戶的角色

弄完了,收工!

聲明:本站所有文章,如無特殊說明或標(biāo)注,均為本站原創(chuàng)發(fā)布。任何個(gè)人或組織,在未征得本站同意時(shí),禁止復(fù)制、盜用、采集、發(fā)布本站內(nèi)容到任何網(wǎng)站、書籍等各類媒體平臺。如若本站內(nèi)容侵犯了原著者的合法權(quán)益,可聯(lián)系我們進(jìn)行處理。

給TA打賞
共{{data.count}}人
人已打賞
歡迎關(guān)注WordPress大學(xué)公眾號 WPDAXUE
WordPress開發(fā)

WordPress 插件開發(fā)教程 Part 1 - WordPress 插件簡介

2013-3-26 10:25:36

WordPress開發(fā)

WordPress 插件開發(fā)教程 Part 2 – WordPress 插件基礎(chǔ)

2013-3-27 6:59:00

10 條回復(fù) A文章作者 M管理員
  1. 不行啊,我想限制上傳文件大小,用了你說的【限制用戶上傳的文件大小】插在了functions.php 底部,結(jié)果代碼在網(wǎng)站頂部顯示了出來,限制也沒生效,還有我搜索了function wp_get_mime_types壓根查詢不到,我用WP自帶的編輯,用的http://webjyh.com/wp-photobroad/主題

  2. 博主你好,我這樣設(shè)置之后,投稿者有些文件能上傳成功,有些文件上傳失敗。而如果是作者或更高權(quán)限的用戶,相同的文件全部提交成功。 你知不知道這是什么情況呢

  3. 博主你好。不知道為什么,我用了這些代碼無效,在前臺上傳圖片的時(shí)候,還是只有管理員才能上傳,其他均顯示上傳時(shí)發(fā)生了錯(cuò)誤。請稍后再試。

  4. 出現(xiàn)的問題是,只有管理員能上傳文件成功。非管理員上傳圖片,會顯示“上傳時(shí)發(fā)生了錯(cuò)誤。請稍后再試。”

    要怎么解決呢,謝謝。

  5. 用了這段代碼以后,用戶上傳圖片就不再壓縮成中尺寸和小尺寸而是只能選擇完整尺寸,太大的分辨率打開文章或者縮略圖(其實(shí)已經(jīng)沒有縮略圖了)就會很慢,由于管理員不受此代碼限制所以管理員上傳圖片依舊有其他尺寸可選,請教下如何解決投稿者上傳圖片壓縮尺寸的問題。

  6. 博主你好。首先非常感謝解決了上傳的問題。但我同時(shí)還有一個(gè)問題需請教:如何限制用戶只看到自己上傳的文件呢?而不是整個(gè)媒體庫都暴露出來,謝謝。

  7. 非常感謝!

  8. 學(xué)習(xí)了!!

?
個(gè)人中心
購物車
優(yōu)惠劵
今日簽到
有新私信 私信列表
搜索

临颍县| 天镇县| 华坪县| 大田县| 万盛区| 和顺县| 黄陵县| 霸州市| 启东市| 团风县| 清河县| 阿尔山市| 卫辉市| 青川县| 临潭县| 抚州市| 获嘉县| 东丽区| 新巴尔虎左旗| 桂林市| 梓潼县| 铜梁县| 宜宾市| 毕节市| 隆昌县| 江源县| 天气| 泾源县| 米林县| 平果县| 临邑县| 建昌县| 赤峰市| 鄂尔多斯市| 锡林浩特市| 青铜峡市| 开封县| 饶河县| 南投县| 德江县| 鄂温|