핵심은 “많이 내보내기”가 아니라, 품질 게이트를 통과한 글만 정해진 시각에 꾸준히 발행하는 것입니다. 이 글은 Google Apps Script(이하 GAS) + OpenAI API + WordPress REST API로 하루 3편을 안정적으로 발행하는 프로덕션 규격을 제시합니다.
개요와 원칙
원칙 2) “표 1개(버퍼 행 포함), FAQ 3개, 태그 10개, 내부링크 2개”를 품질 게이트로 정의합니다.
원칙 3) 발행 실패 대비: 재시도·중복 차단·원클릭 롤백을 내장합니다.
시트 스키마(콘텐츠 대장)
복사-붙여넣기 시 헤더 유실 방지를 위해 첫 행에 숫자 버퍼(1·2·3)를 둡니다.
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| id | status | publish_at(KST) | category | title | slug | keywords | outline | content_html | meta_hash | wp_post_id | log |
| 2025-11-13-01 | ready | 2025-11-13 09:30 | GPT 워크플로우 | 버퍼 행 표 포맷 | buffer-row-table | 표, 복붙, 헤더 | H2/H3 개요 | <h2>...</h2> | abc123... | 생성/검수 로그 |
status: idea/draft/ready/published/error. publish_at은 Asia/Seoul 기준.
비밀 관리와 환경변수
GAS에서 스크립트 속성(PropertiesService)을 사용합니다. 키 예시는 아래와 같습니다.
GAS 핵심 코드(요약)
1) OpenAI로 초안 생성
2) 품질 게이트 검사(정규식 기반 라이트 버전)
3) WordPress로 게시
4) 메인 플로우: 한 건 출고
5) 롤백(최근 게시물 취소/휴지통)
WordPress 게시 API 요점
- 엔드포인트:
/wp-json/wp/v2/posts - 필드:
title,content,status(publish/draft),categories,tags,slug - 인증: JWT 토큰 또는 Application Password 중 택1
- 중복 방지:
?search=로 유사 제목 검색 또는meta_hash를 커스텀 필드로 저장해 비교
품질 게이트(라이트) 규칙
| 1 | 2 | 3 | 4 |
|---|---|---|---|
| 항목 | 합격 기준 | 자동 점검 | 비고 |
| 표 | 최소 1개 | <thead>에 1·2·3 버퍼 확인 | 복붙 호환성 |
| FAQ | 3문항 | H2=FAQ, H3≥3 | 명확한 1-2문장 답 |
| 태그 | 10개 | .tags 또는 “태그:” 문자열 | 카테고리와 중복 지양 |
| 내부링크 | 2개 | href="/" 또는 rel="internal" | 허브-스포크 연결 |
| 길이 | ≈ 1,800단어 | 태그 제거 후 토큰 수 | 요약·예시 포함 |
재시도·중복 방지·롤백
재시도
중복 방지
meta_hash에 제목+슬러그+본문 해시를 저장하고 동일하면 스킵합니다. 필요 시 WP 커스텀 필드(meta)에도 저장해 서버 측에서 2차 확인합니다.
롤백
최근 게시물의 wp_post_id로 DELETE /posts/{id}?force=true 호출. 시트 status를 rolled_back으로 변경합니다.
스케줄러(하루 3편, KST)
Apps Script 프로젝트 설정에서 시간대(Asia/Seoul)로 맞춘 뒤, 3개의 트리거를 생성합니다.
publishOne은 호출당 1건만 처리합니다. 여러 건을 한 번에 내보내고 싶다면 publishBatch(n)를 별도로 구현하세요.
출고 체크리스트(버퍼 행 포함)
| 1 | 2 | 3 | 4 |
|---|---|---|---|
| 구분 | 확인 항목 | 합격 기준 | 메모 |
| 비밀 관리 | API Key/토큰 | 스크립트 속성 사용 | 코드 내 하드코딩 금지 |
| 포맷 | 표/FAQ/태그/내부링크 | 게이트 충족 | 버퍼 행 확인 |
| 스케줄 | 트리거 3개 | 09:30/13:30/17:30 | KST |
| 로그 | 시트 log 필드 | 에러 메시지 기록 | 재현 가능성 확보 |
| 롤백 | 최근 게시물 ID | rollbackLast 동작 | 테스트 1회 |
FAQ
JWT 대신 Application Password를 쓰면?
가능합니다. Authorization: Basic base64(user:app_password)로 교체하고 HTTPS를 강제하세요.
이미지 생성은 제외해도 되나요?
네. 본문 품질 관리가 우선입니다. 이미지가 필요하면 편집 단계에서 수동 삽입을 권장합니다.
초안 품질을 더 올리려면?
브리프(키워드·검색의도·H2/H3)를 시트에 먼저 채우고, 모델에는 “근거/의견 분리, 숫자 예시, 내부링크 앵커”를 명시하세요.
'[2. 공부] > [2.3 AI]' 카테고리의 다른 글
| 다국어 전개: 직역이 아닌 트랜스크리에이션 (0) | 2025.11.21 |
|---|---|
| 다국어 전개: 직역이 아닌 트랜스크리에이션 (0) | 2025.11.17 |
| FAQ 스키마: 검색 노출을 키우는 질문 3개 전략 (0) | 2025.11.15 |
| 🤖 무료 AI 도구 vs 유료 AI 도구 비교: 어떤 것을 선택해야 할까? (1) | 2025.11.13 |
| Yoast 가독성 리듬: 읽히는 문장 규칙과 리라이트 실전 (0) | 2025.11.08 |