【コピペOK】GoogleAdSenseの自動広告を自作したら収益が上がった

【コピペでOK】GoogleAdSenseを文字数と見出し数から適切に本文内へ自動挿入する

Google Adsenseの自動広告、僕も一定期間使ってみた。

レポートを見る限り「クリック率」や「クリック単価」もそこまで悪くはないものの、もしこれがすべてレクタングル(大)orレスポンシブの広告だったら単純に収益は上がるなと気付いた。

※僕は、ディスプレイ広告はすべてPCとスマホでそれぞれレクタングル(大)とレスポンシブとで「is_mobile()関数」を使って完全に分岐させてます。cssもこれを利用しています。詳細は以下の記事をどうぞ。

しかも、もしそれが文と文の間ではなくすべて適切な位置に表示されたらクリック率もかなり増加が見込めるだろうなとも思った。

追記

2019/1/30:今は表示させている広告ユニットは色々変更しています。自動広告で使う広告ユニットを好きに設定できるのも今回のメリットだと思っています。

今回得られる利点

今回作ったこの機能を利用するとどういうメリットがあるのかまとめてみました。自動広告を使っている状態なら、たぶんほとんどの人に当てはまるはず。

  • 文中での表示はなくなるので、読者を阻害しない
  • 文中での表示だと「文を読み進めたい」ので視線は広告をスルーしがちだが、見出しの前で一息ついたときなら広告に目が留まりやすくなる
  • 表示が行われる見出しレベルはh2だけなので、話の途中や段階的に見出しを潜っている途中に表示されたりすることもない
  • (主にPC表示の場合)表示される広告サイズが「横長でかつ左に画像、右にテキスト」という訴求力イマイチなパターンが多く、サイズも少し珍しいので広告主も少なくクリック単価が伸び悩む。が、レクタングル(大)とレスポンシブにすることで最大限の収益性にできる
  • 自動広告は広告過多の印象がある(個人差はあります)けど、これを抑制できる。広告掲載率をこのためにいじってしまうとAdsense全体に影響があるのもまた悩ましいところ
  • 結果、クリック率とクリック単価どちらも増加が見込める

などなど嬉しい事だらけ、のはず。

実施前の状況

元々どういう状態だったのかの説明です。

自動広告の設定

はじめに、自動広告で使用していた広告タイプの紹介。

広告タイプON/OFF備考
ディスプレイ広告OFFここをONにしているとヘッダーやサイドバーなどいたる所で暴発する。
インフィード広告ONトップページの記事一覧などで溶け込むやつ。
記事内広告ON今回の話の対象。
関連コンテンツOFF通常の関連コンテンツをカスタマイズして使っているので、自動広告では必要ない。
アンカー広告OFF押し間違いを誘発させているような気がして好きではないし、いかにもな広告感があるので使っていない。
モバイル全画面広告OFF→ONユーザビリティうんぬんっていうレベルじゃないでしょうこれ!個人的にはこんなのが表示されたサイトはブラックリスト行きです。
※ブラックリスト行きとか言いつつ、モバイル全画面広告は色々調べた結果今はONにしています。ユーザビリティを低下させないようにしつつ(個人の体感とデータから)、収益は上がっています。
アンカー広告は一度ONにして確かに目に見えて収益は上がったものの、やっぱりユーザーからしたら「うざい」のでやめました。Chromeだと如実にブラウザの挙動も悪くなります。

僕も昔は記事内に手動でタグ打ちをしながら広告ユニットを表示させていたけど、上限数3の撤廃も伴って記事内はすべて自動広告に頼るようにしていた。

ついでなので「ディスプレイ広告」のところについてもちょっと説明。

自動広告を試しに使い始めてみて「なんでもかんでもとにかく広告が出まくる」と言ってすぐに使用をやめる人は、たぶんみんなここがONになっているからだと予想しています。

  • 「ヘッダー内に横長の広告が勝手に入ってきた」
  • 「ラージスカイスクレイパーが表示されちゃった」

とか言っているのは100%そうです。

