情報科学屋さんを目指す人のメモ

方法・手順・解説を書き残すブログ。私と同じことを繰り返さずに済むように。

AdSenseの収益最大化を支援するWordPressプラグインを開発しました

AdSense (3) WordPress (80) WordPressテーマ (7) WordPressプラグイン (26)

AdSenseの収益を最大化を支援する、WordPressプラグインを作成しました。「結局、AdSenseの最適化って、テストしか信じられないよね」が原点の、テストサイクル支援プラグインです。本プラグインは、複数用意したテーマデザインそれぞれの収益効率を AdSense Management API で取得し、それに基づいてアクセスの振り分け比率を自動調節する機能(Thompson Samplingアルゴリズム)を提供します。また、その前段階である、既存テーマの複製と編集をサポートする機能(テーマDiff機能や、高機能エディタ搭載など後述)も同時に提供します。

「とりあえず試しにやってみよう」という、「気楽なデザイン変更実験」を促します。現在WordPressでテーマ編集をしている人が、特別な知識を増やさずに利用できる形態を目指しているので、独自のテーマ差分の記述や、コードの埋め込みを必要としません。その辺りは、積極的に自動化しています。

did2-ab-testing-auto-split

※GitHubからダウンロードできるようにしておきます(did2/did2-ab-testing - GitHub)。ただし、私以外が利用することを考慮した検証をするほど需要があるのか、まだ測りかねています。そのため、実際に利用するに際しては、自分で解決する心と、WPプラグインおよびAdSenseに関する経験と知識、および、何より強い人柱願望と自己責任意識に基づき、期待せず利用してください

プラグインが実現する「テーマデザイン最適化ワークフロー」

本プラグイン「did2 A/B Testing」は、次のようなテストサイクルの実現を支援します。

did2-ab-testing-workflow

  • (1) 現在利用中のテーマの改善案について仮説を立てる
  • (2) テーマを複製する
    • コピー機能
    • 自動命名機能
    • style.cssのテーマ名自動書き換え機能
  • (3) 複製したテーマを編集する
    • 高機能エディタ(AceEditor)提供
    • Diff機能
  • (4) テーマごとの収益効率情報に基づく「アクセスの振り分け比率自動調節機能」を用いて、両者を比較実験する
    • 広告コードへのAdSense Custom Channel動的埋め込み機能
    • AdSense Management API 連携機能
    • 振り分けアルゴリズム実装
  • (1)へ戻る

管理画面サンプル

↓振り分け画面やツールなどは、この1つの「テーブル」に集約されています。

did2-ab-testing-main-table

↓「どのデザインが良いのか」の選択は、「アクセスの振り分け比率自動調節機能」が、「振り分け比率」という形で「選択」してくれます(*手動設定機能もあります)。
did2-ab-testing-ratio-sample

このテストサイクルの支援を通じて本プラグインは、テーマ最適化の効率化および、デザイン変更時の収益維持監視を支援します。

例:コピー機能

後述しますが、各ツールが、ワークフロー全体をサポートします。

例えば、テーマの複製作業は、メインのテーブルから、2クリックでできます。

↓「Copy」をクリックします
did2-ab-testing-duplicate-theme

↓するとコピー用の設定がテーブル内に出現するので、そこで「New」をクリックします
did2-ab-testing-duplicate-theme-new-button

「とりあえず試しにやってみよう」を支援する

このテストサイクルは、大雑把な話、「とりあえず試しにやってみよう」を効率良くできることが大きなポイントです

結局、収益の上がるデザインはよくわからない。だからテストしよう、という中で、「テストをしていたせいで大損をした」を避けたいのです。

いろいろ試す中で最終的にうまいテーマにたどり着けば、勝手に、見張っていなくてもどんどん振り分けパーセントが増え、収益は向上します。

デザイン変更の「気楽さ」を生み出す

この「気楽さ」こそ自動化の成果であり、この自動化の結果得た「気楽さ」を、その分実際のデザイン案の考案や分析・実装に注ぐことで、収益性が高まることを期待します。「収益を逃さない」を自動でやってくれる振り分け機構が大活躍です。

