[워드프레스] 21. 택소노미 : 나만의 분류 체계 만들기

워드프레스 해부 21편 - 나만의 분류 체계 만들기

작성자

카테고리:

* 이 게시물은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

(워드프레스 해부 ㉑) 택소노미

카테고리·태그처럼 콘텐츠를 묶는 분류 체계를 택소노미(taxonomy)라 한다. 앞 편에서 만든 “책”을 “장르”로 분류하고 싶다면? 커스텀 택소노미를 등록하면 된다. 저장 구조는 12편의 3테이블 구조에 그대로 얹힌다.

택소노미는 두 성격으로 나뉜다. 계층형(카테고리처럼 부모-자식, 체크박스)과 비계층형(태그처럼 평평, 자유 입력). hierarchical 옵션으로 정한다.

직접 해보기

add_action( 'init', function() {
    register_taxonomy( 'genre', 'book', array(
        'labels'       => array( 'name' => '장르' ),
        'hierarchical' => true,    // true=카테고리형, false=태그형
        'public'       => true,
        'show_in_rest' => true,
    ) );
} );

✅ 확인 — 등록 후 “책” 편집 화면 오른쪽에 “장르” 박스가 생기면 성공. 장르를 하나 만들어 붙이면, 그 관계가 wp_term_relationships에 저장된다 — 우리가 12편에서 추적한 그 테이블이다.

흔히 막히는 지점 — 커스텀 택소노미 등록 후 텀 아카이브(/genre/rock/)가 404면 거의 리라이트 규칙 미갱신 탓이다. rewrite를 켰다면 설정 > 고유주소에서 한 번 저장하거나, 플러그인 활성화 훅에서 flush_rewrite_rules()를 한 번만 호출한다. 매 요청 flush는 성능이 죽으니 금물.

계층형이냐, 태그형이냐

커스텀 택소노미를 만들 때 가장 먼저 정하는 건 계층 구조 유무다. hierarchical => true면 카테고리처럼 부모·자식을 두는 트리 구조(예: 지역 > 서울 > 강남), false면 태그처럼 평평한 구조가 된다. 이 한 값이 편집 화면 UI(체크박스 vs 입력창)와 URL 구조를 함께 바꾼다.

제대로 등록하기

실무에서 쓰는 register_taxonomy()는 라벨·URL·에디터 노출까지 챙긴다. 특히 show_in_rest => true를 빠뜨리면 블록 에디터 사이드바에 택소노미가 아예 안 나타나니 주의하자.

add_action( 'init', function () {
    register_taxonomy( 'genre', array( 'book' ), array(
        'labels'       => array( 'name' => '장르', 'singular_name' => '장르' ),
        'hierarchical' => true,        // 카테고리형
        'public'       => true,
        'show_in_rest' => true,        // 블록 에디터·REST 노출 (필수!)
        'rewrite'      => array( 'slug' => 'genre' ),
    ) );
} );

두 번째 인자 array('book')가 이 택소노미를 어떤 포스트 타입에 붙일지다. 나중에 다른 타입에도 연결하려면 register_taxonomy_for_object_type('genre','post')를 쓴다.

등록한 택소노미로 글 뽑아내기

분류만 만들면 끝이 아니다. 그 분류로 글을 조회할 수 있어야 쓸모가 있다. 특정 텀에 속한 글은 WP_Query의 tax_query로 뽑는다.

$q = new WP_Query( array(
    'post_type' => 'book',
    'tax_query' => array( array(
        'taxonomy' => 'genre',
        'field'    => 'slug',
        'terms'    => 'sf',       // 'sf' 장르의 book만
    ) ),
) );

// 택소노미의 텀 목록 자체가 필요하면:
$terms = get_terms( array( 'taxonomy' => 'genre', 'hide_empty' => false ) );

흔히 막히는 지점

  • URL이 404 — 택소노미를 새로 등록하면 리라이트 규칙이 갱신되지 않았을 수 있다. 설정 → 고유주소에서 한 번 저장(flush)하면 풀린다.
  • 블록 에디터에 안 보임 — show_in_rest => true를 빠뜨린 경우다. 블록 에디터는 REST로 데이터를 읽는다.
  • init보다 늦게 등록 — register_taxonomy는 반드시 init 훅 안에서 호출해야 한다.
  • 기존 카테고리로 충분한가? — 성격이 완전히 다른 축(카테고리는 ‘주제’, 장르는 ‘형식’)일 때만 새 택소노미를 만드는 게 관리에 좋다.

택소노미냐, 커스텀 필드냐

헷갈리기 쉬운 선택이다. 기준은 하나 — 여러 글을 묶어 필터·아카이브 페이지가 필요하면 택소노미, 글 하나에 딸린 부가 정보면 커스텀 필드(메타)다. 예를 들어 책의 ‘장르’는 같은 장르 글을 모아 보여줘야 하니 택소노미, ‘ISBN’은 그 책에만 붙는 값이니 커스텀 필드가 맞다.

프로그램으로 텀 다루기

가져오기 스크립트나 자동화에서는 텀을 코드로 만들고 연결한다. 텀 생성은 wp_insert_term(), 글에 연결은 wp_set_object_terms()다.

// 텀 생성 (이미 있으면 에러 대신 기존 것 사용)
$t = wp_insert_term( 'SF', 'genre', array( 'slug' => 'sf' ) );

// 글(id 123)을 'sf' 장르에 연결 (append=true면 기존 유지하고 추가)
wp_set_object_terms( 123, 'sf', 'genre', true );

반대로 글에 붙은 텀을 읽을 땐 wp_get_object_terms(123, 'genre')를 쓴다. 이 세 함수만 알면 분류의 생성·연결·조회를 코드로 전부 다룰 수 있다.

분류까지 갖췄으니, 다음은 글 안에 동적 내용을 꽂는 숏코드다.

자주 묻는 질문 (FAQ)

커스텀 택소노미는 언제 쓰나요?

기본 카테고리·태그 말고 나만의 분류 체계(예: 장르·브랜드)가 필요할 때 register_taxonomy로 만듭니다.

택소노미를 CPT에 연결하려면요?

register_taxonomy의 대상에 해당 포스트 타입을 지정하면 됩니다.

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다