GPS 데이터를 워드프레스 메타 데이터로 저장

연재고품격 고품질 워드프레스 무료 사진 저장소완결2

디지털카메라1로 사진을 촬영하면 사진 촬영 위치 정보가 함께 저장되는데, EXIF 필드 중 ‘GPS tags’로 분류되는 필드에 저장됩니다. 물론 기기가 위치 정보를 읽기 위한 사용자의 GPS 설정이 선행되어야 합니다.

EXIF GPS Tags

EXIF GPS tags 필드는 다음과 같이 4가지입니다.

  • GPSLatitude: 위도
  • GPSLatitudeRef: North(N, 북위, 양수), South(S, 남위, 음수)
  • GPSLongitude: 경도
  • GPSLongitudeRef: East(E, 동경, 양수), West(W, 서경, 음수)

위의 EXIF 필드 이름(Tag Name)은 ‘규격’으로 정해진 것이며, 워드프레스와 관련이 없습니다. 또, 남위 기준 위도라면 ‘음수’, 서경 기준 경도라면 ‘음수’로 처리해야 위도와 경도 데이터에 맞는 위치 정보를 얻을 수 있습니다.

사진과 관련된 EXIF 등의 외부 정보는 이 정도로 간략하게 정리하며, 이해하지 않아도 됩니다. 예제 과정에서 결과를 보고 대략 알 수 있으며, 깊은 이해는 필요하지 않습니다. 또, 필자는 이와 관련한 전문 지식이 없고 위치 정보를 워드프레스에서 활용하는 핵심만 추출하여 전달함을 미리 알립니다.2 머뭇거릴 필요 없이 바로 위치 정보를 워드프레스에 추가해봅니다.

워드프레스의 원본 이미지 메타 데이터 처리

앞에서 제공한 사진파일은 모두 ‘사진 촬영 위치’ 정보를 포함하고 있습니다. 워드프레스가 기본으로 그 정보를 메타 데이터로 저장하지 않기에 연습장 페이지에 그 데이터가 나오지 않았다는 것뿐입니다. 위치 정보를 가진 사진파일을 워드프레스에 저장하기 위해서는 사용자가 (원본) 이미지를 올릴 때 어떤 과정에서 이미지의 정보를 읽는지 먼저 알아야 합니다. 그러나, 워드프레스의 거의 모든 실행 흐름은 ‘워드프레스 훅’에 의존한다고 봐도 문제가 없으므로 그 훅을 사용하거나 모른다면 찾는 것이 먼저입니다. 물론, 예제에서는 필자가 안내하므로 그 과정이 필요하지 않습니다.

다음의 안내는 실제 예제 구성의 과정이므로 혹시 지금까지 따라 했다면 계속 이어가야 합니다.

  • 테마 루트 inc/image-functions.php 파일을 엽니다.
  • 맨 끝에 다음의 코드를 추가하고 저장합니다.
/* 이미지 올릴 때 EXIF GPS 정보가 있다면 추가 */
add_filter( 'wp_read_image_metadata', 'add_photo_exif_geotags', 10, 3 );
function add_photo_exif_geotags( $meta, $file, $sourceImageType ) {
    $exif = @exif_read_data( $file );
    // 위도
    if ( !empty( $exif['GPSLatitude'] ) ) {
        $meta['latitude'] = $exif['GPSLatitude'];
    }
    if ( !empty( $exif['GPSLatitudeRef'] ) ) {
        $meta['latitude_ref'] = trim( $exif['GPSLatitudeRef'] );
    }
    // 경도
    if (!empty( $exif['GPSLongitude']) ) {
        $meta['longitude'] = $exif['GPSLongitude'];
    }
    if ( !empty( $exif['GPSLongitudeRef'] ) ) {
        $meta['longitude_ref'] = trim( $exif['GPSLongitudeRef'] );
    }

    return $meta;
}

코드는 워드프레스에 원본 이미지를 등록할 때 GPS 정보가 있다면 이미지의 메타 데이터에 추가한다는 것으로 2번 줄의 wp_read_image_metadata 필터 훅이 핵심입니다. 4번 줄의 exif_read_data PHP 함수로 EXIF 데이터를 추출하여 $meta 변수(인자)의 배열에 지정한 키의 데이터로 생성합니다.

wp_read_image_metadata
이 함수는 워드프레스에 원본 이미지를 등록할 때 원본 이미지의 메타 데이터(EXIF 또는 IPTC) 읽습니다. 그러나 이 필터 훅의 단계에서는 워드프레스의 데이터로 저장되지 않으므로 포스트 아이디(ID)와 같은 워드프레스 포스트 정보를 얻을 수 없습니다.

코드에 나오는 $meta 변수의 배열 키 latitude, longitude 등은 앞에서 안내한 EXIF 규격 필드가 아니므로 사용자가 원하는 것으로 등록하면 됩니다.

이 코드의 결과를 보면 이해를 더할 수 있습니다. 다음 순서로 진행합니다.

  • 관리페이지 미디어 라이브러리 목록에서 존재하는 모든 이미지 파일을 삭제합니다.
  • 다시, 제공한 사진파일 3개를 모두 올립니다.
  • 연습장 페이지에서 결과를 확인합니다. (연습장 파일에 지난 과정의 코드가 있어야 합니다.)

