我們最初是簡單的給所有用戶有上傳文件并且設置文件上傳可以使用media_handle_upload和wp_handle_upload 類似的函數,其實都是調用wp_handle_upload函數
這個函數的第4個參數,支持數組,代碼如下:
- $access = array('test_form' => false, 'mimes' => array('jpeg' => 'image/jpeg',
- 'png' => 'image/png','gif' => 'image/gif','jpg' => 'image/jpeg'));
這樣寫就可以限制文件的類型,但是貌似對偽造的文件不好使,經過測試可以使用一個過濾器,完美解決這個問題,過濾器名稱:wp_handle_upload_prefilter,代碼如下:
- add_filter('wp_handle_upload_prefilter', 'custom_upload_filter' );
- function custom_upload_filter($file)
- {
- $fileSize = $file['size'];//獲取文件大小 做自定義處理
- $info =getimagesize($file['tmp_name']);//獲取文件屬性 如果不是圖片將返回false
- return $file;
- }
讓用戶擁有上傳文件的權限
默認情況下,有些用戶是不允許上傳文件的,你可以在主題的 functions.php 添加下面的代碼:
- //允許用戶投稿時上傳文件
- 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' 這個用戶角色添加了 'upload_files'(上傳文件)的權限。
限制用戶上傳文件的類型
首先,大家可以先了解一下 WordPress 默認允許上傳的文件類型,打開WordPress的 /wp-includes/functions.php 文件,然后搜索 function wp_get_mime_types 定位到那里,你就會看到詳細的文件類型:
- 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;
- }
如果你還要允許上傳其他格式,重復使用 $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)。
注意:主機空間和WordPress本身一般設置了允許上傳的文件的最大體積,所以在這里設置需要考慮到這點.
限制不同用戶角色可上傳的文件類型及大小
其實上面已經給出了限制類型和大小的方法,要根據不同用戶角色來限制,只需要添加角色判斷代碼即可,倡萌舉個綜合的例子:
不同用戶上傳的類型,代碼如下:
- 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
- }
- }
- //只對非管理員執行這兩個函數(即:對管理員不生效)
- if( !current_user_can( 'manage_options' ) ) {
- add_filter('upload_mimes', 'custom_upload_mimes');
- add_filter('upload_size_limit', 'max_up_size');
- }
大家只要靈活使用 if 語句判斷不同的角色賦予不同的權限即可.
新聞熱點
疑難解答
圖片精選