o2o-infinith-demo/docs/deck/build_wp_geo_deck.py
Haewon Kam 76ec63bc1e feat(discovery): 기준표 v2.0 정식 채택 — 배지·헤더·랜딩 카피·비교 엑셀·덱 v2.0
- aeoGeoRubricV2 status active/2.0, 결과 rubricVersion 2.0. 리포트 헤더는 AEO·GEO 링 2개가 주, v1.0 종합은 보조 표기
- 랜딩: Hero 카피, ABMR 칩(AEO/GEO 목표), SampleReport(두 링 + 축별 8항목 바), Roadmap 제목, HowItWorks를 v2 계산값에서 파생. 발견 칩 수치 v1.1 스냅샷으로 정정
- 비교 엑셀 v2: scripts/build_supporters_v2_compare.ts(점수 계산 TS 단일 원본) → build_supporters_audit_v2_xlsx.py. 공식 AEO 42/GEO 56 · 서포터즈 noindex 상한 40(G1) · 색인 허용 AEO 94/GEO 77
- 덱 v2.0: build_viewclinic_deck_v2_0.py (17장, 표지 배지 v2.0, KPI AEO/GEO, 스코어카드 2장, Method v2.0) + 표준캔버스 + PDF. v1.0·v1.1 파일은 그대로
- docs/AEO_GEO_RUBRIC.md에 v2.0 채택 주석, AEO_GEO_RUBRIC_v2.md 재생성, 리포트 페이지 PDF 재출력

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-07 15:25:00 +09:00

144 lines
12 KiB
Python

