*この記事にはアフィリエイトリンクが含まれてます。
XREAL研究所の記事だけ、Google AdSenseの自動広告を止めたかった。
研究所内は手動広告ショートコード運用に切り替え始めていたので、そこだけは静かにしておきたかったのだが、これが思ったより手強かった。
AdSense側の除外設定を触っても消えない。テーマの header.php を条件分岐しても消えない。DevToolsで見ても決定打が出ない。
最終的に原因だったのは、記事下に入れていた手動Multiplex広告が AdSense のライブラリを再読込していたことだった。
今回は、その時に何を疑って、何が外れで、どこが本当の原因だったのかを記録として残しておく。
先に結論
- AdSenseの自動広告が消えない原因は、AdSense設定ではなく手動Multiplex広告側だった
- header.php の条件分岐だけでは不十分だった
- Xeoryでは single.php の under_post_area も確認した方が早い
なお、この記事を書いている時点では通常記事側の広告はそのままなので、「自動広告が消えない記事が広告だらけ」という妙な絵面になっている。内容と見た目がケンカしていて少し面白い。
目次
やりたかったこと
やりたかったのはシンプルで、特定のカテゴリ群だけ AdSense の自動広告を止めることだった。
自分の環境では、XREAL研究所の記事群だけ広告の出し方を変えたかった。研究所側は手動広告ショートコード運用に切り替えていたので、少なくとも研究所内では Auto Ads を動かしたくなかった。
記事URLはディレクトリ配下ではなく、ドメイン直下でこんな形になっている。
/xreal-air2pro-macbook-m1/
/xreal-air2pro-vision-problem/
/xreal-lab/
この構造なら、AdSense側の除外設定でなんとかなるだろうと思っていた。だが、実際はそう簡単ではなかった。
最初に疑ったこと
AdSense側のセクション除外
まずは素直に AdSense 側の除外設定を試した。
完全一致では反応するのに、接頭辞スラッグのような形ではうまく効かない。試したのはこんな形だった。
example.com/xreal
example.com/xreal-air2pro-
example.com/xreal-lab/
example.com/category/xreal/
完全一致っぽい指定は効くのに、「このセクション全部」みたいな想定では動いてくれない。
この時点で、AdSenseのセクション除外はディレクトリ構造寄りで、今回のような接頭辞スラッグ構造には弱いのかもしれないと感じた。
親テーマのheader.phpにあるAdSense script
次に見たのは、テーマ側の header.php だった。
すると、head 内に AdSense のライブラリ読込があり、かなり怪しく見えた。
<?php echo get_option('analytics_tracking_code');?>
<?php echo get_option('webmaster_tool');?>
<script data-ad-client="ca-pub-XXXXXXXXXXXXXXX" async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
これなら、研究所記事だけ条件分岐で外せば止まるだろうと思った。
そこで header.php 側を研究所記事では読まないようにしたのだが、それでも広告が消えない。
ここでかなり混乱した。正直、「いやもう何が読んでるんだよ」となった。
DevToolsのNetwork
次に見たのはブラウザの DevTools だった。
Network で pagead2.googlesyndication.com や activeview、gen_204 などを見つけて、「やっぱりどこかで広告が動いてる」とは分かった。
ただ、後から分かったのは、これらは広告表示後に走る内部ランタイムや計測用の通信であって、発生源そのものではなかったことだ。
つまり、
activeviewが見えたgen_204が見えた
これだけでは、どこから広告コードが読み込まれているかまでは分からない。
ヒントにはなるが、犯人の特定には届かなかった。
通常記事と研究所記事のページソースを見比べたら違いが見えた
ここで完全に行き詰まったので、通常記事とXREAL研究所の記事のページソースを直接見比べることにした。
比較に使ったのは、通常記事側が「悪役令嬢50選」、研究所記事側が「XREAL Air 2 ProのDisplayPort Alt Mode記事」だった。
検索したのは、
ca-pub-XXXXXXXXXXXXXXXadsbygoogle.jspagead2.googlesyndication.com
このあたり。
すると、通常記事の方では head 内に AdSense ライブラリ読込が残っていた。

通常記事のページソース。
head 内に adsbygoogle.js が残っている。
<script data-ad-client="ca-pub-XXXXXXXXXXXXXXX" async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
一方で、研究所記事の方では head 側ではなく、記事下の手動Multiplex広告側に adsbygoogle.js と adsbygoogle が残っていた。