また、そもそもこの「振り分けパーセントの決定」は難問であり、昔から研究されていた背景と成果があるため、それを生かさない手はありません

特徴

このプラグインには、設計時に意識した、以下の特徴があります。

WordPressと統合されたメカニズム

ワークフローが極力WordPress内で完結するように設計しています。そのため、当然形式は「WordPressプラグイン」です。

アクセスの振り分けもWordPress内部で実施するため、WordPressの挙動に適した振り分けを実施できます。

振り分け関連のデータも外部保存せず、WordPressのAPI経由でWordPressに保存しています。

このように、WordPress本体との親和性を重視しています。

コードの埋め込み不要

テーマに、専用のコードを埋め込む必要がありません

これもWordPressとの統合を意識した結果です。プラグイン側が頑張って必要箇所(広告コード)を書き換えたり、デザインの振り分けをします。

テーマがプラグインに依存しない

プラグインを削除しても、テーマが利用不能になったりしない設計を意識しています。

テーマにまつわる「新しい記述」の習得を要求しない

A/Bテストツールでは、テーマの変更部分(カスタマイズ部分)のみを記述する場合がありますが、did2 A/B Testingでは、その方式を採用していません。

差分の記述方法などの新しい知識不要で、今まで同様にテーマを編集できるように、単なる「複製」を編集する方式を採用しています。

フロー全体をサポートする

振り分け機能単体だけでなく、振り分け機構を利用するにあたって便利なツールまで提供します。

基本的な自動振り分けの仕組み

基本画面や基本ツールは、1つのテーブルにまとめてあります。

did2-ab-testing-main-table

Custom Channel IDによる連携

左のピンクの枠で、テーマ(=テンプレート)に関する操作や設定ができます。

その中でも重要なのがAdSenseの「Custom Channel ID」の設定です。

各行が1つのテーマに対応しており、各テーマにAdSenseの「Custom Channel ID」を設定できます

「Custom Channel」は通常、AdSenseの管理画面で広告をグルーピングして、収益を個別に確認する機能です。

しかし実は「Custom Channel」は、AdSenseの管理画面だけでなく、実際の広告表示JavaScriptにおいて、動的に設定することが可能*なので、それを利用して、テンプレート毎にCustom Channelを変更しテーマ毎の収益の集計を実現しています。

*AdSenseの広告コードを書き換えてはいけない、と思い込んでいる人も多いと思いますが、実際にはいくつかの例外規定があり、Custom Channelの動的設定もそのひとつです(参照:https://support.google.com/adsense/answer/1354736?hl=ja

テーマに対して「Custom Channel ID(AdSenseの管理画面で作成、確認可能)」を設定すると、テーマ内のAdSense表示用のコードが全置換(テーマファイルの置換ではなく、テーマPHP実行後の出力をバッファして、最終表示直前に置換)され、そのCustom Channel IDが動的に指定されます(※これが正しく動作しない場合や、より複雑なことをしている場合には、直接的にテーマ内で「did2_ab_testing_adsense_custom_channel()」関数を呼び出すと、設定されているCustom Channel IDが取得できます)

これにより、テーマごとの収益情報を収集できるようにします。

振り分け機構

複数のテンプレートにアクセスを振り分ける際には、各アクセスについて振り分け先を選択(計算)し、各アクセスに対してテンプレートの設定を上書きしています(did2-ab-testing.php:function did2_ab_testing_setup_theme())。

この振り分け先の決定には、現在「手動」と「Thompson Samplingアルゴリズム」を実装してあるのですが、現在、手動の設定は基本的に使用されず、Thompson Samplingアルゴリズムを使用したAdSenseの収益性(RPM)に基づく振り分けが有効になっています(※手動設定が0%のテーマには一切振り分けない)

※1)本ブログは、リバースプロキシ(nginx)を使用したキャッシュを導入しているため、1回の振り分けが繰り返し使用されるため、もとからキャッシュを考慮した(前提にした?)実装になっています。

※2)実は、このあたりにはかなり考えるべき点が多く、改善と検証が必要な部分です(後述)。

