如何仅在设置另一个同意 cookie 和 "true" 后设置 Google Analytics cookie?
How to set the Google Analytics cookie only after another consent cookie is set and "true"?
我正在为我的网站和 react-cookie-consent 库使用 React/Nextjs。它会创建一个弹出窗口,用户可以在其中同意 cookie 政策。如果同意,则设置 cookie:CookieConsent,值为 "true".
此外,我想使用 Google Analytics 来跟踪用户是否同意(在弹出窗口中单击“接受”)。
但它不起作用:Google 分析 cookies _ga 和 G_ENABLED_IDPS 是在用户点击弹出窗口之前设置的。
有趣的是,我只是在 Microsoft Edge 浏览器上才意识到这一点。在 Chrome 中,这些 cookie 在用户同意之前不会设置。
这是我在 _document.js 中的当前代码:
<Head>
{/* Global Site Tag (gtag.js) - Google Analytics */}
<script
async
src={`https://www.googletagmanager.com/gtag/js?id=${GA_TRACKING_ID}`}
/>
<script
dangerouslySetInnerHTML={{
__html: `
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
`}}
/>
<script type="text/javascript" src="/static/blockReactDevTools.js" />
<link href="https://fonts.googleapis.com/css?family=Cabin&display=swap" rel="stylesheet" />
</Head>
我尝试使用互联网上的一些提示,想出了这个版本,但它也不起作用:
<Head>
{/* Global Site Tag (gtag.js) - Google Analytics */}
<script
async
src={`https://www.googletagmanager.com/gtag/js?id=${GA_TRACKING_ID}`}
/>
<script
dangerouslySetInnerHTML={{
__html: `
var gtagId = '${GA_TRACKING_ID}';
window['ga-disable-' + gtagId] = true;
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
function getCookie(cname) {
var name = cname + "=";
var ca = document.cookie.split(';');
for(var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length);
}
}
return "";
}
window.addEventListener("load", function() {
var isCookieConsentTrue = getCookie("CookieConsent") == 'true';
if(isCookieConsentTrue){
window['ga-disable-' + gtagId] = false;
alert("Cookie Consent given!");
} else {
alert("Cookie Consent NOT given!");
window['ga-disable-' + gtagId] = true;
}
});
`}}
/>
<script type="text/javascript" src="/static/blockReactDevTools.js" />
<link href="https://fonts.googleapis.com/css?family=Cabin&display=swap" rel="stylesheet" />
</Head>
我不知道这是 nextjs 的特定问题,还是一般的愚蠢问题。
谁能指导我找到可行的解决方案?
编辑:我尝试了建议的 "Universal Analytics" 方法。建议的解决方案使我的帮助函数无法记录事件和网页浏览(见下文)。我还需要 gtag 管理器吗?
您的做法是选择退出。只要客户端请求 gtag.js,GA cookie 就会始终设置。然而,这不符合 GDPR。您应该研究的是选择加入,这样就不会在未经同意的情况下设置 GA cookie。
一般的想法是在客户端同意后异步加载 gtag.js。要获得 gtag 函数的全部功能,如果客户端已经同意,您必须在每次页面加载时加载 gtag.js。执行此操作的最佳做法是在同意时使用 cookieconsent cookie。
为此有一个广泛使用的 js 库,它会生成一个弹出窗口并为您设置 consent-cookie。
参考:
https://www.osano.com/cookieconsent/documentation/javascript-api/
您可以通过单击此处的 开始编码 为 cookie 横幅的布局生成代码:
https://www.osano.com/cookieconsent/download/
https://github.com/osano/cookieconsent/blob/dev/examples/example-7-javascript-api.html
必须在 <head>
部分的每个页面上执行以下代码:
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.1/cookieconsent.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.1/cookieconsent.min.js" data-cfasync="false"></script>
<script>
var popup;
window.addEventListener('load', function(){
window.cookieconsent.initialise({
//set revokeBtn if you don't want to see a tiny pullup bar overlapping your website
//if revokeBtn is set, make sure to include a link to cookie settings in your footer
//you can open your banner again with: popup.open();
//revokeBtn: "<div class='cc-revoke'></div>",
type: "opt-in",
theme: "classic",
palette: {
popup: {
background: "#000",
text: "#fff"
},
button: {
background: "#fd0",
text: "#000"
}
},
onInitialise: function(status) {
// request gtag.js on page-load when the client already consented
if(status == cookieconsent.status.allow) setCookies();
},
onStatusChange: function(status) {
// resquest gtag cookies on a new consent
if (this.hasConsented()) setCookies();
else deleteCookies(this.options.cookie.name)
},
/* enable this to hide the cookie banner outside GDPR regions
law: {
regionalLaw: false,
},
location: true,
},
*/
function (p) {
popup = p;
})
});
//it is absolutely crucial to define gtag in the global scope
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', '${GA_TRACKING_ID}', {'anonymize_ip': true});
function setCookies() {
var s = document.createElement('script');
s.type = "text/javascript"
s.async = "true";
s.src = "https://www.googletagmanager.com/gtag/js?id=${GA_TRACKING_ID}";
var x = document.getElementsByTagName('script')[0];
x.parentNode.insertBefore(s, x);
// you can add facebook-pixel and other cookies here
};
function deleteCookies(cookieconsent_name) {
var keep = [cookieconsent_name, "DYNSRV"];
document.cookie.split(';').forEach(function(c) {
c = c.split('=')[0].trim();
if (!~keep.indexOf(c))
document.cookie = c + '=;' + 'expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/';
});
};
</script>
注:
一旦 consent-cookie 设置为 allow,请确保在每次页面加载时加载 gtag.js。使用 event_callback
查看是否发送了 gtag 事件。您可以在不检查 consent-cookie 的情况下使用 gtag 功能。如果 gtag.js 不存在,它只是向 window.dataLayer
添加元素而没有任何功能。为避免错误,必须在全局范围内和使用前声明 function gtag()
。
// cookie-check is not necessary when gtag is in global scope
//if(popup.hasConsented()) {
gtag('event', 'sign_up', {
'method': 'Google',
'event_callback': function(){alert('event was sent');}
});
//}
您不必发送额外的网页浏览事件,除非您想手动指定路径。 setCookies()
已将当前文档路径与配置一起发送
使用 gtag 的 consent config options。目前,可以在header中的任何数据测量命令(config
或event
)是运行之前放置以下内容:
gtag('consent', 'default', {
'ad_storage': 'denied',
'analytics_storage': 'denied'
});
然后 运行 一旦用户批准或存在同意 cookie:
gtag('consent', 'update', {
'ad_storage': 'granted',
'analytics_storage': 'granted'
});
如果您使用 Facebook Pixel,它的工作方式类似。例如。 fbq('consent', 'revoke');
然后 fbq('consent', 'grant')
.
我正在为我的网站和 react-cookie-consent 库使用 React/Nextjs。它会创建一个弹出窗口,用户可以在其中同意 cookie 政策。如果同意,则设置 cookie:CookieConsent,值为 "true".
此外,我想使用 Google Analytics 来跟踪用户是否同意(在弹出窗口中单击“接受”)。
但它不起作用:Google 分析 cookies _ga 和 G_ENABLED_IDPS 是在用户点击弹出窗口之前设置的。
有趣的是,我只是在 Microsoft Edge 浏览器上才意识到这一点。在 Chrome 中,这些 cookie 在用户同意之前不会设置。
这是我在 _document.js 中的当前代码:
<Head>
{/* Global Site Tag (gtag.js) - Google Analytics */}
<script
async
src={`https://www.googletagmanager.com/gtag/js?id=${GA_TRACKING_ID}`}
/>
<script
dangerouslySetInnerHTML={{
__html: `
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
`}}
/>
<script type="text/javascript" src="/static/blockReactDevTools.js" />
<link href="https://fonts.googleapis.com/css?family=Cabin&display=swap" rel="stylesheet" />
</Head>
我尝试使用互联网上的一些提示,想出了这个版本,但它也不起作用:
<Head>
{/* Global Site Tag (gtag.js) - Google Analytics */}
<script
async
src={`https://www.googletagmanager.com/gtag/js?id=${GA_TRACKING_ID}`}
/>
<script
dangerouslySetInnerHTML={{
__html: `
var gtagId = '${GA_TRACKING_ID}';
window['ga-disable-' + gtagId] = true;
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
function getCookie(cname) {
var name = cname + "=";
var ca = document.cookie.split(';');
for(var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length);
}
}
return "";
}
window.addEventListener("load", function() {
var isCookieConsentTrue = getCookie("CookieConsent") == 'true';
if(isCookieConsentTrue){
window['ga-disable-' + gtagId] = false;
alert("Cookie Consent given!");
} else {
alert("Cookie Consent NOT given!");
window['ga-disable-' + gtagId] = true;
}
});
`}}
/>
<script type="text/javascript" src="/static/blockReactDevTools.js" />
<link href="https://fonts.googleapis.com/css?family=Cabin&display=swap" rel="stylesheet" />
</Head>
我不知道这是 nextjs 的特定问题,还是一般的愚蠢问题。
谁能指导我找到可行的解决方案?
编辑:我尝试了建议的 "Universal Analytics" 方法。建议的解决方案使我的帮助函数无法记录事件和网页浏览(见下文)。我还需要 gtag 管理器吗?
您的做法是选择退出。只要客户端请求 gtag.js,GA cookie 就会始终设置。然而,这不符合 GDPR。您应该研究的是选择加入,这样就不会在未经同意的情况下设置 GA cookie。
一般的想法是在客户端同意后异步加载 gtag.js。要获得 gtag 函数的全部功能,如果客户端已经同意,您必须在每次页面加载时加载 gtag.js。执行此操作的最佳做法是在同意时使用 cookieconsent cookie。 为此有一个广泛使用的 js 库,它会生成一个弹出窗口并为您设置 consent-cookie。
参考:
https://www.osano.com/cookieconsent/documentation/javascript-api/
您可以通过单击此处的 开始编码 为 cookie 横幅的布局生成代码:
https://www.osano.com/cookieconsent/download/
https://github.com/osano/cookieconsent/blob/dev/examples/example-7-javascript-api.html
必须在 <head>
部分的每个页面上执行以下代码:
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.1/cookieconsent.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.1/cookieconsent.min.js" data-cfasync="false"></script>
<script>
var popup;
window.addEventListener('load', function(){
window.cookieconsent.initialise({
//set revokeBtn if you don't want to see a tiny pullup bar overlapping your website
//if revokeBtn is set, make sure to include a link to cookie settings in your footer
//you can open your banner again with: popup.open();
//revokeBtn: "<div class='cc-revoke'></div>",
type: "opt-in",
theme: "classic",
palette: {
popup: {
background: "#000",
text: "#fff"
},
button: {
background: "#fd0",
text: "#000"
}
},
onInitialise: function(status) {
// request gtag.js on page-load when the client already consented
if(status == cookieconsent.status.allow) setCookies();
},
onStatusChange: function(status) {
// resquest gtag cookies on a new consent
if (this.hasConsented()) setCookies();
else deleteCookies(this.options.cookie.name)
},
/* enable this to hide the cookie banner outside GDPR regions
law: {
regionalLaw: false,
},
location: true,
},
*/
function (p) {
popup = p;
})
});
//it is absolutely crucial to define gtag in the global scope
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', '${GA_TRACKING_ID}', {'anonymize_ip': true});
function setCookies() {
var s = document.createElement('script');
s.type = "text/javascript"
s.async = "true";
s.src = "https://www.googletagmanager.com/gtag/js?id=${GA_TRACKING_ID}";
var x = document.getElementsByTagName('script')[0];
x.parentNode.insertBefore(s, x);
// you can add facebook-pixel and other cookies here
};
function deleteCookies(cookieconsent_name) {
var keep = [cookieconsent_name, "DYNSRV"];
document.cookie.split(';').forEach(function(c) {
c = c.split('=')[0].trim();
if (!~keep.indexOf(c))
document.cookie = c + '=;' + 'expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/';
});
};
</script>
注:
一旦 consent-cookie 设置为 allow,请确保在每次页面加载时加载 gtag.js。使用 event_callback
查看是否发送了 gtag 事件。您可以在不检查 consent-cookie 的情况下使用 gtag 功能。如果 gtag.js 不存在,它只是向 window.dataLayer
添加元素而没有任何功能。为避免错误,必须在全局范围内和使用前声明 function gtag()
。
// cookie-check is not necessary when gtag is in global scope
//if(popup.hasConsented()) {
gtag('event', 'sign_up', {
'method': 'Google',
'event_callback': function(){alert('event was sent');}
});
//}
您不必发送额外的网页浏览事件,除非您想手动指定路径。 setCookies()
已将当前文档路径与配置一起发送
使用 gtag 的 consent config options。目前,可以在header中的任何数据测量命令(config
或event
)是运行之前放置以下内容:
gtag('consent', 'default', {
'ad_storage': 'denied',
'analytics_storage': 'denied'
});
然后 运行 一旦用户批准或存在同意 cookie:
gtag('consent', 'update', {
'ad_storage': 'granted',
'analytics_storage': 'granted'
});
如果您使用 Facebook Pixel,它的工作方式类似。例如。 fbq('consent', 'revoke');
然后 fbq('consent', 'grant')
.