글 300건의 카테고리를 옮기거나, 특정 조건의 초안을 한꺼번에 발행하거나, 태그 하나를 통째로 정리하는 일은 관리 화면에서 하면 반나절이 걸립니다. 명령으로는 두 줄입니다. 그 두 줄이 왜 두 줄이어야 하는지가 이 회차의 핵심입니다.
목록이 먼저입니다
wp post list 는 WP_Query 의 인자를 거의 그대로 플래그로 받습니다. 즉 관리 화면 목록에서 걸 수 있는 필터는 대부분 여기서도 걸립니다.
wp post list --post_type=post --post_status=draft --fields=ID,post_title,post_name
wp post list --post_type=post --category_name=seo --format=csv
wp post list --post_type=post --posts_per_page=-1 --format=ids
--fields 로 필요한 열만 뽑고, --format 으로 표 · CSV · JSON · ID 목록 중 하나를 고릅니다. 이 중 --format=ids 가 다음 단계의 재료입니다.
규칙은 하나입니다. 대상을 고르는 명령과 그 대상을 바꾸는 명령을 분리하고, 고르는 명령을 먼저 단독으로 실행합니다. 화면에 나온 목록이 의도한 목록과 같은지 눈으로 확인한 뒤에만 두 번째 명령을 붙입니다.
생성 — –porcelain 이 파이프를 만든다
글을 만들 때 --porcelain 을 붙이면 사람이 읽는 성공 메시지 대신 새 글의 ID 하나만 출력합니다. 그래서 다음 명령의 인자로 그대로 넘어갑니다.
ID=$(wp post create --post_type=page --post_title='요금' --post_name=pricing --post_status=draft --porcelain)
wp post meta update $ID _wper_layout wide
wp post term set $ID category performance
본문이 긴 경우에는 플래그에 밀어 넣지 않고 파일에서 읽습니다 — wp post create ./body.html --post_title='요금' 형태로 첫 위치 인자에 파일 경로를 주면 그 파일이 본문이 됩니다. 셸 따옴표 지옥을 피하는 가장 쉬운 방법입니다.
분류와 메타
텀도 같은 방식입니다. 먼저 무엇이 있는지 보고, 그다음에 붙입니다.
wp term list category --fields=term_id,slug,name,count
wp term create wper_role developer --slug=developer
wp post term add 123 wper_level practical
wp post meta list 123
term set 과 term add 는 다릅니다. set 은 기존 텀을 전부 교체하고 add 는 더합니다. 카테고리처럼 “글 하나에 하나” 규칙이 있는 분류에는 set, 태그처럼 누적되는 분류에는 add 를 씁니다. 이 둘을 바꿔 쓰면 조용히 분류가 뭉개집니다.
메타에 배열이나 객체를 넣어야 한다면 --format=json 을 씁니다. 직렬화 문자열을 손으로 만들어 넣지 마세요 — 다음 회차의 주제가 바로 그 직렬화가 깨지는 이야기입니다.
일괄 수정에서 다치지 않는 법
선택이 확인됐으면 실행은 짧습니다. 목록 명령을 그대로 안쪽에 넣습니다.
wp post update $(wp post list --post_type=post --post_status=draft --category_name=seo --format=ids) --post_status=publish
여기서 지켜야 할 것들이 있습니다.
wp post delete 는 기본이 휴지통 이동이고, --force 를 붙이면 영구 삭제입니다. 영구 삭제는 되돌릴 수 없습니다. 대량 삭제 앞에서는 습관적으로 wp db export 를 한 번 돌리는 편이 낫습니다 — 몇 초면 끝나고, 필요할 때 없으면 대체할 방법이 없습니다.
콘텐츠 구조를 어떻게 설계하면 이런 작업이 쉬워지는지는 개발 워크플로우 아카이브에서 다루고, 이미 쌓인 사이트의 구조 정리와 업그레이드를 한 건으로 맡기고 싶다면 최적화 지원 사업을 참고하세요.
다음 회차
다음 회차는 도메인을 바꾸는 작업입니다. SQL 한 줄로 하고 싶어지는 일인데, 바로 거기서 설정값이 조용히 사라집니다 — 이유는 직렬화입니다.