워드프레스 글을 브라우저 없이 올리기 — SSH + WP-CLI 절차 전부

실측일 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 레코드 저장과 서치콘솔 소유권 확인뿐이었다. 워드프레스 쪽은 설치부터 첫 글까지 전부 이 명령들로 했다.

같은 상황이면

  1. 본문은 HTML 파일. 로컬에서 만들고 scp로 보낸다
  2. cd 웹루트wp post create … --porcelain → 메타 → 캐시 → curl 확인
  3. 초안으로 먼저 올리고 확인한 뒤 공개로 바꾼다
  4. 함수 이름은 플러그인 소스에서 확인한다. 문서와 다를 수 있다
  5. 브라우저 편집기에 묶인 플랫폼에서 무엇이 안 됐는지는 첫 글