워드프레스 Transient API

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

워드프레스 사이트 성능(Performance) 향상 방법에 ‘캐시 데이터’가 있습니다. 지금 말하는 캐시 데이터는 ‘만료 기간이 있는, 데이터베이스에 저장된 데이터’를 말합니다. 이 캐시 데이터를 생성, 사용, 삭제하는 워드프레스 표준 방식이 ‘Transient API’입니다.

Transient API

캐시 데이터(Transient API)는 만료 기간이 있다는 것을 제외하면 옵션 데이터(Options API)와 비슷하지만, 만료 기간을 포함하여 정의할 수 있다는 것만으로 다양한 활용이 가능합니다. 다음 함수와 함께 사용하는 것이 일반적인 흐름입니다.

기본 사용 흐름

get_transient (비교)
set_transient (생성)
delete_transient (삭제)

다음은 비교, 생성, 삭제 흐름의 기본 예시입니다.

// 비교
if ( false === ( $my_transient_data = get_transient( 'my_transient_name' ) ) ) {
    
    $my_transient_data = // 캐시 데이터로 만들 모든 것
    
// 생성
    set_transient( 'my_transient_name', $my_transient_data, 30 * DAY_IN_SECONDS ); // 30 * 24시간 = 1달
}

// 삭제
add_action( 'save_post', 'delete_my_transient_name' );
function delete_my_transient_name() {
    delete_transient( 'my_transient_name' );
}

1번 줄에서 my_transient_name 이름의 캐시 데이터를 ‘비교’하여 없을 때(만료) 4번 줄에서 정의한 캐시 데이터를 7번 줄에서 만료 기간 1달의 캐시 데이터를 ‘생성’하고, 11번 줄 이하의 코드에서 포스트를 저장할 때 캐시 데이터를 ‘삭제’하는 흐름입니다. 해당 코드가 있는 페이지를 로드하면 캐시 데이터가 다시 생성되며, 단계를 반복합니다.

캐시 데이터 삭제

위의 내용은 기본 예시로, ‘포스트를 저장’할 때 삭제하는 과정을 두어 갱신한 데이터를 즉시 제공하는 것을 기준으로 둔 것인데, 만료 기간이 지나면 해당 캐시 데이터는 자동으로 삭제됩니다. 따라서 꼭 삭제하지 않아도 되는 때라면 삭제 단계는 없어도 됩니다.

콘텐츠 추가와 갱신이 빈번하거나 실시간 데이터를 제공하지 않아도 되는 때는 만료 기간을 적절히 조절하여 주기적으로 캐시 데이터를 갱신하는 것이 사이트 성능에 더 유리합니다. 캐시 데이터는 데이터베이스에 저장된다는 것을 기억해야 합니다.

시간 상수

앞의 코드 7번 줄 만료 기간 설정은 다음의 시간 상수를 참고하면 쉽게 이해할 수 있습니다.

MINUTE_IN_SECONDS = 60 (seconds)
HOUR_IN_SECONDS = 60 * MINUTE_IN_SECONDS
DAY_IN_SECONDS = 24 * HOUR_IN_SECONDS
WEEK_IN_SECONDS = 7 * DAY_IN_SECONDS
YEAR_IN_SECONDS = 365 * DAY_IN_SECONDS

캐시 데이터 저장

캐시 데이터는 데이터베이스 _options 테이블에 저장되는데, 만료 기간 데이터와 캐시 데이터 2개가 한 쌍으로 생성됩니다. 다음 주소의 옵션 필드 전체 출력 페이지에 접근하면 ‘transient’ 문자를 포함한 옵션 이름을 볼 수 있습니다.

  • localhost/wp-admin/options.php

Transient API 사용

캐시 데이터는 기본으로 사이트 로드 속도 향상에 목적을 두고 있지만, 어떤 때 사용하는가의 기준은 없으며 운영자의 판단입니다. 그래도 몇 가지 이어지는 내용에 사용하면 유리할 때가 많습니다.

쿼리 전체 캐시

다음 기준의 쿼리를 캐시 데이터로 생성한다고 가정합니다.

  • 타입 post 포스트 5개
  • 만료 기간 1일

캐시 데이터는 다음처럼 생성할 수 있습니다.

if ( false === ( $featured = get_transient( 'latest_posts' ) ) ) {
    
    $featured = new WP_Query(
        array(
            'post_type' => 'post',
            'posts_per_page' => 5
        ));

    set_transient( 'latest_posts', $featured, 24 * HOUR_IN_SECONDS );
}

위의 코드로 데이터베이스에 생성하는 옵션 필드와 캐시 데이터를 다음 그림에서 실감할 수 있습니다.

쿼리 전체를 캐시 데이터로 생성했을 때 데이터

캐시 데이터에 WP_Query 클래스에 의한 모든 오브젝트 데이터가 저장되는데, 포스트 아이디만 있으면 제목과 퍼머링크는 쉽게 구할 수 있으므로 과한 캐시 데이터입니다. 쿼리 결과 전체 캐시도 필요한 때가 있으며, 가능하다는 정도로 이해하면 됩니다.

