Tùy chỉnh thư mục lưu trữ định dạng file cụ thể

Trong 1 số trường hợp cụ thể quá trình phát triển plugin/ theme nhất định chúng ta cần lưu trữ dữ liệu upload lên theo nhu cầu nào đó.
 
Ở trường hợp trong bài mình đang xử lý plugin scale design cho hệ thống bán áo thun mình đang phát triển tại PolyXGO. Dữ liệu xử lý là fonts chữ (các loại dữ liệu đặc thù riêng thì tùy tình huống mà bạn xử lý nhé!)

Ví dụ: mình muốn khi upload dữ liệu FONTS thì toàn bộ sẽ được lưu trữ trong 1 thư mục cụ thể là FONTS: wp-content/upload/fonts + ký tự đầu tiên tên font chữ:
wp-content/upload/fonts/t/TWOFOLD uncomplete DeSigN.ttf
wp-content/upload/fonts/t/Titania.ttf
wp-content/upload/fonts/p/P22 Posada Regular Regular.ttf

Tại sao phải tạo thêm sub folder là ký tự đầu tên font?

Việc thêm thư mục mang ký tự đầu tiên tên font chữ nhằm mục đích tăng hiệu suất khi đọc folder đó (mọi người xử lý dữ liệu nhiều sẽ hiểu nỗi đau khổ của việc đọc vài chục ngàn file trong 1 folder – THẢM HỌA nếu bạn không rành về kỹ thuật).

Thêm với đó mình ước lượng dung lượng data fonts sẽ rơi tầm 450K+ * 106KB ~ 48GB (dựa trên thống kê của website https://www.whatfontis.com/) nên việc tạo sub folder sẽ giảm tải việc truy suất các folder sau này!. Nếu kỹ hơn bạn có thể tạo thêm sub folder dạng ngày tháng nữa nhé! (mặc định wordpress đã hỗ trợ dạng này – bạn dựa trên code mẫu để điều chỉnh cho phù hợp).
thì đoạn code sẽ như sau:

/*Custom upload fonts type*/
add_filter('wp_handle_upload', 'polyxgo_products_design_post_upload_filter');
add_filter('wp_handle_upload_prefilter', 'polyxgo_products_design_pre_upload_filter' );
function polyxgo_products_design_pre_upload_filter( $file ){
    add_filter('upload_dir', 'polyxgo_products_design_upload_dir');
    return $file;
}
function polyxgo_products_design_post_upload_filter($fileinfo){
    remove_filter('upload_dir', 'polyxgo_products_design_upload_dir');
    return $fileinfo;
}
function polyxgo_products_design_upload_dir($path){
	$file=$_POST['name'];
    $extension = substr(strrchr($file,'.'),1);
    if(!empty($path['error']) ||  ($extension != 'ttf'&&  $extension != 'otf'&&  $extension != 'woff'&&  $extension != 'svg'&& $extension != 'eot')) { return $path; }
    $file_name=substr($file,0,strpos($file,'.'));
    $customdir = '/fonts/'.substr(strtolower($file_name),0,1);/*get first character font name*/
    $path['path']    = str_replace($path['subdir'], '', $path['path']); /*remove default subdir (year/month)*/
    $path['url']     = str_replace($path['subdir'], '', $path['url']);      
    $path['subdir']  = $customdir;
    $path['path']   .= $customdir; 
    $path['url']    .= $customdir;  
    return $path;
}
/*Accept fonts type upload*/
function polyxgo_products_design_add_custom_upload_mimes($existing_mimes) {
  	$existing_mimes['otf'] = 'application/x-font-otf';
  	$existing_mimes['woff'] = 'application/x-font-woff';
  	$existing_mimes['ttf'] = 'application/x-font-ttf';
  	$existing_mimes['svg'] = 'image/svg+xml';
  	$existing_mimes['eot'] = 'application/vnd.ms-fontobject';
  	return $existing_mimes;
 }
function polyxgo_products_design_init(){
	add_filter('upload_mimes', 'polyxgo_products_design_add_custom_upload_mimes');
	add_action('woocommerce_before_single_product_summary', 'polyxgo_products_design_single_products_summary');
}
/*Custom upload fonts type*/

#TheLovesOf

Related Posts

About The Author

Add Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.