연습장 페이지를 새고 고쳐 결과를 확인하면 페이지 아래에 추가된 GPS 데이터를 볼 수 있습니다. 다음은 제목이 ‘달나라 여행’인 이미지의 GPS 데이터입니다.

[latitude] => Array
    (
        [0] => 66/1
        [1] => 13/1
        [2] => 90999/1709
    )

[latitude_ref] => N
[longitude] => Array
    (
        [0] => 156/1
        [1] => 16/1
        [2] => 165/16
    )

[longitude_ref] => W

데이터를 보면 어떤 형식으로 GPS 메타 데이터가 워드프레스에 추가되는지 짐작할 수 있는데, 한마디로 ‘분수’의 배열 데이터로 저장된 것입니다. 각 배열 데이터는 순서대로 ‘도, 분, 초’를 의미합니다.

예제에서는 GPS 데이터를 싱글 이미지 포스트 페이지와 ‘발자국’ 페이지(타입 page 포스트)에 구글 지도를 사용하여 표시할 것입니다. 그러나, 이 분수 배열 데이터를 그대로 구글 지도에서 사용할 수 없으므로 다른 포맷으로 변환해야 합니다.

GPS 메타 데이터 포맷의 변환

먼저, 보통의 위도와 경도를 포함한 GPS 정보(좌표) 포맷은 다음처럼 2가지입니다.

  • 도/분/초 포맷 (Degrees/Minute/Second): 예) 37° 33’58.87″N, 126° 58’40.63″E
  • 십진수 포맷 (Decimal Degrees): 예) 37.6658609, 127.0317674

예제는 ‘십진수 포맷’으로 GPS 데이터를 사용할 것입니다. 이때 ‘언제’ 데이터 포맷을 변경할 것인가를 고려해야 하는데, 앞에서 사용한 wp_read_image_metadata 훅 단계에서 변환하여 저장합니다. 다음 안내에 따라 진행합니다.

  • 앞에서 테마 루트 inc/image-functions.php 파일에 추가한 코드를 다음 코드로 대체합니다.
/* 이미지 올릴 때 EXIF GPS 정보가 있다면 추가 */
add_filter( 'wp_read_image_metadata', 'add_photo_exif_geotags', 10, 3 );
function add_photo_exif_geotags( $meta, $file, $sourceImageType ) {
    $exif = @exif_read_data( $file );
    // 위도
    if ( !empty( $exif['GPSLatitude'] ) ) {
        $meta_array['latitude_array'] = $exif['GPSLatitude'];
        $meta['latitude'] = wp_exif_frac2dec( $meta_array['latitude_array'][0] ) +
                            wp_exif_frac2dec( $meta_array['latitude_array'][1] ) / 60 +
                            wp_exif_frac2dec( $meta_array['latitude_array'][2] ) / 3600;
    }
    if ( !empty( $exif['GPSLatitudeRef'] ) ) {
        $meta['latitude_ref'] = trim( $exif['GPSLatitudeRef'] );
    }
    // 경도
    if (!empty( $exif['GPSLongitude']) ) {
        $meta_array['longitude_array'] = $exif['GPSLongitude'];
        $meta['longitude'] = wp_exif_frac2dec( $meta_array['longitude_array'][0] ) +
                            wp_exif_frac2dec( $meta_array['longitude_array'][1] ) / 60 +
                            wp_exif_frac2dec( $meta_array['longitude_array'][2] ) / 3600;
    }
    if ( !empty( $exif['GPSLongitudeRef'] ) ) {
        $meta['longitude_ref'] = trim( $exif['GPSLongitudeRef'] );
    }

    return $meta;
}
  • 관리페이지 미디어 라이브러리 목록의 모든 이미지를 삭제하고, 제공한 이미지 파일 3개를 다시 업로드합니다.
  • 연습장 페이지를 새로 고쳐 결과를 확인합니다.

연습장 페이지에서 제목이 ‘달나라 여행’인 이미지의 GPS 관련 메타 데이터만 나열하면 다음과 같을 것이며, 결과 데이터에 관한 것은 더 안내할 필요가 없을 만큼 간결합니다.

[latitude] => 66.231457480008
[latitude_ref] => N
[longitude] => 156.26953125
[longitude_ref] => W

대체하여 추가한 코드는, 7번 줄로 원본 이미지의 GPS 위도 데이터를 임시 변수에 넣고, 8~10번 줄에서 각 데이터를 워드프레스 wp_exif_frac2dec 함수를 사용하여 십진수로 변환한 후, 다시 ‘분’ 데이터는 60으로, ‘초’ 데이터는 3600으로 나눈 다음, 3개의 값을 모두 더하여 $meta 변수 배열 데이터로 생성한 것입니다.

wp_exif_frac2dec
이 함수는 분수 값에서 분자와 분모를 각각 배열로 구분하여 분모 값이 있을 때 분자를 분모로 나누는 단순한 함수입니다. 별도의 워드프레스 함수로 사용할 수 있지만, 그때는 함수명만 변경하여 테마에 추가 정의한 후 사용하면 됩니다. 이 함수는 다음 경로의 워드프레스 코어 파일에 있습니다.
wp-admin/includes/image.php

