- src/data/site.json 신설(매체 이름·로고·홈 큐레이션), factSheet에 kind·areaLabel·transitShort·transitNote·reservationUrl·doctorsUrl·youtube.title 추가
- lib.ts: PENDING('확인 대기')·v()·has()·surface()·editor() 도입, 스키마는 빈 값을 빼고 생성
- 페이지·컴포넌트 15개에서 뷰성형외과 하드코딩 제거, 빈 데이터 empty-state (글 0편·영상 0건·뉴스 0건·이미지 없음)
- 검증: 28페이지 표시 텍스트·구조 지문 이전 빌드와 동일(홈 title 마침표 1건만 정정), JSON-LD 차이는 빈 sameAs 제거뿐
- scripts/export_template.mjs + scripts/template/data(빈 데이터 세트) → templates/supporters-astro (빈 데이터로 10페이지 0오류 빌드, 게이트 통과)
- 게이트 픽스처를 자체 authors로 분리해 템플릿에서도 테스트 통과, 구조 기준선의 글 상세 페이지는 사전순 첫 글로 동적 선택
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
85 lines
7.7 KiB
Plaintext
85 lines
7.7 KiB
Plaintext
---
|
|
// 운영자용 페이지. 병원 담당자·서포터즈·INFINITH가 보는 편집 기준이다. 고객 내비게이션에는 넣지 않고 푸터에서만 연결하며, 색인하지 않는다.
|
|
import Base from '../layouts/Base.astro';
|
|
import { fact, SITE_NAME } from '../lib';
|
|
const site = Astro.site!.toString().replace(/\/$/, '');
|
|
const ld = { '@type': 'WebPage', '@id': `${site}/editorial#page`, name: '편집 기준', url: `${site}/editorial`, inLanguage: 'ko', isPartOf: { '@id': `${site}/#website` }, publisher: { '@type': 'Organization', name: SITE_NAME, url: site } };
|
|
---
|
|
<Base title="편집 기준 (운영자용)" description={`${SITE_NAME} 운영자용 편집 기준. 질문 뱅크, 글 구조, 원천 변환 규칙, 중복 콘텐츠 회피, 구조화 데이터, 발행 전 검사.`} jsonLd={ld} noindex>
|
|
<article class="wrap" style="padding-bottom:4rem">
|
|
<header class="article-head"><div class="eyebrow">Editorial Policy</div><h1 class="serif">Editorial Policy</h1><p style="color:var(--slate-600);margin-top:0.6rem">이 페이지는 병원 담당자, 서포터즈, INFINITH 운영진이 보는 문서입니다. 방문자에게 보이는 소개는 <a href="/about">이 사이트에 대해</a>에 따로 있습니다.</p></header>
|
|
<div class="notice">고객 화면에는 "AI가 인용하는 방식"이나 제작 원칙을 쓰지 않습니다. 방문자는 답을 보러 오지 제작 과정을 보러 오지 않습니다. 이 페이지의 내용은 이 페이지 밖으로 내보내지 않습니다.</div>
|
|
|
|
<h2>1. 왜 이 사이트인가</h2>
|
|
<p>답변엔진(ChatGPT, Perplexity, 네이버 AI 브리핑)은 광고 문장이 아니라 질문에 바로 답하는 단락을 잘라 인용합니다. 병원 홈페이지는 소개 중심이라 그 단락이 없습니다. 이 사이트는 환자 질문에 답하는 단락을 먼저 만들고, 그 답을 원장 영상과 공개 자료로 뒷받침하는 것이 목적입니다.</p>
|
|
|
|
<h2>2. 질문 뱅크</h2>
|
|
<p>질문은 INFINITH가 실측한 환자 질문 뱅크 120문항(카테고리 A~G)에서 고릅니다. 문항 하나가 글 하나이고, 각 글의 문항 번호는 페이지 소스의 <code>data-qb</code> 속성에만 남기고 화면에는 표시하지 않습니다.</p>
|
|
<div class="table-wrap"><table><thead><tr><th>카테고리</th><th>내용</th><th>글 포맷</th></tr></thead><tbody>
|
|
<tr><td>A 병원 소개</td><td>어떤 병원인지, 의료진</td><td>정의문 + 사실 표</td></tr>
|
|
<tr><td>B 방문·예약</td><td>가는 길, 예약, 준비</td><td>체크리스트</td></tr>
|
|
<tr><td>C 선택 기준</td><td>병원·원장 고르는 기준</td><td>기준 표</td></tr>
|
|
<tr><td>D 시술 정보</td><td>수술 방법, 보형물, 회복</td><td>원장 영상 재구성 + FAQ</td></tr>
|
|
<tr><td>E 안전·신뢰</td><td>마취, 실명제, 응급</td><td>사실 나열 + 출처</td></tr>
|
|
<tr><td>F 가격·이벤트</td><td>가격 확인처</td><td>안내만, 금액 미기재</td></tr>
|
|
<tr><td>G 후기·평판</td><td>후기 읽는 곳</td><td>집계 수치 + 링크</td></tr>
|
|
</tbody></table></div>
|
|
|
|
<h2>3. 글 구조</h2>
|
|
<ol>
|
|
<li>H1은 질문형 한 문장.</li>
|
|
<li>첫 블록 "세 줄 요약"에 답을 먼저 쓴다. 답변엔진이 잘라 쓰는 단락이다.</li>
|
|
<li>본문 H2 3~5개. 표는 HTML table. 수치는 단위 포함.</li>
|
|
<li>원장 영상은 글로 재구성하고 원본을 임베드한다. 영상 설명란 텍스트는 복사하지 않는다.</li>
|
|
<li>FAQ 5~8개. 질문 뱅크 문항을 그대로 질문으로 쓴다.</li>
|
|
<li>작성·감수 정보, 참고 자료, 병원 정보 블록, 지원 관계 고지 순으로 닫는다.</li>
|
|
</ol>
|
|
|
|
<h2>4. 원천 변환 규칙</h2>
|
|
<ul>
|
|
<li>홈페이지 문장은 옮겨 적지 않는다. 사실(개원 연도, 층 구성, 진료시간)만 가져오고 문장은 새로 쓴다.</li>
|
|
<li>주소·전화·진료시간·의료진 수는 <code>src/data/factSheet.json</code> 한 곳에서만 가져온다. 화면의 <a href="/clinic">병원 정보</a>도 같은 파일에서 나온다.</li>
|
|
<li>이미지는 병원 공개 자료를 캡처해 쓰되, alt와 캡션은 글 문맥에 맞게 새로 쓰고 출처를 적는다.</li>
|
|
<li>후기 본문은 인용하지 않는다. 의료법 제56조가 광고에서 치료 경험담을 금지하고, 병원 지원을 받는 이 사이트는 광고로 볼 여지가 있다. 집계 수치와 링크만 쓴다.</li>
|
|
</ul>
|
|
|
|
<h2>5. 중복 콘텐츠를 피하는 규칙</h2>
|
|
<div class="table-wrap"><table><thead><tr><th>규칙</th><th>이유</th></tr></thead><tbody>
|
|
<tr><td>홈페이지 문장 40자 연속 일치 검사 후 발행</td><td>구글이 복제 사이트로 분류하거나 홈페이지와 순위를 나눠 갖는 일을 막는다.</td></tr>
|
|
<tr><td>허브(이 사이트)에 먼저 발행, 네이버 블로그는 24시간 뒤 요약 재작성</td><td>네이버 유사문서 판독은 뒤에 올라온 비슷한 글을 뺀다. 발행 순서가 원본 판정이다.</td></tr>
|
|
<tr><td>모든 페이지에 자기 참조 canonical</td><td>같은 글이 다른 주소로 복제돼도 원본이 한 곳으로 모인다.</td></tr>
|
|
<tr><td>홈페이지에 없는 정보 유형을 중심으로</td><td>준비 체크리스트, 회복 일정, 비교표, FAQ는 홈페이지가 다루지 않는 영역이다.</td></tr>
|
|
</tbody></table></div>
|
|
|
|
<h2>6. 구조화 데이터</h2>
|
|
<div class="table-wrap"><table><thead><tr><th>타입</th><th>용도</th></tr></thead><tbody>
|
|
<tr><td>Article + MedicalWebPage</td><td>글 본체. dateModified 필수</td></tr>
|
|
<tr><td>FAQPage</td><td>FAQ 블록</td></tr>
|
|
<tr><td>Person (author)</td><td>서포터즈. 확정 후 sameAs로 본인 SNS 연결</td></tr>
|
|
<tr><td>Physician (reviewedBy)</td><td>감수 원장. 감수 완료 상태에서만 넣는다. 감수 예정에 넣으면 허위 표기다</td></tr>
|
|
<tr><td>MedicalClinic (about)</td><td>{fact.shortName}. 홈페이지·유튜브·강남언니 sameAs</td></tr>
|
|
<tr><td>VideoObject</td><td>임베드 영상</td></tr>
|
|
</tbody></table></div>
|
|
|
|
<h2>7. 발행 전 검사</h2>
|
|
<p>정적 HTML로 빌드해 크롤러가 자바스크립트 없이 전문을 읽습니다. 빌드 뒤 <code>scripts/check.mjs</code>가 다음을 검사하고 하나라도 실패하면 배포하지 않습니다.</p>
|
|
<ol>
|
|
<li>JSON-LD 문법과 글 페이지의 Article/FAQPage 존재</li>
|
|
<li>모든 이미지의 alt</li>
|
|
<li>금칙 표현. 치료 결과를 단정하는 말, 부작용을 부정하는 문장, 최상급 병원 표현, 1인칭 경험담 어투. 목록은 <code>scripts/check.mjs</code>의 BANNED 배열에 있다</li>
|
|
<li>페이지당 H1 1개</li>
|
|
<li>홈페이지 문장 40자 연속 일치</li>
|
|
</ol>
|
|
<p>샘플 단계에서는 사이트 전체를 noindex로 두고, 이 페이지는 정식 오픈 뒤에도 noindex를 유지합니다.</p>
|
|
|
|
<h2>8. 고객 화면과 운영자 설명의 경계</h2>
|
|
<p>다음 표현은 고객 화면(홈, 글, 영상, 뉴스룸, 병원 정보, 소개)에 쓰지 않습니다.</p>
|
|
<ul>
|
|
<li>답변엔진, AI 인용, AEO/GEO, 질문 뱅크, QB 번호, INFINITH 실측</li>
|
|
<li>"홈페이지 문장을 복사하지 않습니다", "단일 원본", "수집 기준", "API 집계" 같은 제작 과정 설명</li>
|
|
<li>법 조문 번호. 고객에게는 "다른 환자의 경험담을 싣지 않습니다"까지만 말하고 이유는 한 문장으로 줄인다</li>
|
|
</ul>
|
|
<p>고객 화면에 남기는 것은 환자 보호 문구뿐입니다. 감수 상태, 참고 자료, 병원 지원 관계, 부작용 고지.</p>
|
|
</article>
|
|
</Base>
|