在Sitecore Analytics中制作营销广告系列的行为与Google Analytics相同

tec*_*414 6 analytics sitecore sitecore-dms sitecore7 sitecore7.1

Sitecore Analytics中营销广告系列的默认行为是,只有在访问的第一页上应用广告系列时,它们才会应用于访问.这可以是标记有该营销活动的登录页面,也可以是通过sc_camp查询字符串参数.

我发现这种行为在某些商业场景中有些问题.它与Google Analytics处理营销广告系列的方式也不同.如果用户通过其他营销广告重新进入该网站, Google Analytics将为该用户启动新访问.

我想在Sitecore Analytics中模拟我正在处理的POC中的这种行为.我是通过initializeTracker管道尝试过的.我可以成功检测到访问的营销活动的变化,但我无法结束并重新开始访问.我已经尝试过利用Tracker.EndVisit()并只是改变访问的ID.似乎都没有导致与市场营销活动相关的新访问.

有谁知道如何在同一个请求中成功结束上次访问并开始新访问?

我在CMS/DMS 7.1 rev 140130工作.我目前的代码如下.

using System;
using System.Web;
using Sitecore.Analytics;
using Sitecore.Analytics.Pipelines.InitializeTracker;
using Sitecore.Analytics.Web;
using Sitecore.Configuration;
using Sitecore.Data;
using Sitecore.Web;

namespace ActiveCommerce.Training.PriceTesting.Analytics
{
    public class RestartVisitOnNewCampaign : InitializeTrackerProcessor
    {
        public override void Process(InitializeTrackerArgs args)
        {
            if (HttpContext.Current == null)
            {
                args.AbortPipeline();
            }

            //no need to restart visit if visit is new
            if (Tracker.CurrentVisit.VisitPageCount < 1)
            {
                return;
            }

            //look for campaign id in query string
            Guid campaign;
            var campaignStr = WebUtil.GetQueryString(Settings.GetSetting("Analytics.CampaignQueryStringKey")).Trim();
            if (string.IsNullOrEmpty(campaignStr) || !Guid.TryParse(campaignStr, out campaign))
            {
                return;
            }

            //don't restart if the campaign isn't changing
            if (!Tracker.CurrentVisit.IsCampaignIdNull() && Tracker.CurrentVisit.CampaignId == campaign)
            {
                return;
            }

            //Tracker.EndVisit(false);

            //restart visit by setting new ID
            var visitCookie = new VisitCookie();
            visitCookie.VisitId = ID.NewID.Guid;
            visitCookie.Save();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

tec*_*414 0

感谢大家的意见。安德鲁的答案实际上是最接近的,所以我给了他赏金。

最终的问题似乎是Visitor.Settings.IsFirstRequest财产,而财产最终源自VisitCookie.IsFirstRequest。如果此属性为 false,则不会创建新的访问,并且当前页面请求不会与新的访问关联。为了将页面分类为“登陆页面”,这也需要发生这种情况,这会将营销活动与其关联起来。

IsFirstRequest在 中设置VisitCookie.Load(),并将 cookie 中的 ASP.NET 会话 ID 与当前的 ASP.NET 会话 ID 进行比较。这就是为什么使 cookie 无效或更改访问 ID 还不够的原因。不幸的是,无法使用该VisitCookie对象更改会话 ID 值,因此最简单且可行的方法是在处理器运行之前直接清空 cookie 值Sitecore.Analytics.Pipelines.InitializeTracker.Initialize

根据我的测试,只要营销活动 ID 发生更改,就会产生新的访问。Visits我可以在表格中以及根据营销活动 ID 进行个性化时看到这一点。

namespace ActiveCommerce.Training.PriceTesting.Analytics
{
    public class RestartVisitOnNewCampaign : InitializeTrackerProcessor
    {
        public override void Process(InitializeTrackerArgs args)
        {
            if (HttpContext.Current == null)
            {
                args.AbortPipeline();
                return;
            }

            //no need to restart visit if visit is new
            if (Tracker.Visitor.Settings.IsNew || Tracker.Visitor.Settings.IsFirstRequest || Tracker.CurrentVisit.VisitPageCount < 1)
            {
                return;
            }

            //look for campaign id in query string
            Guid campaign;
            var campaignStr = WebUtil.GetQueryString(Settings.GetSetting("Analytics.CampaignQueryStringKey")).Trim();
            if (string.IsNullOrEmpty(campaignStr) || !Guid.TryParse(campaignStr, out campaign))
            {
                return;
            }

            //don't restart if the campaign isn't changing
            if (!Tracker.CurrentVisit.IsCampaignIdNull() && Tracker.CurrentVisit.CampaignId == campaign)
            {
                return;
            }

            var current = HttpContext.Current;
            var cookie = current.Response.Cookies["SC_ANALYTICS_SESSION_COOKIE"];
            if (cookie == null)
            {
                cookie = new HttpCookie("SC_ANALYTICS_SESSION_COOKIE");
                current.Response.Cookies.Add(cookie);
            }
            cookie.Value = "";
        }

    }
}
Run Code Online (Sandbox Code Playgroud)