GPS에 관한 간략한 일반 내용을 안내할 때 S(South, 남위), W(West, 서경)일 경우 ‘음수’로 표기해야 올바른 위치 정보를 표현할 수 있다고 했습니다. wp_read_image_metadata 훅 단계에서 방향 정보의 값 ‘S’, ‘W’를 조건으로 음의 기호(-)를 추가하여 저장하는 것을 생각할 수도 있지만, 나중에 구글 지도를 이용하여 싱글 이미지 포스트 페이지에 사진 촬영 위치 정보를 표시할 때 테마 파일에 직접 조건을 사용하여 음의 기호를 추가한 후 지도 마커를 출력합니다.

또, 예제 전체에서 이미지 포스트의 원본 이미지 GPS 메타 데이터에는 음의 기호를 포함하여 저장하지 않습니다. 다음 장부터 이어서 나오는 워드프레스 이미지 처리 과정의 다른 훅을 사용하여 이미지 포스트의 이미지 메타 데이터(_wp_attachment_metadata 필드)가 아닌 이미지 포스트의 새로운 메타 데이터 필드(커스텀 필드Custom Fields)를 추가하여 다른 데이터와 함께 위치 정보를 음의 기호가 포함된 데이터로 저장하여 지도 출력에 활용합니다.

다음 링크로 이번 장에서 변경한 inc/image-functions.php 파일을 남깁니다. 지난번과 마찬가지로 테마 루트에 덮어쓰세요.

예제 목차

0. 고품격 고품질 워드프레스 무료 사진 저장소

1. 예제 구성 환경과 파일

2. XAMPP, 워드프레스, 테마, 플러그인 설치와 설정

3. 테마 Pics Press

4. page 포스트 타입과 페이지 템플릿, 메뉴 구성

5. 워드프레스 핵심 용어 짚기

6. 워드프레스 포스트 타입 attachment

7. 워드프레스 이미지 사이즈

8. 워드프레스 이미지 사이즈 추가 및 변경

9. 워드프레스 이미지 파일 제어

10. 타입 attachment 템플릿과 image.php

11. 워드프레스 이미지 메타 데이터

» GPS 데이터를 워드프레스 메타 데이터로 저장

13. 이미지 메타 데이터를 포스트 메타 데이터에 추가

14. Attachment 타입을 위한 워드프레스 커스텀 분류 등록

15. 이미지 메타 데이터를 워드프레스 분류와 필드 데이터에 저장

16. 이미지를 편집할 때 포스트 데이터와 메타 데이터 업데이트

17. 워드프레스 미디어 파일 업로드

18. 워드프레스 싱글 이미지 포스트 페이지

19. 워드프레스 아바타와 Author Archives

20. 워드프레스 이미지 사이즈별 데이터 출력

21. 워드프레스 폼 요소로 원하는 이미지 사이즈 다운로드

22. 워드프레스 텍스트 단락 및 줄 바꿈, wpautop

23. 워드프레스 사진의 EXIF 데이터 출력

24. 구글 지도에 표시하는 사진 촬영 위치

25. 워드프레스 attachment 포스트 타입의 아카이브

26. 워드프레스 함수로 자바스크립트 변수 데이터 생성

27. 워드프레스 커스텀 검색 – 쿼리 변수

28. 워드프레스 커스텀 검색 – 검색 폼과 쿼리 데이터

29. 워드프레스 커스텀 포스트 타입 ‘pic_album’

30. 커스텀 포스트 타입의 싱글 페이지

31. 워드프레스 WP_Query

32. 커스텀 쿼리, 페이지 템플릿, 포스트 아카이브

33. 분류 기준의 관련 포스트 커스텀 쿼리

34. wpdb 클래스로 구글 지도에 마커와 섬네일 표시

35. 워드프레스 분류 데이터 쿼리 클래스, WP_Term_Query

36. 워드프레스 템플릿 태그

37. 워드프레스 옵션 페이지, 옵션 필드

38. 워드프레스 사이트 프런트 페이지

39. 사이트 메뉴 및 포스트 페이지 링크

40. 워드프레스 Transient API

41. 워드프레스 분류의 term 데이터를 캐시 데이터로 생성

42. 워드프레스 역할 그룹과 권한으로 구성 요소 제어

43. 간단한 워드프레스 코멘트 폼 수정

44. 워드프레스 대시보드 위젯 추가

45. 워드프레스 REST API 간략 이해

46. 워드프레스 REST API 응답에 커스텀 필드 추가

47. 워드프레스 REST API 커스텀 라우트 및 엔드포인트

48. 워드프레스 REST API 커스텀 엔드포인트로 구글 클러스터 지도 마커와 인포 윈도 표시

49. 워드프레스 REST API, Underscore.js 자바스크립트 템플릿, 포스트 Ajax Load More

50. 워드프레스 REST API, Underscore.js 자바스크립트 템플릿, 코멘트 Ajax Load More

51. 워드프레스 REST API 인증과 제한 및 제어