* 이 게시물은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
(워드프레스 해부 ⑧) 글
wp_posts는 이름 때문에 오해받는다. “글”만 있을 것 같지만, 사실 페이지, 업로드한 미디어, 내비게이션 메뉴 항목, 자동 저장된 리비전까지 다 여기 산다. 이걸 구분하는 게 post_type 칼럼이다.
핵심 칼럼 몇 개만 알면 이 테이블이 읽힌다.
ID— 글의 고유 번호 (URL의?p=123의 그 123)post_type—post(글),page(페이지),attachment(미디어),revision(리비전),nav_menu_item(메뉴) …post_status—publish,draft,future(예약),trash(휴지통),privatepost_title,post_content,post_name(슬러그),post_date,post_authorpost_parent— 부모 글 ID (리비전·첨부·하위 페이지가 부모를 가리킴)
재밌는 게 리비전이다. 글을 수정할 때마다 워드프레스는 이전 버전을 post_type=revision으로 wp_posts에 복사해 둔다. post_parent가 원본 글을 가리키고. 그래서 편집 이력을 되돌릴 수 있는 거다. 대신 리비전이 쌓이면 테이블이 커지니, 오래된 사이트는 정리해 주면 가벼워진다.
직접 해보기
# 방금 쓴 글이 어떻게 저장됐는지 보기
$ wp post list --post_type=post --fields=ID,post_title,post_status,post_name
# 한 글의 리비전(수정 이력) 확인 — post_parent 가 원본을 가리킨다
$ wp db query "SELECT ID, post_type, post_status FROM wp_posts WHERE post_parent = 123"
✅ 확인 — 초안을 하나 저장한 뒤
post_status를 확인해 보자.draft로 나오면 정상. 발행하면publish, 예약하면future로 바뀐다 — 우리가 이 시리즈를 예약 발행한 것도 이 칼럼이future로 저장돼 있다가 시간이 되면publish로 바뀌는 원리다.
핵심 칼럼 지도
칼럼이 많아 보여도 자주 보는 건 정해져 있다. 이 표만 알면 wp_posts 한 행이 그대로 읽힌다.
| 칼럼 | 뜻 |
|---|---|
| ID | 글의 고유 번호(?p=123의 그 123) |
| post_author | 작성자 — wp_users.ID |
| post_date / _gmt | 작성 시각(로컬 / GMT) |
| post_content | 본문(블록 마크업 포함) |
| post_title / post_excerpt | 제목 / 요약 |
| post_status | publish·draft·future·trash·private |
| post_type | post·page·attachment·revision … |
| post_name | 슬러그(URL에 쓰이는 이름) |
| post_parent | 부모 ID(리비전·첨부·계층 페이지) |
| guid | 고유 식별자 — 바꾸지 말 것 |
리비전·자동저장이 조용히 쌓이는 곳
글을 저장할 때마다 리비전이 post_type='revision', post_parent=원글ID로 같은 테이블에 쌓인다. 오래된 사이트는 이게 수천 행씩 불어나 DB를 무겁게 한다. 보관 개수를 제한하거나 정리 도구로 청소하자.
// wp-config.php — 글당 리비전을 최근 5개만 보관
define( 'WP_POST_REVISIONS', 5 );
guid는 절대 일괄 변경하지 마라
guid는 겉보기엔 URL이라, 도메인을 바꿀 때 같이 고치고 싶어진다. 절대 안 된다. 이건 RSS 리더가 글을 식별하는 고유값이라, 바꾸면 구독자에게 옛 글이 전부 새 글로 재전송된다. 도메인 이전은 guid는 그대로 두고 siteurl·home 옵션과 본문 속 URL만 바꾼다.
상태 흐름 — draft → publish → trash
post_status가 곧 글의 생애다. draft(초안) → publish(공개), 또는 future(예약 — wp-cron이 시각이 되면 publish로 바꾼다) → trash(휴지통, 기본 30일 뒤 영구 삭제). private는 로그인한 권한자만 본다. 이 상태값 하나로 워드프레스가 ‘무엇을 언제 누구에게’ 보여줄지 결정한다.
본체는 봤으니, 다음 편은 이 글에 자유롭게 정보를 덧붙이는 커스텀 필드(postmeta)의 저장 구조다. 대표 이미지, SEO 설정 같은 게 다 여기 붙는다.
자주 묻는 질문 (FAQ)
글 하나가 DB에 어떻게 저장되나요?
wp_posts에 한 행으로 저장되고, post_status(publish·draft 등)와 post_type으로 상태·종류가 구분됩니다.
리비전도 wp_posts에 들어가나요?
네, 리비전과 자동 저장도 post_type이 revision인 행으로 쌓입니다. 너무 많으면 정리해 주는 게 좋습니다.

답글 남기기