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

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

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

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

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

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

追記

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

今回得られる利点

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

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

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

実施前の状況

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

自動広告の設定

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

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

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

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

自動広告を試しに使い始めてみて「なんでもかんでもとにかく広告が出まくる」と言ってすぐに使用をやめる人は、たぶんみんなここがONになっているからだと予想しています。「ラージスカイスクレイパーが表示されちゃった」とか言っているのは100%そうです。

スマホの台頭もそうだし、そもそもサイドバーはあまり収益が見込めないというのが最近のトレンドなので、記事内以外で自動広告に頼る必要はそもそもないです。インフィード広告と関連コンテンツは問題なく溶け込む系なので何も考えずONでいいと思う。

実施後の状況

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

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

こんな感じです。

挿入位置のイメージは、下図のような感じ。「見出しの数」となってますけど、あんまり気にしなくていいです(直すのめんどくさい
※実際は文字数によって広告数が決定されていくイメージです

ads-position

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

実装する

下記コードをfunction.phpの好きなところに貼り付けるだけ。
※「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 > 1500){ //この文字数より多いと広告を1つ表示
            $cntAds = 1; 
        }if($cntPlainText > 4500){ //この文字数より多いと広告を2つ表示
            $cntAds = 2; 
        }if($cntPlainText > 8000){ //この文字数より多いと広告を3つ表示
            $cntAds = 3; 
        }if($cntPlainText > 10500){ //この文字数より多いと広告を4つ表示
            $cntAds = 4; 
        } 
        $ad_h = mb_substr_count($content, "<h2");
        $ad_h = $ad_h - 2;
        $opase = '<h2'; 
        if($cntAds > $ad_h){ 
            if($ad_h == 0){ 
                $cntAds = 1; 
            }elseif($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; 
                } 
            } 
            if($vancle == 0){ 
                $vancle++; 
            } 
            $pos = array($vancle+1); 
        }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++; 
            } 
            $result1 = $vancle+1; 
            $vancle = 0; 
            for($j=0 ; $j<$ad_h+2 ; $j++){ 
                if($temp2 < $cntH2Chara[$j]){ 
                    $vancle = $j; 
                    break; 
                } 
            } 
            $result2 = $vancle+1; 
            if($result1 == $result2){ 
                $result2++; 
            } 
            $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+1; 
            $vancle = 0; 
            for($j=0 ; $j<$ad_h+2 ; $j++){ 
                if($temp2 < $cntH2Chara[$j]){ 
                    $vancle = $j; 
                    break; 
                } 
            } 
            $result2 = $vancle+1; 
            if($result1 == $result2){ 
                $result2++; 
            } 
            $vancle = 0; 
            for($j=0 ; $j<$ad_h+2 ; $j++){ 
                if($temp3 < $cntH2Chara[$j]){ 
                    $vancle = $j; 
                    break; 
                } 
            } 
            $result3 = $vancle+1; 
            $pos = array($result1 , $result2 , $result3); 
        }elseif($cntAds == 4){ 
            $temp = $cntText / 5; 
            $temp2 = $temp *2; 
            $temp3 = $temp2 *1.5; 
            $temp4 = $temp3 *1.333; 
            $vancle = 0; 
            for($j=0 ; $j<$ad_h+2 ; $j++){ 
                if($temp < $cntH2Chara[$j]){ 
                    $vancle = $j;
                    break; 
                } 
            } 
            if($vancle == 0){ 
                $vancle++; 
            } 
            $result1 = $vancle+1; 
            $vancle = 0; 
            for($j=0 ; $j<$ad_h+2 ; $j++){ 
                if($temp2 < $cntH2Chara[$j]){ 
                    $vancle = $j; 
                    break; 
                } 
            } 
            $result2 = $vancle+1; 
            if($result1 == $result2){ 
                $result2++; 
            } 
            $vancle = 0; 
            for($j=0 ; $j<$ad_h+2 ; $j++){ 
                if($temp3 < $cntH2Chara[$j]){ 
                    $vancle = $j;
                    break; 
                } 
            } 
            $result3 = $vancle+1; 
            if($result2 == $result3){ 
                $result3++; 
            } 
            $vancle = 0; 
            for($j=0 ; $j<$ad_h+2 ; $j++){ 
                if($temp4 < $cntH2Chara[$j]){ 
                    $vancle = $j; 
                    break; 
                } 
            } 
            $result4 = $vancle+1; 
            $pos = array($result1 , $result2 , $result3 , $result4);
        }else{ 
            return $content; 
        } 
        $paragraphs=explode($opase,$content); 
        foreach($paragraphs as $pg){ 
            if($c>=1){ //ポリシー違反回避&見栄えのため、特定の要素下では非表示
                if(mb_substr("$pg", -7)=="/>\n"){ //画像や動画など
                    $c++; 
                    $customContent.=$opase.$pg; 
                }elseif(mb_substr("$pg", -7)=="table>\n"){ //テーブル(必要ない場合削除可)
                    $c++; 
                    $customContent.=$opase.$pg; 
                }elseif(mb_substr("$pg", -7)=="</pre>\n"){ //ソースコードなど整形テキスト
                    $c++; 
                    $customContent.=$opase.$pg; 
                }elseif(mb_substr("$pg", -10)=="rame></p>\n"){ //埋め込み動画などiframe系
                    $c++; 
                    $customContent.=$opase.$pg; 
                }else{ 
                    if(in_array($c,$pos)){
                        $customContent.=$adsCode.$opase.$pg; 
                    }else{
                        $customContent.=$opase.$pg; 
                    }
                } 
            }else{ 
                $customContent.=$pg; 
            } 
            $c++; 
        } 
        return $customContent; 
    } 
} 
add_filter('the_content','ads_unit');  
  • PCとスマホで分けるつもりがない方は、5行目から9行目と13行目の } を削除して、残ったPC用広告コードのところに1つ分の広告コードを貼り付ければOK。
  • コメントで注釈してある部分の文字数を変えると、広告数を決定する閾値を変更できます。多すぎ注意。
  • 最初の見出し前と最後の見出し前には表示しない設定になっています。前者は多くの人が既に広告や目次等を置いているため、後者は「まとめ節」であることが多く、そこから記事下端までの文章量は少ないことがほとんどであるからです。

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

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

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