スマホの台頭もそうだし、そもそもサイドバーはあまり収益が見込めないというのが最近のトレンドなので、記事内以外で自動広告に頼る必要はそもそもないです。

インフィード広告と関連コンテンツは問題なく溶け込む系なので基本的にはONでいいと思う。

実施後の状況

現在どのように広告が表示されているかの説明です。関数の仕様の説明に近いです。

  • 個別投稿ページでのみ動作
  • PCとスマホで使用する広告ユニットを分けている(分けなくすることもできます)
  • 表示する広告数は本文中のプレーンテキストの文字数によって決まります(決定された広告表示数とh2タグのバランスが悪い場合は自動で少なめ方向に調整されます)
  • 拾う見出し数はh2の数
  • それらによってなるべく本文を等分するような場所(に最も近いh2見出しの前)に0個~3個広告が入る
  • 配置しようとした広告の上となりが画像や動画などの場合は表示しない(ポリシー違反回避)
  • 最初のh2と最後のh2前には表示されません(最初のh2前は既になんらかの広告を置いている人が多いため / 最後の見出しは「まとめ」など文章量も少ないし、記事下に別の広告があることが多いため)

こんな感じです。

挿入位置のイメージは下図のような感じ。
文字数によって広告数が決まり(最大3個)、一番近くのh2の前に入り込むようになってます。

ads-position-char-number

上限数3に関しては、のちのちちょっと増やすかもしれないです。たとえば僕の記事でも、細かい項目紹介記事とかだと多いもので見出し数:75とかいっちゃうので、たしかに3はどうなのかなって気はしています。
上限数は4にしました。広告の数は文字の量によって決まる仕様にしたため問題はなくなった。それと、いくら本文量が多くても1ページに記事内広告が5個以上というのはユーザビリティの観点から検討対象外です。

再び上限数は3に変更。AdSenseレポートとたくさんにらめっこした結果です。実際は最後の見出し前は非表示にしたりする関係上、3個出ることはほぼないです。広告は「出しゃいい」ってもんじゃないので、これくらいがちょうどいいはず。

実装する

下記コードをfunction.phpの好きなところに貼り付けるだけ。広告コードは7行目と11行目のコメント部分に挿入してください。
※「is_mobile()」を実装していない方がいる場合を考慮して下記ソースは「wp_is_mobile()」になっています。なんのことか分からない方は気にしないでそのままコピペしておk。

