คำตอบสั้น ๆ: ตั้งแบนเนอร์ขอความยินยอมคุกกี้ที่ใช้งานได้จริง ทั้งการแยกประเภทคุกกี้ การหยุดสคริปต์ติดตามก่อนได้รับความยินยอม และการเก็บหลักฐาน
คู่มือนี้อธิบาย WordPress ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
พระราชบัญญัติคุ้มครองข้อมูลส่วนบุคคลกำหนดให้การเก็บข้อมูลส่วนบุคคลต้องมีฐานทางกฎหมายรองรับ สำหรับเว็บไซต์ คุกกี้ที่ใช้ติดตามพฤติกรรมเพื่อการตลาดและการวิเคราะห์ต้องได้รับความยินยอมก่อน
คู่มือนี้เป็นแนวทางทางเทคนิคในการทำให้เว็บ WordPress ขอความยินยอมอย่างถูกต้อง ประเด็นสำคัญที่สุดและถูกทำผิดบ่อยที่สุดคือ แบนเนอร์ที่ขึ้นมาแต่สคริปต์ติดตามทำงานไปแล้วตั้งแต่ก่อนผู้ใช้กดยินยอม ซึ่งไม่ต่างจากไม่มีแบนเนอร์เลย
หมายเหตุ เอกสารนี้อธิบายวิธีตั้งค่าทางเทคนิค ไม่ใช่คำแนะนำทางกฎหมาย ควรให้ที่ปรึกษากฎหมายตรวจสอบนโยบายขององค์กร
สิ่งที่ต้องเตรียม (WordPress)
- สิทธิ์ผู้ดูแล WordPress
- รายการคุกกี้และสคริปต์ติดตามทั้งหมดที่เว็บใช้อยู่
- นโยบายความเป็นส่วนตัวที่ผ่านการตรวจสอบแล้ว
ขั้นตอนที่ 1: สำรวจว่าเว็บใช้คุกกี้อะไรบ้าง
เปิดเว็บในโหมดไม่ระบุตัวตน กด F12 เปิดเครื่องมือนักพัฒนา ไปที่แท็บ Application แล้ว Cookies
จดทุกตัวพร้อมแยกประเภท
- จำเป็น คุกกี้ที่ขาดไม่ได้ เช่น
PHPSESSID,wordpress_logged_in_,woocommerce_cart_hashประเภทนี้ไม่ต้องขอความยินยอม - วิเคราะห์ เช่น
_ga,_gidของ Google Analytics ต้องขอความยินยอม - การตลาด เช่น
_fbpของ Facebook Pixel และคุกกี้โฆษณา ต้องขอความยินยอม - ความชอบ เช่น การจำภาษาที่เลือก ต้องขอความยินยอมในกรณีทั่วไป
ตรวจสคริปต์ภายนอกที่โหลดด้วย
curl -s https://example.com | grep -oE 'src="https?://[^"]+"' | grep -v example.com | sort -u
ขั้นตอนที่ 2: ติดตั้งปลั๊กอินจัดการความยินยอม
wp plugin install complianz-gdpr --activate
# หรือ
wp plugin install cookie-law-info --activate
เลือกตัวที่รองรับ Google Consent Mode เพราะเป็นกลไกที่ทำให้สคริปต์ของ Google หยุดเก็บข้อมูลจนกว่าจะได้รับความยินยอมจริง
ขั้นตอนที่ 3: หยุดสคริปต์ติดตามก่อนได้รับความยินยอม
นี่คือหัวใจของเรื่องทั้งหมด วิธีที่ถูกต้องคือไม่โหลดสคริปต์เลยจนกว่าผู้ใช้จะยินยอม
// ใน mu-plugins ไม่โหลด GA จนกว่าจะมีความยินยอม
add_action('wp_head', function () {
if (!isset($_COOKIE['cookie_consent_analytics'])
|| $_COOKIE['cookie_consent_analytics'] !== 'yes') {
return;
}
?>
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXX"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-XXXX', { anonymize_ip: true });
</script>
<?php
}, 1);
หากใช้ Google Tag Manager ให้ใช้ Consent Mode แทน ซึ่งโหลดสคริปต์ได้แต่ตั้งสถานะเป็นปฏิเสธไว้ก่อน
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
// ตั้งค่าเริ่มต้นเป็นปฏิเสธทุกอย่าง ต้องอยู่ก่อนโค้ด GTM
gtag('consent', 'default', {
ad_storage: 'denied',
ad_user_data: 'denied',
ad_personalization: 'denied',
analytics_storage: 'denied',
functionality_storage: 'granted',
security_storage: 'granted',
wait_for_update: 500
});
</script>
เมื่อผู้ใช้กดยินยอม ให้ส่งการอัปเดต
gtag('consent', 'update', {
analytics_storage: 'granted',
ad_storage: 'granted'
});
ขั้นตอนที่ 4: ออกแบบแบนเนอร์ให้ถูกหลัก
สิ่งที่ต้องมี
- ปุ่ม ยอมรับทั้งหมด และ ปฏิเสธทั้งหมด ที่เด่นเท่ากัน การทำปุ่มปฏิเสธให้จางหรือซ่อนไว้ถือว่าไม่ถูกต้อง
- ปุ่ม ตั้งค่า ให้เลือกเปิดปิดรายประเภท
- ลิงก์ไปยังนโยบายความเป็นส่วนตัว
- ไม่ตั้งค่าเริ่มต้นเป็นยินยอม ทุกช่องที่ไม่ใช่คุกกี้จำเป็นต้องเริ่มจากไม่ติ๊ก
- วิธีถอนความยินยอมได้ตลอดเวลา เช่น ปุ่มลอยที่มุมจอ
ห้ามใช้รูปแบบที่บังคับให้ยินยอม เช่น ปิดแบนเนอร์ไม่ได้จนกว่าจะกดยอมรับ หรือทำให้ขั้นตอนปฏิเสธซับซ้อนกว่าการยอมรับหลายเท่า
ขั้นตอนที่ 5: เก็บหลักฐานการให้ความยินยอม
กฎหมายกำหนดให้พิสูจน์ได้ว่าได้รับความยินยอมเมื่อใดและในเงื่อนไขใด ปลั๊กอินที่ดีจะบันทึกให้ โดยเก็บ
- วันเวลาที่ให้ความยินยอม
- ประเภทที่ยินยอม
- เวอร์ชันของนโยบายที่แสดงตอนนั้น
- ตัวระบุแบบไม่ชี้ตัวบุคคล
ตรวจว่าปลั๊กอินเก็บ Log จริง และตั้งระยะเวลาเก็บให้สอดคล้องกับนโยบายขององค์กร
wp db tables | grep -i consent
wp db query "SELECT COUNT(*) FROM wp_cmplz_statistics;"