Claude Code로 워드프레스 블로그 자동 발행 스킬 만들기

TL;DR

  • Claude Code의 스킬(Skill) 기능을 활용하여 작업 세션 내용을 자동으로 블로그 포스트로 변환
  • 워드프레스 REST API + Application Password로 안전한 인증 구현
  • 마크다운 → HTML 변환, 포스트 발행, 이미지 업로드까지 자동화
  • “블로그 작성해줘” 한 마디로 기술 블로그 초안 생성 가능

배경

개발 작업을 하다 보면 배운 것들을 블로그로 정리하고 싶은 순간이 많습니다. 하지만 코딩이 끝난 후 다시 블로그 에디터를 열고, 코드를 복사하고, 설명을 작성하는 건 꽤 번거로운 일입니다.

“Claude Code가 작업하면서 알아서 블로그 포스트도 만들어주면 좋겠다”는 생각에서 이 스킬을 만들게 되었습니다.

구현 과정

1단계: 스킬 구조 설계

Claude Code 스킬은 다음 구조를 따릅니다.

wp-blog-post/
├── SKILL.md           # 스킬 정의 (필수)
├── scripts/           # 실행 스크립트
│   ├── publish_post.py
│   ├── upload_media.py
│   └── md_to_html.py
└── references/        # 참조 문서
    └── post-templates.md

SKILL.md의 frontmatter에서 스킬 이름과 트리거 키워드를 정의합니다.

---
name: wp-blog-post
description: |
  작업 세션 내용을 워드프레스 블로그 포스트로 작성하고 발행.
  "블로그 작성", "포스트 발행", "워드프레스에 올려" 요청 시 사용.
---

2단계: 워드프레스 REST API 연동

워드프레스 5.6+부터 기본 제공되는 Application Password를 사용합니다. 외부 플러그인 없이 안전하게 인증할 수 있습니다.

def make_auth_header(username: str, app_password: str) -> str:
    """Basic 인증 헤더 생성"""
    credentials = f"{username}:{app_password}"
    encoded = base64.b64encode(credentials.encode()).decode()
    return f"Basic {encoded}"

포스트 발행은 /wp-json/wp/v2/posts 엔드포인트를 사용합니다:

post_data = {
    "title": title,
    "content": content,
    "status": "draft",  # 초안으로 저장
    "categories": category_ids,
    "tags": tag_ids,
}

api_url = f"{site_url}/wp-json/wp/v2/posts"
req = Request(
    api_url,
    data=json.dumps(post_data).encode(),
    headers={
        "Authorization": auth_header,
        "Content-Type": "application/json",
    },
    method="POST",
)

3단계: 마크다운 → HTML 변환

워드프레스 Gutenberg 에디터와 호환되도록 마크다운을 HTML로 변환합니다. 특히 코드 블록은 Gutenberg 형식으로 변환해야 syntax highlighting이 제대로 동작합니다.

def convert_code_blocks(text: str) -> str:
    """코드 블록을 Gutenberg 형식으로 변환"""
    pattern = r'```(\w+)?\n(.*?)```'

    def replace_code(match):
        lang = match.group(1) or ""
        code = match.group(2).rstrip()
        # HTML 이스케이프
        code = code.replace("&", "&")
        code = code.replace("<", "&lt;")
        code = code.replace(">", "&gt;")

        if lang:
            return f'<!-- wp:code {{"language":"{lang}"}} -->\n' \
                   f'<pre class="wp-block-code"><code>{code}</code></pre>\n' \
                   f'<!-- /wp:code -->'
        else:
            return f'<!-- wp:code -->\n' \
                   f'<pre class="wp-block-code"><code>{code}</code></pre>\n' \
                   f'<!-- /wp:code -->'

    return re.sub(pattern, replace_code, text, flags=re.DOTALL)

4단계: 이미지 업로드 기능

스크린샷 등 로컬 이미지를 워드프레스 미디어 라이브러리에 업로드할 수 있습니다.

python scripts/upload_media.py \
  --file ./screenshot.png \
  --alt-text "구현 결과 스크린샷"

반환된 미디어 ID를 --featured-media 옵션으로 전달하면 대표 이미지로 설정됩니다.

사용 방법

환경변수 설정

먼저 워드프레스 연동을 위한 환경변수를 설정합니다:

export WP_SITE_URL="https://your-site.com"
export WP_USERNAME="your-username"
export WP_APP_PASSWORD="xxxx xxxx xxxx xxxx"

Application Password는 워드프레스 관리자 → 사용자 → 프로필 → “애플리케이션 비밀번호” 섹션에서 생성할 수 있습니다.

Claude Code에서 사용

간단히 요청하면 됩니다:

블로그 작성해줘

또는 더 구체적으로:

오늘 작업한 내용을 기술 블로그로 정리해서 워드프레스에 올려줘

스킬이 자동으로,

  1. 세션 내용 분석
  2. 기술 블로그 형식으로 구조화
  3. 마크다운 → HTML 변환
  4. 워드프레스에 초안으로 발행

결과

  • 코딩하면서 동시에 블로그 콘텐츠 생성 가능
  • 코드 스니펫이 자동으로 syntax highlighting 적용
  • 초안으로 저장되어 발행 전 검토 가능
  • 카테고리/태그 자동 생성 및 할당

마치며

Claude Code 스킬을 만들면서 느낀 점은, 반복적인 작업을 자동화하는 것의 가치입니다. 블로그 작성이라는 “해야지 해야지” 하면서 미루던 일이 이제는 한 마디 명령으로 해결됩니다.

스킬의 핵심은 트리거 키워드를 잘 정의하는 것입니다. 사용자가 자연스럽게 말할 수 있는 표현들을 description에 포함시키면, Claude가 알아서 적절한 시점에 스킬을 활성화합니다.

전체 코드는 GitHub에서 확인할 수 있습니다: https://github.com/greeun/wp-blog-post

댓글 달기

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

위로 스크롤