XREAL研究所の記事のページソース。
記事下の手動Multiplex広告内に adsbygoogle.js と adsbygoogle が残っていた。
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-XXXXXXXXXXXXXXX" crossorigin="anonymous"></script>
<ins class="adsbygoogle"
style="display:block"
data-ad-format="autorelaxed"
data-ad-client="ca-pub-XXXXXXXXXXXXXXX"
data-ad-slot="XXXXXXXXXX"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
ここでようやく、「header.php の条件分岐が効いていない」のではなく、別の場所から広告コードが読み込まれていると分かった。
しかも残っていたのは、まさに記事下の手動Multiplex広告だった。
本当の犯人は記事下の手動Multiplex広告だった
さらに見ていくと、記事下に入れていた手動Multiplex広告が AdSense ライブラリを読んでいた。
自分の環境では、Xeory の single.php に次のような記述があった。
<?php if( is_active_sidebar('under_post_area') ){
dynamic_sidebar('under_post_area');
} ?>
この under_post_area が、WordPress管理画面でいう「投稿記事下」のウィジェット領域だった。
ここに入れていた手動Multiplex広告が adsbygoogle.js を読み込んでいた。
つまり構図としてはこうだった。
header.php側では研究所記事の AdSense 読込を止めた- でも記事下ウィジェットの手動Multiplex広告が
adsbygoogle.jsを再読込した - その結果、研究所記事でも Auto Ads が動いていた
正直、ここはかなり盲点だった。
切り分けで確定したこと
この仮説を確認するために、「投稿記事下」ウィジェットから一時的に Multiplex 広告を外してみた。
すると、研究所記事の広告が消えた。
この瞬間、「お前かよ!」となった。ずっとAdSense側ばかり疑っていたので、かなり拍子抜けだった。
つまり、自動広告が消えない原因は Auto Ads 設定そのものではなく、手動広告側の script 読込だったということになる。
実際にやった解決方法
対応としては、single.php 側で研究所カテゴリの記事では under_post_area を出さないようにした。
変更前はこれ。
<?php if( is_active_sidebar('under_post_area') ){
dynamic_sidebar('under_post_area');
} ?>
変更後はこう。
<?php if ( !has_category('xreal') && is_active_sidebar('under_post_area') ) {
dynamic_sidebar('under_post_area');
} ?>
※ xreal の部分は、自分の環境で広告を止めたいカテゴリスラッグに置き換える。
この修正で、
- XREAL研究所の記事では記事下ウィジェットが出ない
- Multiplex広告も出ない
adsbygoogle.jsの再読込も止まる- Auto Ads も復活しない
という状態になった。
一方で通常記事では、これまで通り記事下広告を維持できた。
今回の件で分かったこと
CSSで隠すだけではダメ
最初は「記事下の広告ブロックだけ見た目を消せばいいのでは」とも思った。
だが、これは本質的な解決にはならない。見た目を消しても、script が読み込まれていれば意味がないからだ。
必要なのは、HTML出力自体を止めることだった。
自動広告が消えない時、原因は自動広告そのものとは限らない
今回一番大きかったのはここだと思う。
自動広告が消えないと、「AdSense側の設定が反映されていない」「header.php の条件分岐が壊れている」などを疑いがちだが、実際には別の手動広告コードが同じライブラリを呼んでいることがある。
これはかなり盲点だった。
ページソース比較は強い
DevTools の Network だけでは追いきれなかったが、通常記事と研究所記事のページソースを比較したことで、head 側の script の有無と、手動広告側の読込の違いが見えた。
行き詰まった時は、ページソース比較はかなり強い。
WordPressテーマではdynamic_sidebar()を疑う価値がある
広告の出力元がウィジェットなら、設定画面を延々と探すよりも、テンプレート内の dynamic_sidebar() を見た方が早いことがある。
今回も、犯人は設定画面の奥ではなく、single.php にあるウィジェット出力箇所だった。
まとめ
今回やりたかったのは「研究所だけ自動広告を止める」という単純なことだったが、実際にはかなり回り道をした。
最終的には、
header.php側で研究所記事の AdSense 読込を止めるsingle.php側で研究所カテゴリの記事ではunder_post_areaを出さない
この2段構えで解決した。
もし同じように、
- WordPressで特定カテゴリだけ広告を消したい
- Auto Adsがなぜか消えない
- 手動広告と自動広告を併用している
という状況なら、手動広告側が AdSense ライブラリを再読込していないか を疑ってみると早いかもしれない。
自分みたいに、AdSense側の設定と header.php ばかり疑って遠回りする前に、dynamic_sidebar() と記事下ウィジェットを一度見ておく価値はある。