smartyでおこなうABテスト(a/b split testing)
PHPからsmartyを呼び出してABテストを行う場合のコード(テンプレート側です)。
基本的には下記のように記述します。
ABテストとは言っていますがこの場合は3パターンのABCテストです。
{assign var=rad value=1|rand:3}
{if $rnd == 1}
<a href="http://www.hoge.jp/?dummy=1">メッセージ1</a>
{elseif $rnd == 2}
<a href="http://www.hoge.jp/?dummy=2">メッセージ2</a>
{else}
<a href="http://www.hoge.jp/?dummy=3">メッセージ3</a>
{/if}
通常は上記のようなコードを書きますが、なぜかsmartyで(1|rand:3)が使えなかった場合の対応です。
PHPのコードの変更はできない前提なので、テンプレート側で乱数を生成して引き渡しています。
↓ 今回は10パターン同時テストです。
{php}$rnd=rand(0,99);$this->assign('rnd',$rnd);{/php}
{if 10 > $rnd }
<a href="http://www.hoge.jp/?dummy=1">メッセージ1</a>
{elseif 20 > $rnd }
<a href="http://www.hoge.jp/?dummy=2">メッセージ2</a>
{elseif 30 > $rnd }
<a href="http://www.hoge.jp/?dummy=3">メッセージ3</a>
{elseif 40 > $rnd }
<a href="http://www.hoge.jp/?dummy=4">メッセージ4</a>
{elseif 50 > $rnd }
<a href="http://www.hoge.jp/?dummy=5">メッセージ5</a>
{elseif 60 > $rnd }
<a href="http://www.hoge.jp/?dummy=6">メッセージ6</a>
{elseif 70 > $rnd }
<a href="http://www.hoge.jp/?dummy=7">メッセージ7</a>
{elseif 80 > $rnd }
<a href="http://www.hoge.jp/?dummy=8">メッセージ8</a>
{elseif 90 > $rnd }
<a href="http://www.hoge.jp/?dummy=9">メッセージ9</a>
{else}
<a href="http://www.hoge.jp/?dummy=10">メッセージ10</a>
{/if}
いったんPHP側で乱数を設定しておいてからsmarty側で条件分岐します。不細工ですがこれで対応出来ます。
結果についてはジャンプ先のURLにgoogleアナリティクス解析とcanonicalタグを入れた上で、アナリティクスで解析します。
今後の課題、または改良としては
新規ユーザーのみにA/Bテストを行なうなどの工夫や、それぞれの表示回数を本格的に均等にするなどがありますが、それらを行う場合はPHP側での工夫が必要ではないかと思います。