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

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

다음 그림은 예제의 검색 폼으로 미디어 종류는 분류 ‘mediacat’의 term 이름을 라디오 버튼으로, 카테고리는 분류 ‘photocat’의 term 이름을 드롭다운 목록으로 출력한 것입니다.

검색 폼의 분류 term 목록

두 분류의 term 출력에 사용한 워드프레스 함수는 다음과 같은데, 분류 photocat의 term 출력에 사용한 wp_dropdown_categories 함수는 내부적으로 get_terms 함수를 사용합니다.

  • get_terms
  • wp_dropdown_categories

클래스 WP_Term_Query

지난 과정에서 분류의 term 데이터 쿼리를 위한 WP_Term_Query 클래스는 역시 분류의 term 데이터를 반환하는 get_terms 함수와 비교하면 쿼리 캐싱이 있어 성능에 이점이 있다고 말했습니다. 그러나 실제로 어떤 것이 좋다고 말하기 어려우며, 성능의 이점을 체감하는 것도 쉽지 않습니다.

쿼리 클래스와 함수를 사용했을 때의 차이만 확인해봅니다. 편집기에 연습장 파일이 열려 있지 않다면 열고, 기존에 추가한 코드는 지우고 다음 코드를 추가한 후 사이트에서 연습장 페이지에 접근합니다.

/* WP_Term_Query */
$class_wp_term_query = new WP_Term_Query( array(
    'taxonomy' => 'mediacat',
    'hide_empty' => false,
) );
echo '<pre>' . print_r( $class_wp_term_query, true ) . '</pre>';

/* get_terms */
$func_get_terms = get_terms( array(
    'taxonomy' => 'mediacat',
    'hide_empty' => false
) );
echo '<pre>' . print_r( $func_get_terms, true ) . '</pre>';

/* WP_Term_Query - terms 프로퍼티(멤버 변수)*/
echo '<pre>' . print_r( $class_wp_term_query->terms, true ) . '</pre>';

연습장 페이지의 결과를 축약하여 나타내면 다음과 같은데, 위의 코드 16번 줄은 get_terms 함수를 사용할 때의 결과와 같다는 것을 다음 25번 줄 아래의 오브젝트 데이터로 알 수 있습니다.

/* WP_Term_Query */
WP_Term_Query Object
(
    [request] => 
    [meta_query] => WP_Meta_Query Object
    [meta_query_clauses:protected] => 
    [sql_clauses:protected] => Array
    [query_vars] => Array
    [query_var_defaults] => Array
    [terms] => Array
        (
            [0] => WP_Term Object
            [1] => WP_Term Object
            [2] => WP_Term Object
        )
)
/* get_terms */
Array
(
    [0] => WP_Term Object
    [1] => WP_Term Object
    [2] => WP_Term Object
)
/* WP_Term_Query - terms 프로퍼티(멤버 변수)*/
Array
(
    [0] => WP_Term Object
    [1] => WP_Term Object
    [2] => WP_Term Object
)

예제에서는 WP_Term_Query 클래스를 사용하지만, 예제 구성에 특정 이점이 있어서 사용하는 것이 아니라 해당 클래스를 경험하는 데 초점을 두며, 예제를 벗어나 term 데이터 활용이 필요할 때 조금 더 유리한 방법을 선택하기 바랍니다.

검색 폼 분류 term 데이터

검색 폼에서 사용한 get_terms 함수와 wp_dropdown_categories 함수를 WP_Term_Query 클래스로 대체하여 term 데이터를 출력합니다. 편집기로 테마 루트의 searchform.php 파일을 엽니다.

다음 1번에서 5번 줄을 찾아 삭제하고 7번에서 17번 줄을 추가하고 저장합니다.

$mediacat_terms = get_terms( array( 'taxonomy' => 'mediacat', 'hide_empty' => false ) );
foreach ( $mediacat_terms as $term ) {
    $term_name = $term->name;
    echo '<label><input ' . checked( $tax_mediacat, $term_name, false ) . 'type="radio" name="mediacat" value="' . $term_name . '"> ' . $term_name . '</label>';
}

/* WP_Term_Query */
$mediacat_terms = new WP_Term_Query( array(
    'taxonomy' => 'mediacat',
    'hide_empty' => false,
) );
if ( ! empty( $mediacat_terms ) ) {
    foreach ( $mediacat_terms ->terms as $mterm ) {
        $mterm_name = $mterm->name;
        echo '<label><input ' . checked( $tax_mediacat, $mterm_name, false ) . 'type="radio" name="mediacat" value="' . $mterm_name . '"> ' . $mterm_name . '</label>';
    }
}

다음의 1번에서 13번 줄을 찾아 삭제하고, 15번에서 28번 줄을 추가한 후 저장합니다.

$args = array(
    'show_option_all' => '전체',
    'orderby' => 'name',
    'show_count' => false,
    'selected' => $tax_photocat,
    'name' => 'photocat',
    'id' => 'photocat',
    'class' => 'select_photocat',
    'taxonomy' => 'photocat',
    'value_field' => 'name',
    'hide_empty' => false
);
$select_photocat = wp_dropdown_categories( $args );

/* WP_Term_Query */
$photocat_terms = new WP_Term_Query( array(
    'taxonomy' => 'photocat',
    'hide_empty' => false,
) );
echo '<select name="photocat" id="photocat" class="select_photocat">';
    echo '<option value="">전체</option>';
    if ( ! empty( $photocat_terms ) ) {
        foreach ( $photocat_terms->terms as $pterm ) {
            $pterm_name = $pterm->name;
            echo '<option value="' . $pterm_name . '"' . selected( $tax_photocat, $pterm_name ) . '>' . $pterm_name . '</option>';
        }
    }
echo '</select>';

위의 코드 25번 줄 selected 워드프레스 함수는 폼의 드롭다운 목록에서, 예제 기준으로 검색 쿼리 변수(검색 폼에서 선택한 데이터)에 해당하는 값이 선택된 상태로 출력하는 유용한 함수로 지난 과정의 checked 함수와 같은 유형입니다.

검색 폼이 출력되는 사이트 페이지에서 검색 폼의 분류 term 목록이 올바르게 출력되는지 확인하세요.

다음은 이번 장의 변경 파일을 받을 수 있는 링크로, 압축을 풀어 테마 루트에 덮어쓰세요. 파일에는 기존 코드를 지우지 않고 비활성화하여 그대로 두었습니다.

검색 폼에서 WP_Term_Query 클래스로 출력한 term 데이터는 나중에 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 클래스로 구글 지도에 마커와 섬네일 표시

» 워드프레스 분류 데이터 쿼리 클래스, 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 인증과 제한 및 제어