fix(supporters): 클릭 집계에 호텔·항공 이벤트와 place_id 추가
방금 가져온 Planner.astro 가 호텔·항공 링크에 data-ga="hotel"·"flight" 를 붙이는데 Base.astro 의 리스너가 그 두 값을 다루지 않아 클릭이 집계되지 않았다. 메인 체크아웃의 미커밋 Base.astro 에는 이 처리가 있었고, 그쪽을 버리기 전에 옮겼다. - click_hotel · click_flight 를 리스너에 추가 - data-ga-id 를 place_id 로 함께 보낸다 (어느 장소를 눌렀는지) - 플래너 이벤트와 수술일 미전송 원칙을 주석에 적었다 검증: 뷰 34페이지, 게이트 41/41, check.mjs 오류 0건, tsc 0 에러, 내보내기 0. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
e44ff60537
commit
f26155565c
@ -25,7 +25,9 @@ const other = lang === 'ko' ? 'en' : 'ko';
|
||||
const switchTo = switchHref(Astro.url.pathname, other);
|
||||
const homeHref = lang === 'en' ? '/en' : '/';
|
||||
const isHome = ['/', '', '/index.html', '/index', '/en', '/en/index.html', '/en/index'].includes(Astro.url.pathname.replace(/\/$/, '') || '/');
|
||||
// GA4: site.json 의 ga4MeasurementId(G-XXXX) 가 있을 때만 태그를 넣는다. 키 이벤트는 data/ai_channels.json conversion_events 와 같은 이름(click_tel · click_reservation · click_clinic_site · click_map).
|
||||
// GA4: site.json 의 ga4MeasurementId(G-XXXX) 가 있을 때만 태그를 넣는다. 키 이벤트는 data/ai_channels.json 의 conversion_events 와 같은 이름
|
||||
// (click_tel · click_reservation · click_clinic_site · click_map). 플래너가 붙이는 click_hotel · click_flight 도 같은 리스너가 받는다.
|
||||
// 플래너 전용 이벤트(plan_procedure_select · plan_result · plan_save)는 components/Planner.astro 가 보낸다. 수술일 원본은 보내지 않는다(haewon 결정 2026-09-12).
|
||||
const GA4: string = /^G-[A-Z0-9]{6,}$/.test(String((S as Record<string, any>).ga4MeasurementId ?? '')) ? String((S as Record<string, any>).ga4MeasurementId) : '';
|
||||
// 의료광고 고지는 규정 대상이라 임의로 번역하지 않는다(의료법 56조·추천보증 심사지침).
|
||||
// 병원이 영문 문구를 확정해 site.json 의 sponsorNoticeEn / factSheet 의 sideEffectNoticeEn 에 넣기 전까지는
|
||||
@ -61,7 +63,7 @@ const ld = jsonLd ? JSON.stringify({ '@context': 'https://schema.org', ...(Array
|
||||
{ld && <script type="application/ld+json" set:html={ld} />}
|
||||
{GA4 && <script is:inline async src={`https://www.googletagmanager.com/gtag/js?id=${GA4}`}></script>}
|
||||
{GA4 && <script is:inline set:html={`window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments)}gtag('js',new Date());gtag('config','${GA4}',{anonymize_ip:true});
|
||||
document.addEventListener('click',function(e){var a=e.target.closest&&e.target.closest('a');if(!a)return;var h=a.getAttribute('href')||'';var ev=h.indexOf('tel:')===0?'click_tel':a.dataset.ga==='reservation'||a.classList.contains('cta')?'click_reservation':a.dataset.ga==='clinic-site'?'click_clinic_site':a.dataset.ga==='map'?'click_map':null;if(ev)gtag('event',ev,{link_url:h,page_path:location.pathname});},true);`} />}
|
||||
document.addEventListener('click',function(e){var a=e.target.closest&&e.target.closest('a');if(!a)return;var h=a.getAttribute('href')||'';var g=a.dataset.ga;var ev=h.indexOf('tel:')===0?'click_tel':g==='reservation'||a.classList.contains('cta')?'click_reservation':g==='clinic-site'?'click_clinic_site':g==='map'?'click_map':g==='hotel'?'click_hotel':g==='flight'?'click_flight':null;if(ev)gtag('event',ev,{link_url:h,page_path:location.pathname,place_id:a.dataset.gaId||undefined});},true);`} />}
|
||||
</head>
|
||||
<body>
|
||||
{!INDEXABLE && <div class="sample-banner">{u.sample}</div>}
|
||||
|
||||
@ -25,7 +25,9 @@ const other = lang === 'ko' ? 'en' : 'ko';
|
||||
const switchTo = switchHref(Astro.url.pathname, other);
|
||||
const homeHref = lang === 'en' ? '/en' : '/';
|
||||
const isHome = ['/', '', '/index.html', '/index', '/en', '/en/index.html', '/en/index'].includes(Astro.url.pathname.replace(/\/$/, '') || '/');
|
||||
// GA4: site.json 의 ga4MeasurementId(G-XXXX) 가 있을 때만 태그를 넣는다. 키 이벤트는 data/ai_channels.json conversion_events 와 같은 이름(click_tel · click_reservation · click_clinic_site · click_map).
|
||||
// GA4: site.json 의 ga4MeasurementId(G-XXXX) 가 있을 때만 태그를 넣는다. 키 이벤트는 data/ai_channels.json 의 conversion_events 와 같은 이름
|
||||
// (click_tel · click_reservation · click_clinic_site · click_map). 플래너가 붙이는 click_hotel · click_flight 도 같은 리스너가 받는다.
|
||||
// 플래너 전용 이벤트(plan_procedure_select · plan_result · plan_save)는 components/Planner.astro 가 보낸다. 수술일 원본은 보내지 않는다(haewon 결정 2026-09-12).
|
||||
const GA4: string = /^G-[A-Z0-9]{6,}$/.test(String((S as Record<string, any>).ga4MeasurementId ?? '')) ? String((S as Record<string, any>).ga4MeasurementId) : '';
|
||||
// 의료광고 고지는 규정 대상이라 임의로 번역하지 않는다(의료법 56조·추천보증 심사지침).
|
||||
// 병원이 영문 문구를 확정해 site.json 의 sponsorNoticeEn / factSheet 의 sideEffectNoticeEn 에 넣기 전까지는
|
||||
@ -61,7 +63,7 @@ const ld = jsonLd ? JSON.stringify({ '@context': 'https://schema.org', ...(Array
|
||||
{ld && <script type="application/ld+json" set:html={ld} />}
|
||||
{GA4 && <script is:inline async src={`https://www.googletagmanager.com/gtag/js?id=${GA4}`}></script>}
|
||||
{GA4 && <script is:inline set:html={`window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments)}gtag('js',new Date());gtag('config','${GA4}',{anonymize_ip:true});
|
||||
document.addEventListener('click',function(e){var a=e.target.closest&&e.target.closest('a');if(!a)return;var h=a.getAttribute('href')||'';var ev=h.indexOf('tel:')===0?'click_tel':a.dataset.ga==='reservation'||a.classList.contains('cta')?'click_reservation':a.dataset.ga==='clinic-site'?'click_clinic_site':a.dataset.ga==='map'?'click_map':null;if(ev)gtag('event',ev,{link_url:h,page_path:location.pathname});},true);`} />}
|
||||
document.addEventListener('click',function(e){var a=e.target.closest&&e.target.closest('a');if(!a)return;var h=a.getAttribute('href')||'';var g=a.dataset.ga;var ev=h.indexOf('tel:')===0?'click_tel':g==='reservation'||a.classList.contains('cta')?'click_reservation':g==='clinic-site'?'click_clinic_site':g==='map'?'click_map':g==='hotel'?'click_hotel':g==='flight'?'click_flight':null;if(ev)gtag('event',ev,{link_url:h,page_path:location.pathname,place_id:a.dataset.gaId||undefined});},true);`} />}
|
||||
</head>
|
||||
<body>
|
||||
{!INDEXABLE && <div class="sample-banner">{u.sample}</div>}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user