修正: 2009/11/16 16:45(いろいろ書き直しました)
前回の処理の続きです。
initData内の3つの処理を見るシリーズで、今回は3つめのutmzの処理(キャンペーンに関する部分)です。
- 新規セッションなのかどうか(utma, utmb, utmc)
- utmvの処理(setVar, setCustomVar)に関する所
- utmzの処理(referrerを、どうutmzに組み込むか) (この記事)
他の回と同様に、Ga.jsのコードを追います。(変数名は、私の独自定義です)
initData()の中で、
campaignManager = new Z.Camp(
b.domainhash, b.modifiedreferrer, b.time, defaultvalues);
という感じで、utmzを扱うオブジェクトを作っておいて、
b.Ta = campaignManager.cc(b.cookiemanager, b.isNewSession)
cookie全体の操作を扱うオブジェクトと,1の新規セッションかどうかを判定したフラッグ変数を引数に、メソッドを実行します。
返値は、””, utmcr=1, utmcn=1です。キャンペーンに関係なければ、””, nがnew campaignで、rがrepeart campaignだと思います。
それで、campaingManager.cc(b.cookiemanager, b.isNewSession)の動きです。
いろいろな条件分岐で、referrerとcookienのutmzの部分を見て、キャンペーンに関係のあるセッションか? 関係あるなら、新規キャンペーンか既存か?を判定しています。
最終的に、その判定を返り値で、メインのAPIを操作するオブジェクトのプロパティに返して、データ送信時に使います。
条件としては、以下の状態return “”になります。(3パラメータ条件=”id, source, gclid”のいずれかがある)
- pageTracker._linkのタイプで飛んだ先の場合、既にキャンペーンがあれば、return “”
- 3パラメータ条件を満たすけど、urlのパラメータにnooverride=1が入っていたら、return “”
- sourceに検索エンジンの値を入れる。このとき、無視するキーワード(自分host名とかにaddIgnoredOrganicで設定)なら、return “”
- 検索エンジンの値が無い+新規セッションの場合、sourceに参照サイトを入れる。無視する参照元なら、return “”
- 参照元もない+新規セッション+utmzの蓄えがない場合、sourceをDirectとする。
- 3パラメータ条件に当てはまらない場合には、return “”
で、上の条件で、return “”とならなかった場合には、
- (新規セッション Or utmzの値とreferrerからの値にズレ) の時、utmcn=1を返す
- それ以外は、utmcr=1を返す
という作業になります。
これで、initDataの3つの処理は終わりになります。
その後、trackePageviewなら、特殊処理をして、requestを飛ばす作業に入るし、他の設定系のAPIの場合は、値を返したり、Setしたりする作業に移っています。
コードにつけたメモを付けておきます。(中身はあまり信用しないで下さい、指摘してもらえるとありがたいです)
//initDataで呼ばれるもの
//return "" or "&utmcn=1" or "&utmcr=1"
//arguments g=>"cookiemanager, h=>"isNewVisit?"
cmp.cc = function (cookiemanager, newsession) { //?, h
var k = "",
n = "-",
r, a = 0,
d, l, domainhash = cmp.c;
if (!cookiemanager) return "";
l = cookiemanager.getCookieStr(); //lにcookie値を入れる
k = cmp.getSearchTerm(dfvls.a["location"]); //kにはsearchが入る
//_linkで遷移してきて、validataに通った場合
if (dfvls.allowLinker && cookiemanager.verify()) {
n = cookiemanager.na(); //utmzに関する値が、cookiemanager内変数のutmzArにあるか?
//linkで飛んだ先に、既存のcampaignがあれば、return ""
if (!NoVl(n) && !GaIndexOf(n, ";")) { //nに値があり、;がきちんとあれば、
cookiemanager.Ga(); //utmzの値をcookieに書き込み
return ""; //campaignには関係なしと
}
}
n = Q(l, "__utmz=" + domainhash + ".", ";"); //nには今までのcookieにあるutmzが入る
r = cmp.setAndGetDataHolder(k); //rに$.Camp.DataHolderオブジェクトがはいる, kはlocation.searchパ\\
ラメータ
//nooverride=1の時
if (cmp.L(r)) {
k = Q(k, dfvls.utm_nooverride + "=", "&"); //nooverrideの値を取得
if ("1" == k && !NoVl(n)) return ""; //1で utmzに値があれば、""
}
//無視する検索ワードの場合に return ""
if (!cmp.L(r)) { //id, source, gclidのどれもない
r = cmp.setOrganic(); //new Z.Camp.DataHolder()が入る
if (!NoVl(n) && cmp.isIgnoredTerm(r)) return ""; //追加の無視キーワードであれば
}
//新規セッションなら、referrerを調査して、無視する検索キーワードならreturn ""
if (!cmp.L(r) && newsession) {
r = cmp.setReferral(); //referralをsetしたcmp.DataHolderが入る
if (!NoVl(n) && cmp.isIgnoredRef(r)) return ""; //無視する参照元なら、""
}
//新規セッションで、cookieが""なら直接参照をset
if (!cmp.L(r)) if (NoVl(n) && newsession) r = cmp.setDirect(); //utmzが空なら、直接参照
//directでsetしたなら、return ""
if (!cmp.L(r)) return "";
//utmzに値があれば、referrerのものと比較
if (!NoVl(n)) {
//a [ <domainhash><birth-time><num_of_session><num_of_camp> + csr]
a = n.split(".");
d = new Z.Cmp.DataHolder;
d.setValueFromStr(a.slice(4).join("."));//utmzのutmc値から、dオブジェクトに値をset
d = ToLower(d.getStr()) == ToLower(r.getStr()); //dオブジェクトの値を文字列化して、比較
a = a[3] * 1; //aにはキャンペーンセッション回数
}
if (!d || newsession) {//cookieとreferrerが違うか、newsessionなら
//utmaの値を取得
newsession = Q(l, "__utma=" + domainhash + ".", ";");
//最後の"."の場所を取得
l = newsession.lastIndexOf(".");
//session回数を取得 l>9にならない場合があるのか? domain-hashが1でも、session-idがあるし?
newsession = l > 9 ? GaSubstr(newsession, l + 1) * 1 : 0;
a++; //campain-counterを++
//0を1に。他はそのまま
newsession = 0 == newsession ? 1 : newsession;
//referrerからの値で、cookiemanagerに値をSet
cookiemanager.wb([domainhash, cmp.timenow, newsession, a, r.getStr()].join("."));
cookiemanager.Ga(); //書き込み
return "&" + "utmcn=1";
} else return "&" + "utmcr=1"; //repeartの場合は、utmzは変更しない
};
};