※3)各種アルゴリズムについては、「多椀バンディット問題」で調べてみてください。自分も今回はじめて真剣に調べ、論文を読んだりしました。

AdSenseのレポート表示

こうして各テンプレートに振り分けられたアクセスによる収益は、テーブルの右側の水色の枠内に表示されます。

各テンプレートに、実際に何PVが振り分けられ(AdSenseベース)、何回クリックされ、1000PVあたり何円の収益になったのか(RPM)などが確認できます

これで、WordPressの管理画面とAdSenseの管理画面をにらめっこする必要はありません。

テーマファイル編集を支援する「便利機能」

did2 A/B Testingは、振り分け機構が中心となりますが、振り分け機構を使用したワークフロー全体の支援を目的としています

そのため、いろいろな「便利」機能を搭載しています。

WordPressの管理者であれば、共感してもらえる機能がいろいろあるのではないかと思います

テーマコピー機能

既存のテーマとの比較を実現するもっとも無難な方法が、テーマフォルダ丸ごとの複製です。

did2 A/B Testingでは、管理画面で簡単に実施できる「コピー機能」を搭載しています。

単なる「コピー」のようで、名前を考えるのが面倒なので「日付を末尾に付ける」「すでに日付が末尾にあれば上書きする」という自動命名機能を搭載し、テーマファイルの「style.css」に記載する「Theme Name」の自動上書きまで行い、テーマ実装者がテーマ編集にすぐ取り掛かれるように支援します。

Diff機能

「このテンプレート(テーマ)、どこを変えたんだっけ?」を知るために、まずDiff機能が実装されています

Diff機能は単独でも使用できますが、先ほどの管理画面のテーブルから操作できます。

Diffを実施したいテーマの「Diff」ボタンをクリックすると、Diffの相手を選択する「Diff(B)」ボタンが表示されるので、いずれかをクリックすると、選択した2つのテーマのDiffが実施される、というUIを実装してみました。

did2-ab-testing-diff-buttons

テーマは複数ファイルから構成されるため、変更のあるファイルの表示に始まり、変更箇所のDiff表示までが閲覧できます

did2-ab-testing-diff-result

高機能エディタ(AceEditor)

WordPressのテーマ編集画面は、それほど強力ではありません。

しかしだからといって、サーバーにコンソールからログインして高機能なエディタを使う、というのはハードルが高いですし、出来る人は以前からそうしていたかもしれません。

そこで本プラグインでは、ブラウザ経由の手軽さと、ある程度の機能を実現することを目的に、GitHubのコードエディタなどでも採用されている高機能エディタAceEditorを使用したバージョンの編集画面を搭載しました。

did2-ab-testing-ace-editor
↑左がdid2 A/B Testingのエディタ、右がWordPress純正エディタ。

シンタックスハイライトはもちろんのこと、行番号表示機能(エラーが出た時に大事)、検索置換機能、エラー表示機能など、WordPressに標準にはないけれど、あったら絶対使いたいような便利機能を搭載しています。

※標準のエディタを上書きせず、あくまで追加にとどめているため、トラブル時などには、標準エディタを引き続き利用可能です。また、極力標準エディタのコードを流用し、機能や挙動を保つようにしています。

※実は、本来必要のないプラグインエディタを、本プラグインを開発するために、開発しました。つまり、did2 A/B Testingプラグインは、did2 A/B Testingプラグインのプラグインエディタで作成されています。そのため、現状ではプラグインエディタのほうが、さらに高機能になっています(変更があったかどうかを表示する機能、php -lで文法チェックする機能、他のタブ経由ですでに上書きされていないかをチェックする機能、そもそも自己上書きに伴うプラグインの停止を乗り切るためのトリッキーな実装など)。

管理者向けテーマ設定

管理者がアクセスした際に表示するテンプレートを別途設定することができます。

did2-ab-testing-admin-theme

デザインの編集作業中の、表示確認に便利です。

メモ機能

「このテンプレート、どうして作ったんだっけ?」など、テンプレートについての説明を記しておく「メモ」機能が例の「テーブル」に搭載されています。

デバッグ情報表示機能

