[워드프레스] 9. 메타 : 커스텀 필드는 어디에 저장되나 (postmeta)

워드프레스 해부 9편 - 커스텀 필드는 어디에 저장되나 (postmeta)

작성자

카테고리:

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

(워드프레스 해부 ⑨) 메타

글 본체(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 형태로 저장됩니다. 한 글에 여러 메타가 붙습니다.

메타가 많으면 느려지나요?

메타 조회가 많아지면 쿼리가 늘 수 있습니다. 자주 쓰는 값은 캐싱하거나 구조를 정리하는 게 좋습니다.

코멘트

답글 남기기

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