글을 발행할 때마다 카테고리를 직접 고르는 작업은 생각보다 손이 많이 갑니다. 포스트가 10개일 때는 괜찮지만, 수십 개가 쌓이면 분류 실수도 생기고 일관성도 흔들립니다. WordPress REST API와 Python을 조합하면 이 과정을 로직으로 대체할 수 있습니다. 이 글에서는 WordPress 카테고리 자동 분류를 구현하는 전체 흐름을 단계별로 정리합니다.
WordPress REST API로 카테고리를 다루는 방식

WordPress는 기본적으로 REST API를 내장하고 있습니다. 별도 플러그인 없이도 /wp-json/wp/v2/posts, /wp-json/wp/v2/categories 같은 엔드포인트로 게시물과 카테고리 데이터를 주고받을 수 있습니다.
카테고리 자동 분류에 필요한 API 엔드포인트는 크게 두 가지입니다.
GET /wp-json/wp/v2/categories— 사이트에 등록된 카테고리 목록과 ID를 가져옵니다.POST /wp-json/wp/v2/posts/{id}— 특정 포스트의 카테고리를 수정합니다.
인증은 Application Password(워드프레스 5.6 이상에서 기본 제공)를 사용하는 것이 가장 간단합니다. WordPress 관리자 → 사용자 → 프로필 → 애플리케이션 비밀번호에서 생성할 수 있습니다. 생성된 비밀번호는 한 번만 표시되므로 즉시 저장해 두어야 합니다.
Application Password 생성 위치 (관리자 → 프로필 하단)
Python으로 카테고리 자동 분류 로직 구성하기
분류 로직의 핵심은 포스트 제목 또는 본문에서 키워드를 추출하고, 그 키워드가 어떤 카테고리에 해당하는지 매핑하는 것입니다. 복잡한 머신러닝 없이 키워드 기반 규칙만으로도 충분히 동작합니다.
전체 흐름은 다음과 같습니다.
- WordPress REST API로 카테고리 ID 목록을 가져옵니다.
- 분류 대상 포스트 목록을 가져옵니다.
- 포스트 제목·내용을 기반으로 카테고리를 판단합니다.
- REST API로 해당 포스트에 카테고리 ID를 업데이트합니다.
아래는 기본 구조 예시입니다.
import requests
from requests.auth import HTTPBasicAuth
WP_URL = "https://yourdomain.com"
USER = "your_username"
APP_PASSWORD = "xxxx xxxx xxxx xxxx xxxx xxxx"
auth = HTTPBasicAuth(USER, APP_PASSWORD)
# 카테고리 목록 가져오기
def get_categories():
res = requests.get(f"{WP_URL}/wp-json/wp/v2/categories", auth=auth)
return {cat['name']: cat['id'] for cat in res.json()}
# 포스트 카테고리 업데이트
def update_post_category(post_id, category_ids):
data = {"categories": category_ids}
res = requests.post(
f"{WP_URL}/wp-json/wp/v2/posts/{post_id}",
json=data,
auth=auth
)
return res.status_code
APP_PASSWORD는 공백 포함 그대로 사용합니다. 공백을 제거하면 인증 오류가 발생합니다.
키워드 기반 분류 규칙 설계하기
분류 규칙은 딕셔너리(dictionary) 형태로 관리하는 것이 가장 직관적입니다. 카테고리명을 키(key)로, 해당 카테고리에 해당하는 키워드 목록을 값(value)으로 넣습니다.
CATEGORY_RULES = {
"AI 도구": ["ChatGPT", "Claude", "Gemini", "프롬프트", "LLM"],
"자동화": ["n8n", "Make", "자동화", "워크플로우", "API"],
"블로그 운영": ["SEO", "키워드", "블로그", "포스팅", "콘텐츠"],
"Python": ["Python", "파이썬", "스크립트", "코드"],
}
def classify_post(title, content, categories):
text = title + " " + content
matched = []
for cat_name, keywords in CATEGORY_RULES.items():
if any(kw in text for kw in keywords):
if cat_name in categories:
matched.append(categories[cat_name])
return matched if matched else [categories.get("미분류", 1)]
키워드가 하나도 매칭되지 않으면 WordPress 기본 카테고리인 ‘미분류(ID: 1)’로 넘깁니다. 규칙은 사이트 구조에 맞게 직접 수정해서 사용합니다.
키워드 → 카테고리 ID 매핑 흐름
WordPress 카테고리 자동 분류 전체 실행 코드
위 함수들을 조합하면 전체 자동 분류 스크립트가 완성됩니다.
# 전체 포스트 목록 가져오기 (페이지당 최대 100개)
def get_all_posts():
posts = []
page = 1
while True:
res = requests.get(
f"{WP_URL}/wp-json/wp/v2/posts",
params={"per_page": 100, "page": page, "status": "publish"},
auth=auth
)
batch = res.json()
if not batch:
break
posts.extend(batch)
page += 1
return posts
# 실행
categories = get_categories()
posts = get_all_posts()
for post in posts:
title = post['title']['rendered']
content = post['content']['rendered']
cat_ids = classify_post(title, content, categories)
status = update_post_category(post['id'], cat_ids)
print(f"Post {post['id']} → {cat_ids} ({status})")
실행하면 터미널에 포스트 ID, 적용된 카테고리 ID, HTTP 상태 코드(200이면 성공)가 출력됩니다.
주의사항과 한계
이 방식을 실제 운영에 적용하기 전에 확인해야 할 사항이 있습니다.
| 항목 | 내용 | 대응 방법 |
|---|---|---|
| 403 오류 | Application Password 권한 부족 또는 REST API 비활성화 | 보안 플러그인에서 REST API 차단 여부 확인 |
| 카테고리 ID 불일치 | 사이트마다 카테고리 ID가 다름 | get_categories()로 사전에 ID 확인 필수 |
| 키워드 중복 매칭 | 하나의 포스트가 여러 카테고리에 동시 분류됨 | 우선순위 규칙 추가 또는 단일 매칭으로 제한 |
| HTML 태그 포함 본문 | content에 HTML 태그가 섞여 키워드 추출 정확도 저하 | BeautifulSoup으로 태그 제거 후 처리 |
특히 Wordfence나 iThemes Security 같은 보안 플러그인을 사용 중이라면 REST API 엔드포인트 접근을 차단하는 경우가 있습니다. 403 오류가 나온다면 플러그인 설정부터 확인하는 것이 순서입니다.
분류 완료 후 터미널 출력 예시
키워드 분류 로직을 LLM으로 대체하는 방향
단순 키워드 매칭은 빠르고 예측 가능하지만, 키워드가 없는 문맥적 표현은 잡아내지 못합니다. 분류 정확도를 높이려면 분류 단계에서 LLM API(OpenAI, Claude 등)를 호출해 포스트 제목을 넘기고 카테고리를 추천받는 방식으로 확장할 수 있습니다.
예를 들어 OpenAI API를 사용한다면 프롬프트를 이렇게 구성합니다.
prompt = f"""
다음 블로그 포스트 제목을 보고 아래 카테고리 중 가장 적합한 것 하나만 골라주세요.
카테고리 목록: {list(categories.keys())}
포스트 제목: {title}
카테고리명만 출력하세요.
"""
LLM 기반 분류는 정확도는 높지만 API 호출 비용이 발생합니다. 포스트 수가 많을 때는 키워드 분류로 1차 필터링 후, 미분류된 항목만 LLM에 넘기는 혼합 방식이 효율적입니다.
자주 묻는 질문
Q. WordPress.com에서도 이 방법을 사용할 수 있나요?
WordPress.com 무료·개인 요금제는 REST API 외부 접근이 제한됩니다. Business 요금제 이상이거나 WordPress.org(자체 호스팅) 환경에서만 동작합니다.
Q. 이미 카테고리가 지정된 포스트도 덮어쓰이나요?
update_post_category()는 기존 카테고리를 덮어씁니다. 기존 분류를 유지하면서 추가만 하려면 먼저 현재 카테고리 ID를 읽어온 다음 합쳐서 전송해야 합니다.
Q. Python 없이 구현할 방법은 없나요?
n8n이나 Make(구 Integromat) 같은 노코드 자동화 도구에서도 WordPress REST API 노드를 지원합니다. 코드 없이 비슷한 흐름을 구성할 수 있지만, 복잡한 분류 규칙을 다루기에는 Python 스크립트가 더 유연합니다.
WordPress 카테고리 자동 분류는 구조 자체는 단순합니다. REST API로 데이터를 가져오고, 규칙에 따라 카테고리를 골라서, 다시 API로 업데이트하는 세 단계입니다. 키워드 규칙이 정교할수록 정확도가 올라가고, 그래도 부족하면 LLM을 붙이면 됩니다. 코드 한 번 짜두면 이후 포스트 분류에 계속 재사용할 수 있습니다.
썸네일: Markus Winkler on Unsplash