특정 데이터만 캐시

위의 기준으로 포스트 아이디(ID)만 캐시 데이터로 저장하려면 다음처럼 정의할 수 있습니다.

if ( false === ( $featured = get_transient( 'latest_posts' ) ) ) {
    
    $featured = get_posts(
        array(
            'post_type' => 'post',
            'posts_per_page' => 5
        ));
    
    foreach ( $featured as $feature ) {
        $post_id = $feature->ID;
        $latest_posts[] = $post_id;
    }

    set_transient( 'latest_posts', $latest_posts, 24 * HOUR_IN_SECONDS );
}

위의 코드로 생성한 캐시 데이터로 포스트를 출력하려면 다음으로 정의할 수 있습니다.

$featured_posts = get_transient( 'latest_posts' );
echo '<ul>';
foreach ( $featured_posts as $id ) {
    echo '<li><a href="' . esc_url( get_permalink( $id ) ) . '" title="' . the_title_attribute( array( 'before' => '', 'after' => '', 'echo'=> false, 'post' => $id ) ) . '">' . get_the_title( $id ) . '</a></li>';
}
echo '</ul>';

위의 캐시 데이터 생성과 포스트 출력은 페이지 전체 로드 속도 향상 이점은 있지만, 포스트 아이디로 제목과 퍼머링크를 출력하는 쿼리 개수가 늘어납니다. 다음처럼 제목과 퍼머링크를 모두 캐시 데이터로 생성하여 포스트 출력에 바로 사용하면 쿼리 개수 증가 문제를 해결할 수 있습니다.

if ( false === ( $featured = get_transient( 'latest_posts' ) ) ) {
    
    $featured = get_posts(
        array(
            'post_type' => 'post',
            'posts_per_page' => 5
        ));
    
    foreach ( $featured as $feature ) {     
        $latest_posts[] = array(
            'ID' => $feature->ID,
            'title' => $feature->post_title,
            'url' => get_permalink( $feature->ID )
        );
    }

    set_transient( 'latest_posts', $latest_posts, 24 * HOUR_IN_SECONDS );
}

$featured_posts = get_transient( 'latest_posts' );
echo '<ul>';
foreach ( $featured_posts as $feat ) {
    //$post_id = $feat['ID'];
    $post_title = $feat['title'];
    $post_url = $feat['url'];
    
    echo '<li><a href="' . esc_url( $post_url ) . '" title="' . esc_attr( $post_title ) . '">' . $post_title . '</a></li>';
}
echo '</ul>';

프런트 페이지나 사이드 영역의 최근 포스트 출력 구성은 사이트 구성에 많이 사용하는 것이므로, 포스트를 생산하는 주기에 맞게 캐시 데이터 삭제 기간이나 시점을 정하면 성능 향상을 도모할 수 있습니다.

내비게이션 메뉴

워드프레스 메뉴 시스템은 훌륭하지만, 때로 사이트 성능을 저하하는 하나의 요인이 됩니다. 메뉴는 사이트 전역에 늘 출력되는 포스트 타입이며 콘텐츠입니다. 그리고, 변동 주기가 가장 긴 콘텐츠라고 볼 수도 있습니다. 이때도 캐시 데이터로 메뉴를 출력하면 성능이 향상됩니다. 예제는 템플릿 파일에 직접 메뉴를 정의하므로 염두에 두지 않아도 되지만, 메뉴 개수나 적거나 많거나 상관없이 워드프레스 메뉴는 캐시 데이터 구성을 검토해보세요.

사용 시간제한

다음은 한 시간마다 특정 사용자의 암호를 변경하는 예시 코드입니다.

// 아이디 1 사용자의 암호를 한 시간마다 변경
if ( false === ( $random_pasword = get_transient( 'random_password' ) ) ) {
    $user_id = 1;
    $random_pasword = wp_generate_password( 24, false, false );
    $update_password = wp_set_password( $random_pasword, $user_id );
    set_transient( 'random_password', $random_pasword, 60 * MINUTE_IN_SECONDS );
}

캐시 데이터 생성 흐름에 워드프레스 암호 생성 함수를 사용하여 특정 사용자의 암호를 한 시간마다 변경하여 특정 콘텐츠 열람에 제한을 둘 때 활용할 수 있습니다.

Transient API는 서버를 직접 운용하지 않는 워드프레스 사용자도 쉽게 적용할 수 있는 워드프레스의 매력적인 성능 향상 기능이며, 사이트 콘텐츠 구성과 운용에 이점이 있으므로 꼭 학습하기 바랍니다.

예제 목차

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

1. 예제 구성 환경과 파일

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

3. 테마 Pics Press

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

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

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

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

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

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

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

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

12. 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. 사이트 메뉴 및 포스트 페이지 링크

» 워드프레스 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 인증과 제한 및 제어