"""GEO/AEO 최적화 웹사이트에 워드프레스를 쓰는 것의 장단점 — INFINITH 덱."""
import sys; sys.path.insert(0, "/Users/haewonkam/.claude/skills/infinith-deck/scripts")
from ifd import Deck
d = Deck()
# 01 표지
d.cover(eyebrow="GEO / AEO · PLATFORM DECISION",
title_lines=["WordPress for", "AI Search."],
subtitle="GEO·AEO 최적화 웹사이트에 워드프레스를 쓰는 것의 장단점 · 2026. 08. 28",
meta_right="INFINITH Strategy Memo · 2026")
# 02 요약
s = d.slide(eyebrow="Executive Summary",
title="콘텐츠를 계속 쌓는다면 ", title_accent="워드프레스",
lede=["GEO·AEO의 핵심은 AI 크롤러가 읽는 정적 HTML에 구조화된 사실을 꾸준히 쌓는 것입니다.",
"워드프레스는 이것을 기본으로 해주지만, 플러그인과 테마를 통제하지 못하면 장점이 전부 단점으로 뒤집힙니다."],
section="Summary")
a, b, c = s.cards3(y=s.band_y)
a.chip("결론", "good").title("병원 납품 사이트").text("비개발자가 FAQ 페이지를 직접 늘려야 합니다. 워드프레스 + 경량 테마 + 단일 스키마 플러그인 + 관리형 호스팅.").divider().foot("운영 편의 우선")
b.chip("결론", "info").title("자체 제품 랜딩").text("Astro 또는 프리렌더링된 React. 코드로 스키마와 헤더를 완전히 제어하고, 성능을 최고 수준으로 유지합니다.").divider().foot("제어·성능 우선")
c.chip("결론", "violet").title("확장 단계").text("워드프레스를 헤드리스 CMS로 두고 Astro가 빌드 시 가져와 정적 배포. 운영 편의와 제어를 둘 다 확보합니다.").divider().foot("프로덕트화 대비")
# 03 실측 (다크)
s = d.slide(eyebrow="Why It Matters · INFINITH 실측 2026. 08. 28",
title="JS만 있는 사이트는 ", title_accent="AI에게 안 보인다",
lede="INFINITH 랜딩을 GPTBot, ClaudeBot, PerplexityBot, Googlebot, Yeti로 직접 요청해 받은 본문 단어 수입니다.",
dark=True, section="Evidence")
s.stats3([("4 → 810", "프리렌더 전후 크롤러가 읽는 본문 단어 수. 전에는 title 4단어가 전부였습니다."),
("1.5 MB", "본문을 만들기 위해 실행해야 했던 JS 번들. GPTBot, ClaudeBot은 JS를 실행하지 않습니다."),
("0 → 3", "JSON-LD 스키마 수. Organization, SoftwareApplication, WebSite를 추가했습니다.")])
# 04 요구조건
s = d.slide(eyebrow="What GEO / AEO Requires",
title="플랫폼을 고르기 전에 ", title_accent="세 가지 조건",
lede="어떤 도구를 쓰든 이 세 조건을 통과해야 AI 답변에 인용됩니다. 플랫폼 비교는 이 기준으로만 합니다.",
section="Requirements")
a, b, c = s.cards3(y=s.band_y)
a.icon_square().title("크롤러 가독성").text("서버가 완성된 HTML을 내려줘야 합니다. 본문, 제목 구조, 링크가 JS 실행 없이 응답에 포함되어야 합니다.").divider().foot("SSR 또는 SSG")
b.icon_square().title("구조화 데이터").text("MedicalClinic, Physician, FAQPage, Article JSON-LD가 페이지마다 정확히 하나씩. 중복과 충돌이 없어야 합니다.").divider().foot("Schema.org 단일 소스")
c.icon_square().title("콘텐츠 생산량").text("질문과 답변 쌍을 수십에서 수백 페이지 쌓아야 합니다. 비개발자가 매주 추가할 수 있는 구조여야 합니다.").divider().foot("운영 지속성")
# 05 장점 1
s = d.slide(eyebrow="Advantages · 1 / 2",
title="크롤러 가독성은 ", title_accent="기본으로 통과",
lede="PHP가 완성된 HTML을 내려주므로 별도 작업 없이 본문이 크롤러에 노출됩니다.",
section="Advantages")
a, b, c = s.cards3(y=s.band_y)
a.chip("장점", "good").title("서버 렌더링 기본").text("GPTBot, ClaudeBot, PerplexityBot은 JS를 실행하지 않습니다. 워드프레스 응답에는 본문이 그대로 들어 있습니다. SPA는 빈 div만 보입니다.").divider().foot("추가 작업 0")
b.chip("장점", "good").title("스키마 생태계").text("Rank Math, Yoast, Schema Pro가 MedicalClinic, FAQPage, LocalBusiness JSON-LD를 UI로 생성합니다. robots.txt와 llms.txt도 파일 편집으로 즉시 반영됩니다.").divider().foot("비개발자 운영 가능")
c.chip("장점", "good").title("콘텐츠 생산 속도").text("코 재수술 비용, 눈매교정 회복 기간 같은 질문 페이지를 마케팅 담당자가 에디터에서 직접 추가합니다. ACF로 구조화 필드도 관리됩니다.").divider().foot("주 단위 발행")
# 06 장점 2
s = d.slide(eyebrow="Advantages · 2 / 2",
title="락인 없이 ", title_accent="오픈웹에 남는다",
lede="지금 워드프레스를 골라도 나중에 프론트를 바꿀 수 있고, 네이버와 달리 AI 크롤러가 접근할 수 있는 소유 자산이 됩니다.",
section="Advantages")
L, R = s.cards2(y=s.band_y)
L.chip("장점", "good").title("헤드리스 전환 경로").rows([
("REST API / WPGraphQL", "콘텐츠를 그대로 꺼내 Astro, Next.js 프론트에 연결할 수 있습니다."),
("빌드 시 정적화", "프론트를 바꾸면 성능과 스키마 제어를 코드 수준으로 가져옵니다."),
("이전 비용 낮음", "글, 이미지, 카테고리 구조가 DB에 남아 마이그레이션이 단순합니다."),
])
R.chip("장점", "good").title("오픈웹 소유 자산").rows([
("네이버 자산은 차단됨", "네이버 블로그, 플레이스, 카페는 robots.txt로 AI 크롤러를 전면 차단합니다."),
("자체 도메인은 열림", "워드프레스 사이트는 GPTBot, ClaudeBot이 읽고 인용할 수 있는 유일한 소유 표면입니다."),
("브랜드 신호 축적", "인용될수록 브랜드 언급이 쌓여 다음 답변에도 다시 인용됩니다."),
])
# 07 단점 1
s = d.slide(eyebrow="Disadvantages · 1 / 2",
title="통제 못하면 ", title_accent="성능과 HTML이 무너진다",
lede="테마, 페이지빌더, 플러그인이 쌓이면 크롤러가 읽는 HTML이 지저분해지고 로딩이 느려집니다.",
section="Disadvantages")
a, b, c = s.cards3(y=s.band_y)
a.chip("단점", "critical").title("성능 저하가 기본값").text("페이지빌더와 플러그인 20개면 LCP 4초를 넘기기 쉽습니다. AI Overview는 검색 순위 기반이라 간접 영향이 큽니다.").divider().foot("대책: 경량 테마 + 캐시")
b.chip("단점", "critical").title("HTML 노이즈").text("Elementor, Divi가 만드는 div 중첩 10단계와 인라인 스타일은 AI가 답변 단락을 뽑을 때 노이즈입니다. h2 질문, p 답변 구조가 깨집니다.").divider().foot("대책: Gutenberg만 사용")
c.chip("단점", "critical").title("스키마 중복 충돌").text("Yoast, 테마 내장, FAQ 플러그인이 각자 JSON-LD를 뿌려 Organization이 3개 나오는 경우가 흔합니다. Rich Results 검사에서 오류가 납니다.").divider().foot("대책: 스키마 소스 1개")
# 08 단점 2
s = d.slide(eyebrow="Disadvantages · 2 / 2",
title="보안, 제어, ", title_accent="한국 시장 커버리지",
lede="병원 사이트는 해킹 피해가 브랜드 오염으로 이어지고, 국내 AI 답변은 네이버 자산을 우선 인용합니다.",
section="Disadvantages")
a, b, c = s.cards3(y=s.band_y)
a.chip("단점", "warning").title("보안·유지보수 부담").text("플러그인 취약점으로 해킹당하면 스팸 페이지가 대량 생성되고, 이것이 AI 크롤러에 잡혀 브랜드가 오염됩니다.").divider().foot("대책: 관리형 호스팅")
b.chip("단점", "warning").title("세밀한 제어 한계").text("페이지별 robots 메타, 크롤러별 응답 분기, Edge 캐싱 정책은 커스텀 코드나 Cloudflare에서 처리해야 합니다.").divider().foot("Astro보다 손이 많이 감")
c.chip("단점", "warning").title("한국 시장 특수성").text("네이버 서치어드바이저 등록과 사이트맵 제출을 별도로 해야 하고, 네이버 AI 브리핑은 네이버 자산을 우선 인용합니다.").divider().foot("글로벌 AI에 강함")
# 09 대안 비교 (다크)
s = d.slide(eyebrow="Alternatives",
title="네 가지 선택지, ", title_accent="같은 기준으로",
lede="크롤러 가독성, 운영, 스키마 제어, 성능, 유지보수, 비용. INFINITH 현재 스택(Vite SPA)을 기준선으로 넣었습니다.",
dark=True, section="Alternatives")
w = s.card_wide(y=s.band_y)
w.grid(["기준", "워드프레스", "Astro / Next.js SSG", "Webflow / Framer", "Vite SPA (INFINITH 기존)"],
[["AI 크롤러 가독성", "좋음", "최고", "좋음", "나쁨"],
["비개발자 콘텐츠 운영", "최고", "나쁨", "좋음", "불가"],
["스키마 제어", "플러그인 의존", "코드로 완전 제어", "제한적", "코드로 완전 제어"],
["성능", "관리 필요", "최고", "좋음", "좋음"],
["유지보수", "부담 있음", "낮음", "낮음", "낮음"],
["비용", "낮음", "낮음", "월 구독", "낮음"]],
col_w=[3.5, 3.3, 3.3, 3.3, 3.3], row_h=0.66,
tones=[[None, "good", "good", "good", "critical"],
[None, "good", "critical", "good", "critical"],
[None, "warning", "good", "warning", "good"],
[None, "warning", "good", "good", "good"],
[None, "warning", "good", "good", "good"],
[None, "good", "good", "warning", "good"]])
# 10 추천 구성
s = d.slide(eyebrow="Recommendation",
title="용도에 따라 ", title_accent="세 가지 구성",
lede="한 가지 정답은 없습니다. 누가 콘텐츠를 추가하는지, 얼마나 제어가 필요한지로 정합니다.",
section="Recommendation")
a, b, c = s.cards3(y=s.band_y)
a.icon_square().title("병원 클라이언트 납품").text("워드프레스 + GeneratePress 또는 Kadence + Rank Math 단일 스키마 + WP Rocket 캐시 + 관리형 호스팅. 클라이언트가 FAQ를 직접 추가합니다.").divider().foot("운영 편의 우선")
b.icon_square().title("INFINITH 자체 랜딩").text("Astro 콘텐츠 + React 아일랜드. 현재 Vite SPA에는 프리렌더링을 붙여 크롤러 본문 4단어를 810단어로 이미 끌어올렸습니다.").divider().foot("제어·성능 우선")
c.icon_square().title("하이브리드").text("워드프레스를 헤드리스 CMS로 두고 Astro가 빌드 시 가져와 정적 배포. 클라이언트 수가 늘어나면 이 구성이 프로덕트화에 유리합니다.").divider().foot("확장 단계")
# 11 운영 규칙
s = d.slide(eyebrow="If WordPress · Operating Rules",
title="워드프레스를 쓴다면 ", title_accent="다섯 가지 규칙",
lede="이 규칙을 지키면 장점만 남고, 어기면 단점이 전부 살아납니다.",
section="Rules")
w = s.card_wide(y=s.band_y)
w.bullets([
"플러그인은 10개 이하. 하나 추가할 때마다 LCP와 HTML 크기를 다시 측정합니다.",
"테마는 GeneratePress, Kadence 같은 경량 테마만. Elementor, Divi 같은 페이지빌더는 쓰지 않습니다.",
"스키마 소스는 Rank Math 하나로 통일. 테마 내장 스키마와 별도 FAQ 플러그인의 JSON-LD 출력은 끕니다.",
"본문은 Gutenberg 블록으로 h2 질문, p 답변 구조를 유지합니다. AI는 이 단락 단위로 인용합니다.",
"호스팅은 관리형(WP Engine, Kinsta, Cafe24 매니지드)으로. 보안 패치와 백업을 운영자가 직접 하지 않습니다.",
], size=17.25, step=1.0)
# 12 클로징
d.closing(eyebrow="Next Step",
title_lines=["도구보다 조건이 먼저입니다."],
lede="크롤러 가독성, 단일 스키마, 콘텐츠 생산 구조. 이 세 가지를 통과하는 쪽을 고릅니다.",
cta_primary="병원용 워드프레스 표준 스택 문서화 →", cta_secondary="INFINITH 랜딩 FAQ 스키마 추가",
contact="infinith-demo.vercel.app · team.backstageai@gmail.com")
out = "docs/deck/INFINITH_WordPress_GEO_AEO_장단점.pptx"
d.save(out); print("saved", out)