워드프레스에서 이미지를 업로드할 때 파일 이름을 숫자로 바꾸기

이 블로그를 시작할 당시만 해도 한글 URL을 지원하지 않는 웹호스팅이 제법 있었습니다. 특히 해외 호스팅에서는 한글과 관련하여 문제가 없었지만 국내의 일부 웹호스팅에서 URL에 한글을 사용할 수 없는 문제가 발생하는 웃지 못할 일이 발생했습니다.

다행히 몇 년 전부터 카페24 등 대부분의 국내 호스팅에서도 URL에 한글이 포함되면 오류가 발생하는 문제가 해결되었습니다. 하지만 아직도 드물지만 URL에 한글이 포함되면 문제가 발생하는 호스팅이 있습니다. 또, 서버를 직접 세팅하는 경우에 서버 세팅을 잘못하여 URL에 한글이 포함되면 문제가 발생하는 경우도 있습니다.

URL에 한글이 포함될 경우 문제가 발생하면 워드프레스에서 고유주소를 숫자로 표시하도록 설정해주면 되지만 SEO적인 측면에서 바람직하지 않습니다.

그리고 한글 URL 문제가 발생하는 경우 파일 이름에 한글이 포함된 미디어 파일/이미지 파일을 업로드하면 그림이 깨져나올 것입니다.

워드프레스에서 이미지를 업로드할 때 파일 이름을 숫자로 바꾸기

업로드하는 미디어 파일 이름에 한글이 포함될 경우 다음 코드를 사용하여 업로드하는 이미지의 파일 이름을 영문과 숫자로 바꿀 수 있습니다.

/**
* Produces cleaner filenames for uploads for non-latin languages
* 업로드 시 파일 이름에서 한글 등 비영문 문자 제거하기
*
* @param string $filename
* @return string
*/
function change_none_latin_file_name( $filename ) {

$extension = end(explode(".", $filename));

$append = date('YmdHis');
$sanitized_filename = 'image-' . $append . '.' . $extension;

return $sanitized_filename;
}
add_filter( 'sanitize_file_name', 'change_none_latin_file_name', 10, 1 );

파일 이름을 image-20180904135743.jpg 형식으로 표시되도록 설정해보았습니다. 숫자부분은 현재 날짜(시분초 포함)를 의미합니다.

아바다 테마가 설치된 워드프레스 사이트에서 테스트해보니 문제 없이 작동하네요. 다른 환경에서도 잘 작동할 것 같지만, 환경에 따라 문제를 일으킬 가능성도 있습니다.

PHP에 대해 문외한이라서 제대로 된 코드인지는 모르겠습니다. 머리 속에 생각나는 대로 대충 만들어보았습니다. 혹시 문법에 오류가 있다면 네이버 카페를 통해 알려주시면 감사하겠습니다.

참고로 이미지 파일 이름에 한글이 포함되면 추후에 사이트를 이전(Migration)할 때에도 이미지 파일이 깨져서 오류가 발생할 수 있으므로 가급적 이미지 파일 이름에 한글을 포함하지 않는 것이 좋을 수 있습니다.

2024년 2월 업데이트: 코드 개선

이제는 상기 코드가 필요 없겠지만 이미지 파일에 한글이 포함될 경우 비영문 및 숫자로 된 부분을 숫자로 변경해야 하는 경우 다음 코드로 테스트해 보시기 바랍니다.

/**
 * Sanitizes filenames by removing non-Latin characters and appending a timestamp.
 *
 * @param string $filename The original filename.
 * @return string The sanitized filename.
 */
function sanitize_non_latin_file_name( $filename ) {
    // Separate the filename from its extension.
    $file_parts = pathinfo($filename);
    $extension = isset($file_parts['extension']) ? '.' . $file_parts['extension'] : '';

    // Remove non-Latin characters from the filename, keep digits, Latin letters and some special characters.
    $sanitized_name = preg_replace('/[^a-zA-Z0-9-_\.]/', '', $file_parts['filename']);

    // If after sanitizing the filename is empty (e.g., the name was entirely in non-Latin characters), use a generic name.
    if (empty($sanitized_name)) {
        $sanitized_name = 'file';
    }

    // Append a timestamp to the filename for uniqueness.
    $append = date('YmdHis');
    $sanitized_filename = $sanitized_name . '-' . $append . $extension;

    return $sanitized_filename;
}
add_filter( 'sanitize_file_name', 'sanitize_non_latin_file_name', 10, 1 );

기존 코드를 챗GPT를 통해 개선했습니다. 원하는 대로 작동하지 않을 경우 상기 코드를 적절히 응용할 수 있을 것입니다.

상기 코드를 사용할 경우 이미지 파일 이름에 포함된 한글과 특수문자가 하이픈("-")으로 바뀌고 끝에 업로드 일시(날짜와 시간)가 추가됩니다. 예를 들어, "Filename structure 파일이름 구조.webp"를 업로드하면 아래 그림과 같이 "Filename-structure---20240202225522.webp"로 바뀝니다.

업로드 시 이미지 파일 이름 변경

참고로 File Renaming on Upload 플러그인을 사용하면 파일 이름을 업로드 날짜와 시간으로 변경할 수 있습니다. 이 플러그인을 이용하는 경우 파일 이름에 포함된 영문과 숫자 부분이 유지가 되지 않습니다.

참고:

일부 글에 제휴 링크가 포함될 수 있으며 파트너스 활동으로 일정액의 수수료를 받을 수 있습니다.

댓글 남기기

* 이메일 정보는 공개되지 않습니다.