function ads_unit($content){ 
    if(!is_single()){ 
        return $content; 
    }else{ 
        if(wp_is_mobile()){
            $adsCode=<<<EOC
            /***ここに広告コード(スマホ)を挿入***/
            EOC; 
        }else{
            $adsCode=<<<EOC
            /***ここに広告コード(PC)を挿入***/
            EOC; 
        } 
        $plainText = get_the_content();
        $plainText = wp_strip_all_tags( $plainText );
        $plainText = strip_shortcodes( $plainText );
        $cntPlainText = mb_strlen($plainText,"utf-8");
        $cntText = mb_strlen($content,"utf-8");
        if($cntPlainText <= 1500){ //この文字数以下は広告を表示しない
	    return $content;
        }if($cntPlainText > 3000){ //この文字数より多いと広告を1つ表示
            $cntAds = 1;
        }if($cntPlainText > 7200){ //この文字数より多いと広告を2つ表示
            $cntAds = 2;
        }if($cntPlainText > 11800){ //この文字数より多いと広告を3つ表示
            $cntAds = 3;
        }
        $ad_h = mb_substr_count($content, "<h2");
        $ad_h = $ad_h - 2;
        $dmt  = '<h2';
        if($cntAds > $ad_h){
            if($ad_h <= 0){
		return $content;
            }else{
                $cntAds = $ad_h;
            }
        }
        $cntH2Chara = array();
        $ii = 0;
        for($i=0 ; $i<$ad_h+2 ; $i++){
            $cntH2Chara[$i] = mb_strpos($content, '<h2', $ii, "utf-8");
            $ii = $cntH2Chara[$i]+3;
        }
        if($cntAds == 1){
            $temp = $cntText / 2;
            $vancle = 0;
            for($j=0 ; $j<$ad_h+2 ; $j++){
                if($temp < $cntH2Chara[$j]){
                    $vancle = $j;
                    break;
                }
            }
            $vancle_max = $vancle;            
            if($vancle == 0){
                $vancle++;
            }elseif($vancle == 1) {
                $vancle++;
                if($vancle_max == $vancle){
		    return $content;
                }
            }
            $pos = array($vancle);
        }elseif($cntAds == 2){
            $temp  = $cntText / 3;
            $temp2 = $temp *2;
            $vancle = 0;
            for($j=0 ; $j<$ad_h+2 ; $j++){
                if($temp < $cntH2Chara[$j]){
                    $vancle = $j;
                    break;
                }
            }
            if($vancle == 0){
                $vancle++;
            }elseif($vancle == 1) {
                $vancle++;
            }
            $result1 = $vancle;
            $vancle = 0;
            for($j=0 ; $j<$ad_h+2 ; $j++){
                if($temp2 < $cntH2Chara[$j]){
                    $vancle = $j;
                    break;
                }
            }
            $result2 = $vancle;
            if($result1 == $result2){
                $result2++;
            }
            if($result2 == $ad_h+2){
                $pos = array($result1);
            }else{
                $pos = array($result1 , $result2);
            }
        }elseif($cntAds == 3){
            $temp  = $cntText / 4;
            $temp2 = $temp  *2;
            $temp3 = $temp2 *1.5;
            $vancle = 0;
            for($j=0 ; $j<$ad_h+2 ; $j++){
                if($temp < $cntH2Chara[$j]){
                    $vancle = $j;
                    break;
                }
            }
            if($vancle == 0){
                $vancle++;
            }
            $result1 = $vancle;
            $vancle = 0;
            for($j=0 ; $j<$ad_h+2 ; $j++){
                if($temp2 < $cntH2Chara[$j]){
                    $vancle = $j;
                    break;
                }
            }
            $result2 = $vancle;
            if($result1 == $result2){
                $result2++;
            }
            $vancle = 0;
            for($j=0 ; $j<$ad_h+2 ; $j++){
                if($temp3 < $cntH2Chara[$j]){
                    $vancle = $j;
                    break;
                }
            }
            $result3 = $vancle;
            if($result2 == $result3){
                $result3++;
            }
            if($result3 == $ad_h+2){
                $pos = array($result1 , $result2);
            }else{
                $pos = array($result1 , $result2 , $result3);
            }
        }else{
            return $content;
        }
        $paragraphs=explode($dmt,$content);
        foreach($paragraphs as $pg){
            if($c>=1){ //ポリシー違反回避&見栄えのため、特定の要素下では非表示
                if(mb_substr("$pg", -7)=="/>\n"){ //画像や動画など
                    $c++; 
                    $customContent.=$dmt.$pg; 
                }elseif(mb_substr("$pg", -10)=="rame></p>\n"){ //埋め込み動画などiframe系
                    $c++; 
                    $customContent.=$dmt.$pg; 
                }else{ 
                    if(in_array($c,$pos)){
                        $customContent.=$adsCode.$dmt.$pg; 
                    }else{
                        $customContent.=$dmt.$pg; 
                    }
                } 
            }else{ 
                $customContent.=$pg; 
            } 
            $c++; 
        } 
        return $customContent; 
    } 
} 
add_filter('the_content','ads_unit');
  • PCとスマホで分けるつもりがない方は、5行目から9行目と13行目の } を削除して、残ったPC用広告コードのところに1つ分の広告コードを貼り付ければOK。
  • コメントで注釈してある部分の文字数を変えると、広告数を決定する閾値を変更できます。多すぎ注意。

広告が表示されることを確認したら作業終了です。
※広告ユニットが新規作成したものの場合、表示されるまで10分くらいかかります。
※キャッシュ系のプラグインを使用している場合、変更が反映されないことがあるのでクリアしてください。

↓お役に立てましたらぜひシェアをお願い致します~↓

関連しそうな記事  もうひとついかが?
みるめも

この記事へのコメント  皆様もぜひどうぞ