6

Sitecore Analytics 中营销活动的默认行为是,仅当活动应用于访问的第一页时,它们才会应用于访问。这可能是使用该营销活动或通过sc_camp查询字符串参数标记的登录页面。

我发现这种行为在某些商业场景中有些问题。它也不同于 Google Analytics 处理营销活动的方式。如果用户通过不同的营销活动重新进入网站, Google Analytics 将为用户开始新的访问。

我想在我正在处理的 POC 中模拟 Sitecore Analytics 中的这种行为。我已经通过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();
        }
    }
}
4

6 回答 6

2

正如您所写,默认情况下,只有在访问中触发的第一个活动被分配给它(在Sitecore.Analytics.Pipelines.StartTracking.ProcessQueryString内)。如果您需要更新与访问关联的活动,您可以连接到triggerCampaign管道并手动设置值。

public class AlwaysSetCampaignId : TriggerCampaignProcessor
{
    public override void Process(TriggerCampaignArgs args)
    {
        // Set the campaign ID to the current visit
        Sitecore.Analytics.Tracker.CurrentVisit.CampaignId = args.Definition.ID.ToGuid();
    }
}

不会创建新的访问,但会更改与当前访问关联的 CampaignId。

我已经在 SC 7.2 中成功地对此进行了一些测试,但您需要更彻底地测试它,因为它正在修改默认行为。

于 2014-07-08T12:35:13.447 回答
1

我有一个类似的问题。一些解决方案: 1. 如果您确实希望在活动已触发时触发个性化规则。执行以下操作(这可以从我提出的支持票 407150 中看到):

  1. 转到“/sitecore/system/Settings/Rules/Definitions/Elements/Visit/Campaign was Triggered”并复制此项目
  2. 在复制的项目中,将文本更改为例如“在当前访问期间曾经触发过 [CampaignId,Tree,root=/sitecore/system/Marketing Center/Campaigns,specific] 活动的位置”
  3. 在复制的项目中,将类型更改为您自己的类和您自己的程序集
  4. 使用条件类创建新程序集,如下例所示:

    公共类 HasCampaignAtAllCondition : WhenCondition where T: RuleContext { private Guid CampaignGuid { get; 放; } 公共字符串 CampaignId { 获取;放; } protected override bool Execute(T ruleContext) { Assert.ArgumentNotNull(ruleContext, "ruleContext"); 尝试 { this.CampaignGuid = new Guid(this.CampaignId); } catch { Log.Warn(string.Format("Could not convert value to guid: {0}", this.CampaignId), base.GetType()); 返回假;} return Tracker.Visitor.DataSet.PageEvents.Any(row => row.PageEventDefinitionId == new Guid("{F358D040-256F-4FC6-B2A1-739ACA2B2983}") && row.Data == this.CampaignId); }
    }

如果您想重置访问,则可以查看以下内容:

if (HttpContext.Current.Request.Cookies["SC_ANALYTICS_GLOBAL_COOKIE"] != null)
{
    if (!string.IsNullOrEmpty(HttpContext.Current.Request.Cookies["SC_ANALYTICS_GLOBAL_COOKIE"].Value) && QueryStringHelperFunctions.GetQueryStringBool(HttpContext.Current.Request.QueryString, "forcenewvisitor", false))
    {
        HttpContext.Current.Response.Cookies["SC_ANALYTICS_GLOBAL_COOKIE"].Value = "";
        HttpContext.Current.Response.Cookies["SC_ANALYTICS_SESSION_COOKIE"].Value = "";
    }
}

此处对此进行了更详细的介绍:http ://www.sitecore.net/Community/Technical-Blogs/Charlie-Darney/Posts/2014/06/Sitecore-Project-Create-Reset.aspx

老实说 Tracker.EndVisit(true); 应该做的伎俩,它使访问cookie无效,如果你添加true它会使访问者无效,但你必须小心你调用它的地方,因此处理器和按钮方法在这里。

于 2014-07-07T16:52:54.163 回答
1

这尚未经过彻底测试,但当我更改sc_camp查询字符串值时,它似乎正在使用相应的 CampaignId 在 Visits 表中创建新记录。基本上,我CreateVisit从管道处理器中删除了该方法Sitecore.Analytics.Pipelines.InitializeTracker.Initialize(以及其他几个用于支持的私有方法 - 啊,私有方法!)。

不是非常优雅,但它似乎确实有效,尽管它可能需要一些更多的条件检查来确定何时创建新访问。我把这个处理器放在Sitecore.Analytics.Pipelines.InitializeTracker.Initialize processor.

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();

        Visitor visitor = Tracker.Visitor;
        CreateNewVisit(HttpContext.Current, visitor);
    }

    protected virtual void CreateNewVisit(HttpContext httpContext, Visitor visitor)
    {
        VisitorDataSet.VisitsRow currentVisit = visitor.CurrentVisit;
        if ((currentVisit == null) || (currentVisit.VisitId != visitor.CookieVisitId))
        {
            currentVisit = visitor.CreateVisit(visitor.CookieVisitId);
        }
        currentVisit.AspNetSessionId = WebUtil.GetSessionID();
        HttpRequest request = httpContext.Request;
        byte[] ip = GetIp(request.UserHostAddress ?? string.Empty);
        string majorName = request.Browser.Browser;
        string minorName = request.Browser.Version;
        string version = request.Browser.Version;
        string str4 = request.Browser.Platform;
        string str5 = string.Empty;
        string str6 = string.Empty;
        currentVisit.Ip = ip;
        currentVisit.Browser = visitor.DataContext.GetBrowser(majorName, minorName, version);
        currentVisit.UserAgent = visitor.DataContext.GetUserAgent(request.UserAgent ?? string.Empty);
        currentVisit.GeoIp = visitor.DataContext.GetGeoIp(ip);
        currentVisit.Location = visitor.DataContext.GetLocation(string.Empty, string.Empty);
        currentVisit.RDNS = request.UserHostName ?? string.Empty;
        currentVisit.OperatingSystem = visitor.DataContext.GetOperatingSystem(str4, str5, str6);
        currentVisit.Screen = visitor.DataContext.GetScreen(GetDimensions(request));
        currentVisit.DeviceName = (Sitecore.Context.Device == null) ? string.Empty : Sitecore.Context.Device.Name;
        currentVisit.Language = Sitecore.Context.Language.Name;
        SiteContext site = Sitecore.Context.Site;
        if (site != null)
        {
            currentVisit.MultiSite = site.Name;
        }
        var args = new CreateVisitArgs(currentVisit, request);
        CreateVisitPipeline.Run(args);
    }

    protected virtual byte[] GetIp(string userHostAddress)
    {
        IPAddress address;
        if (IPAddress.TryParse(userHostAddress, out address))
        {
            return address.GetAddressBytes();
        }
        Log.Warn("Failed to parse ip address: " + userHostAddress, this);
        return new byte[4];
    }

    protected virtual string GetDimensions(HttpRequest request)
    {
        HttpBrowserCapabilities browser = request.Browser;
        if (browser == null)
        {
            return string.Empty;
        }
        return string.Format("{0}x{1}", browser.ScreenPixelsWidth, browser.ScreenPixelsHeight);
    }
}
于 2014-07-08T15:47:29.490 回答
0

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

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

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

根据我的测试,只要广告系列 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 = "";
        }

    }
}
于 2014-07-14T23:16:55.270 回答
0

您是否尝试过在 cookie 上调用 Invalidate() 以及 InvalidateVisitorCache()?

于 2014-07-07T15:46:17.837 回答