[워드프레스] 8. 글 : 글 하나가 DB에 저장되는 구조 (wp_posts)

워드프레스 해부 8편 - 글 하나가 DB에 저장되는 구조 (wp_posts)

작성자

카테고리:

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

(워드프레스 해부 ⑧) 글

wp_posts는 이름 때문에 오해받는다. “글”만 있을 것 같지만, 사실 페이지, 업로드한 미디어, 내비게이션 메뉴 항목, 자동 저장된 리비전까지 다 여기 산다. 이걸 구분하는 게 post_type 칼럼이다.

핵심 칼럼 몇 개만 알면 이 테이블이 읽힌다.

  • ID — 글의 고유 번호 (URL의 ?p=123의 그 123)
  • post_type — post(글), page(페이지), attachment(미디어), revision(리비전), nav_menu_item(메뉴) …
  • post_status — publish, draft, future(예약), trash(휴지통), private
  • post_title, post_content, post_name(슬러그), post_date, post_author
  • post_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_statuspublish·draft·future·trash·private
post_typepost·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인 행으로 쌓입니다. 너무 많으면 정리해 주는 게 좋습니다.

코멘트

답글 남기기

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