* 이 게시물은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
(워드프레스 해부 ㉑) 택소노미
카테고리·태그처럼 콘텐츠를 묶는 분류 체계를 택소노미(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의 대상에 해당 포스트 타입을 지정하면 됩니다.

답글 남기기