* 이 게시물은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
(워드프레스 해부 ⑨) 메타
글 본체(wp_posts)엔 제목·내용·상태처럼 정해진 칸만 있다. 그럼 대표 이미지, SEO 설명, 플러그인이 붙이는 온갖 데이터는 어디 갈까? 답이 wp_postmeta다. 구조는 단순하다 — post_id, meta_key, meta_value. 한 글에 이 key-value 행을 무한정 붙일 수 있다.
여기서 밑줄이 중요하다. meta_key가 밑줄(_)로 시작하면 “숨은 메타”로, 편집 화면의 커스텀 필드 목록에 안 뜬다. 시스템·플러그인용이라는 뜻이다. 밑줄 없는 건 사용자가 직접 넣는 커스텀 필드다. 예를 들면:
_thumbnail_id— 대표 이미지. 값은 그 이미지(attachment)의 글 ID. 즉 대표 이미지도 결국wp_posts의 한 행을 가리키는 숫자일 뿐이다._edit_lock— 편집 중 잠금(동시 편집 방지)_yoast_wpseo_metadesc— Yoast SEO의 메타 설명. 이 시리즈 글들의 검색용 설명도 여기 저장돼 있다.
이 key-value 구조가 워드프레스 확장성의 핵심이다. 플러그인은 테이블을 새로 안 만들고도, 아무 글에나 자기 데이터를 meta로 붙일 수 있다. 유연한 대신 단점도 있다 — meta가 수천 개면 조회가 느려질 수 있어서, 무거운 데이터는 전용 테이블을 쓰기도 한다.
직접 해보기
# 한 글에 붙은 모든 메타 보기 (숨은 것 포함)
$ wp post meta list 123
# 대표 이미지가 가리키는 첨부 ID 확인
$ wp post meta get 123 _thumbnail_id
# → 456 (이 456이 wp_posts 의 attachment 글이다)
# 커스텀 필드 직접 추가해 보기
$ wp post meta add 123 my_mood "상쾌함"
✅ 확인 — 아무 글의
_thumbnail_id값을 확인하고, 그 번호로wp post get [번호]해보자.post_type=attachment인 이미지가 나오면, “대표 이미지 = postmeta가 가리키는 첨부 글”이라는 구조가 눈으로 확인된 거다.
메타를 코드로 읽고 쓰기
메타를 다루는 기본 함수는 넷이다 — get / add / update / delete_post_meta. 실무에선 update를 제일 많이 쓴다. 없으면 만들고 있으면 갱신해주기 때문이다.
update_post_meta( $post_id, '_subtitle', '부제목입니다' ); // 저장/갱신
$sub = get_post_meta( $post_id, '_subtitle', true ); // 값 하나
$all = get_post_meta( $post_id, 'gallery', false ); // 같은 key 전부(배열)
delete_post_meta( $post_id, '_subtitle' ); // 삭제
single true/false — 한 키에 여러 값
같은 meta_key로 행을 여러 개 붙일 수 있다(예: 사진 여러 장). add_post_meta를 반복하면 행이 쌓이고, get_post_meta($id, $key, false)로 배열로 받는다. 반대로 update_post_meta는 그 키를 하나로 정리한다. 이 차이를 모르면 값이 덮이거나 중복되니, ‘하나냐 여럿이냐’를 먼저 정하고 함수를 고르자.
메타로 글 찾기 — 그리고 성능
특정 메타값을 가진 글을 찾을 땐 WP_Query의 meta_query를 쓴다. 다만 이건 wp_postmeta를 조인·검색하는 거라 데이터가 크면 느리다. meta_value는 인덱스가 약해서(LONGTEXT) 대량 필터·정렬엔 불리하다. 자주 걸러야 하는 값이라면 택소노미로 빼거나 등록된 메타에 인덱스를 얹는 편을 고려한다.
$q = new WP_Query( array(
'meta_query' => array( array(
'key' => 'rating',
'value' => 4,
'compare' => '>=',
'type' => 'NUMERIC',
) ),
) );
REST·블록 에디터에 노출하려면 register_post_meta
그냥 add_post_meta로 넣은 값은 REST API나 블록 에디터에서 보이지 않는다. register_post_meta로 show_in_rest => true를 주면 REST에 뜨고 메타박스(39편)에서 다룰 수 있다. 타입·single·인증 콜백을 함께 지정하는 게 안전하다.
register_post_meta( 'post', '_subtitle', array(
'show_in_rest' => true,
'single' => true,
'type' => 'string',
'auth_callback' => function () { return current_user_can( 'edit_posts' ); },
) );
콘텐츠는 여기까지. 다음 편은 사이트 전역 설정이 사는 wp_options와 autoload의 함정이다. 사이트가 느려지는 은근한 범인이 여기 숨어 있다.
자주 묻는 질문 (FAQ)
커스텀 필드는 어디에 저장되나요?
wp_postmeta 테이블에 post_id·meta_key·meta_value 형태로 저장됩니다. 한 글에 여러 메타가 붙습니다.
메타가 많으면 느려지나요?
메타 조회가 많아지면 쿼리가 늘 수 있습니다. 자주 쓰는 값은 캐싱하거나 구조를 정리하는 게 좋습니다.

답글 남기기