동기
워드프레스에는 기본 확장자로 지정된 파일 외에는 업로드를 막아놓았다. 예를 들어 한국에서 오질나게 쓰이는 아래아 한글 파일(.hwp
)을 업로드하려고 하면 에러가 뜬다. 이를 가능하게 하기 위한 과정이다. 간단하다.
전체 코드
역시 선 전체 코드가 제 맛이다. 아래 내용을 functions.php
파일에 추가하고 관리자 창을 새로 고침한 후 업로드 하려고 하면 잘 작동되는 것을 볼 수 있다.
// 추가시킬 확장자와 mime type 작성
$array_filetypes = array(
'hwp' => 'application/hangul',
'svg' => 'image/svg+xml'
);
// 업로드 종류 추가하기
function custom_upload_mimes($mimes)
{
global $array_filetypes;
$mimes = array_merge($mimes, $array_filetypes);
return $mimes;
}
// mime type 설정
function fix_mime_type($data = null, $file = null, $filename = null, $mimes = null)
{
$ext = isset($data['ext']) ? $data['ext'] : '';
// 만약 확장자(ext)가 값으로 넘어오지 않았을 경우
// $filename에서 확장자를 직접 가져온다.
if (strlen($ext) < 1) {
$exploded = explode('.', $filename);
$ext = strtolower(end($exploded));
}
// $data의 정보를 적절하게 수정하여 리턴한다.
global $array_filetypes;
foreach ($array_filetypes as $arr_ext => $arr_type) {
if ($ext === $arr_ext) {
$data['type'] = $arr_type;
$data['ext'] = $arr_ext;
break;
}
}
return $data;
}
// 액션, 필터에 작성한 함수를 추가
add_action('upload_mimes', 'custom_upload_mimes', 99);
add_filter('wp_check_filetype_and_ext', 'fix_mime_type', 75, 4);
설명
기존에 쓰던, mime_types
필터를 활용하는 방법은 더이상 작동이 되지 않았다. 언제부터, 왜 안되는지 모르겠다. 그래서 더 구글링을 하니 upload_mimes
액선 후크와 wp_check_filetype_and_ext
필터를 활용하는 방법이 있었다. 그래서 그대로 갖고 와서 코드 중복을 줄이고 파일 확장자를 추가하거나 삭제하기 용이하도록 전역 변수 ($array_filetypes
)를 두었다. (구글링했었던 자료는 아주 예전에 찾은 거라 링크를 다시 찾을 수 없어서 알려드리지 못한다.)
전역 변수를 사용하면 안되는 금기는 잘 알고 있지만 유지보수 따위는 생각하지 않고 작성했다. (사실 php
에서 전역 변수를 사용하지 않고 공유 데이터를 관리할 만한 방법을 모른다.) 또한 upload_mimes
액선 후크와 wp_check_filetype_and_ext
필터가 구체적으로 언제 어떻게 작동하는 지도 모른다. 그냥 쓰자. 하하.
현재 2020년 1월 10일, 5.3.2
버전에서는 문제 없이 잘 작동하나, 이 또한 언제 막힐지 모르는 노릇이긴 하다.