실측일 2026-09-04 — 도구와 화면은 그 뒤로 바뀌었을 수 있다.
워드프레스 글을 브라우저 없이 올린다. SSH로 서버에 들어가 WP-CLI 한 줄이면 된다. 이 블로그의 글도 전부 이 방식으로 올라간다. 브라우저 편집기에 의존하면 자동화가 세션 만료·팝업·레이아웃 변경에 계속 깨진다. 터미널은 안 깨진다.
전제
- 자체 서버(VPS)에 워드프레스가 깔려 있다. 공유 호스팅은 SSH가 막혀 있는 경우가 많다
- WP-CLI가 설치돼 있다.
wp --version으로 확인 - 웹루트 소유자가
www-data다. 다른 사용자면 아래sudo -u부분을 바꾼다
절차
1. 본문을 HTML 파일로 만든다
마크다운이 아니라 HTML로 쓴다. 워드프레스 클래식 편집기가 받는 형식이다. 숏코드는 그대로 넣어도 된다. 로컬에서 만든 파일을 서버로 보낸다.
scp post.html root@서버IP:/tmp/
2. 글을 만든다
cd /var/www/example.com ID=$(sudo -u www-data wp post create /tmp/post.html \ --post_type=post --post_status=publish \ --post_title="제목" --post_name="url-slug" \ --post_category=2 --post_author=1 --porcelain)
--porcelain은 생성된 글 ID만 출력한다. 그 ID를 변수에 받아 다음 단계에 쓴다. --post_status=draft로 바꾸면 초안으로 올라가고, 나중에 wp post update $ID --post_status=publish로 공개한다. 이 블로그는 글마다 초안 → 확인 → 공개 순서로 간다.
3. 메타 설명을 넣는다 (Yoast)
sudo -u www-data wp post meta update $ID _yoast_wpseo_metadesc "120~155자 설명"
Yoast SEO는 메타 설명을 글 메타 _yoast_wpseo_metadesc에 저장한다. 포커스 키워드는 _yoast_wpseo_focuskw.
4. 캐시를 비운다
sudo -u www-data wp eval "Cache_Enabler::clear_complete_cache();"
Cache Enabler를 쓰는 경우다. 이 플러그인의 문서 어딘가에 cache_enabler_clear_complete_cache()라는 함수 이름이 돌아다니는데 1.8.16에는 그 함수가 없다. 부르면 PHP Fatal error가 나고 wp-cli가 exit 1로 죽는다. 클래스 정적 메서드로 부른다. 이걸로 한 번 자동화가 멈췄다.
5. 프론트에서 확인한다
curl -s https://example.com/url-slug/ | grep -o '<title>[^<]*</title>' curl -s https://example.com/url-slug/ | grep -o '<meta name="description" content="[^"]*"'
제목과 메타 설명이 나오면 됐다. 숏코드를 썼으면 [로 시작하는 문자열이 본문에 새어 나오지 않았는지도 본다.
걸린 것 하나 — cd를 먼저
sudo -u www-data wp …를 /root에서 실행하면 EACCES로 죽는다. www-data가 /root를 못 읽어서 현재 디렉터리를 잡지 못하기 때문이다. 반드시 웹루트로 cd 한 뒤 실행한다. 스크립트에서는 첫 줄에 cd를 박아 둔다.
같은 방식으로 되는 것들
| 할 일 | 명령 |
|---|---|
| 글 목록 | wp post list --post_type=post --fields=ID,post_name,post_status |
| 초안 → 공개 | wp post update $ID --post_status=publish |
| 본문 교체 | wp post update $ID /tmp/new.html |
| 카테고리 만들기 | wp term create category "이름" --slug=slug |
| 페이지 만들기 | wp post create --post_type=page --post_title="제목" --post_name=slug |
| 옵션 바꾸기 | wp option update blog_public 1 |
| 플러그인 설치·활성 | wp plugin install wordpress-seo --activate |
이 블로그를 세우는 데 든 브라우저 조작은 DNS 레코드 저장과 서치콘솔 소유권 확인뿐이었다. 워드프레스 쪽은 설치부터 첫 글까지 전부 이 명령들로 했다.
같은 상황이면
- 본문은 HTML 파일. 로컬에서 만들고 scp로 보낸다
cd 웹루트→wp post create … --porcelain→ 메타 → 캐시 → curl 확인- 초안으로 먼저 올리고 확인한 뒤 공개로 바꾼다
- 함수 이름은 플러그인 소스에서 확인한다. 문서와 다를 수 있다
- 브라우저 편집기에 묶인 플랫폼에서 무엇이 안 됐는지는 첫 글에