設定ページのタイトルの横にある「[v]」をクリックすると、通常非表示の、デバッグ用の文字列が表示されます。不具合発生時に原因を特定するために使用してください。

AdSense連携の導入方法概要

AdSense連携をしなくても使えるため、連携作業は必須ではありません。

連携をしていない状態でdid2 A/B Testingの画面を開くと、AdSense連携の部分に、連携手順が表示されます

did2-ab-testing-how-to-connect-adsense

手順は大きく分けて2つに分かれています。

Google Developer ConsoleでClient ID と Client Secretを取得する

まず、google developers consoleにアクセスし、新しいプロジェクトを作成します。

そして、Native Applicationを選択して「Client IDとClient Secret」を取得し、それらの値を連携画面に入力して、一度「Save Client ID and Client Secret」を設定します。

Access Codeを取得する

ここまでで、did2 A/B Testingが、あなたのアプリになりました(なったような状態)。

そうしたら、そのアプリと、あなたのAdSenseアカウントを連携させるためのURLが発行されます(auth pageのリンクをクリック)。

すると、ジャンプ先のページで認証ボタンをクリックすることで、「Access Code(とりあえず表示されたコード)」が取得できるので、それをコピペして、「Save Access Code」をクリックします。

成功すれば、AdSense連携がスタートします。

まずは、テンプレート用の「Custom Channel ID」を設定してみてください。とりあえずアクセスを回さずとも、Custom Channel IDの登録名くらいは取得できます。

メモ

AdSenseのテスト機能との違い

AdSenseにも「テスト」という名前の機能がありますが、あの機能は各広告デザイン、つまり、広告そのもののデザインをテストするものなので、レイアウトなど、広告の外側を含めた部分をテストすることはできません。

Analyticsのウェブテスト機能との違い

Analyticsには、「ウェブテスト」という、今回の目的に近い機能がありますが、あくまでWordPressを使用したワークフローを回す、という目的では、プラグイン化してWordPressの管理画面内に一体化されて、流儀が統一されていることが大切だと思っています。

ウェブテスト機能には、テストコードの追加や、バリエーションごとのURLを用意するなど、もともとのテンプレートの変更や、URLの用意という特殊な対応が必要であるため、単一LPの検証などであればよいのですが、WPのようなブログだと少々使いにくいです。

今後取り組むべき課題

今後取り組むべき課題はいろいろあります。

アルゴリズムの調達

もっとも大きな問題は、AdSenseの特徴・性質に合わせたアルゴリズムの設計(or調達)・実装です。

現在採用しているアルゴリズムは、収益率が台(テーマ)毎に固定されている、つまり時間変化しないことを前提にしているため、現実と異なります。

そのため、現状では、直近n日間のデータを元に算出する、という方法をとっているのですが、変化に敏感にするために短くすべきか、傾向を見るために長くすべきなのか、など、迷う点が多いです。

テスト

そもそも各種機能がちゃんと動作するのか、というのは要検証です。ただし、検証用に広い範囲でいろいろする、というのはものすごく大変でモチベーションも維持しにくいので、あくまで「自分の需要ドリブン」で、重要な機能を絞って(気が向いた時に)開発したいと思います。

注意事項

冒頭にも書きましたが、人柱用です。また、そもそも、他の人の環境ちゃんと動くかわかりません。もしかしたら、ものすごく自分の環境に依存した何かを埋め込んでしまっている可能性すらあります。

また、動作させるまでに、大きな工夫や、.phpの編集が必要かもしれません。

この辺りを理解した上で、自己責任&自己解決力を強く意識できる人のみ、使用してみてください。

※別のWP環境だとか、別のAdSenseアカウントだとかを用意するのが大変、というのが根底にあります。

資料

アップデート履歴&仕様メモ

2015.05.20 新しいthemeを追加した時に、channelのpv数が0で、TSの振り分け対象になってくれない。なので、pvが1000以下のうちは、manual modeに切り替えるようにした。実際に1000pvになったとしても、adsenseのレポートは反映に遅れがあるので、pvが多いサイトではmanual modeの終了が1000pvを大きく上回る可能性があるので、覚えておくこと。

コメント(0)

新しいコメントを投稿