広告 (Google AdSense) を動的に非表示にする


概要

当サイトのリストURLに文字列を付けると Google AdSense が表示されないようにする。

https://listfreak.com/list/NNN   → 広告あり
https://listfreak.com/list/NNN/x → 広告なし

背景

当サイトはいくつかのページを除いて Google AdSense が配信する広告を表示しています。しかし、リストを誰かに紹介するときには広告を外したい。そこでURLの末尾に /x のような文字列を付けることで Google AdSense の表示を抑制できないかどうか調べました。

内容

Google AdSense の表示を動的に抑制する

広告を表示させているのは、<head> 部の <!– Google AdSense スニペット (Site Kit が追加) –> の次の行にある JavaScript です。この行が挿入される行を調べてみると、’template_redirect’ フックに登録されている ‘Google\S\M\AdSense->register_tag()’ というコールバックらしいことがわかりました。

そこで AdSense::register_tag() を見てみると、スニペット書き出し前にこんなif分がありました。

if ( $tag->is_tag_blocked() ) {
return;
}

is_tag_blocked() の実体は Module_Web_Tag::is_tag_blocked() です。その中身は次のようにフィルターフックで出力の有無を切り替えられるようになっています。

何のためにブロックしているのかわかりませんが、ありがたく使わせていただくことに。

return (bool) apply_filters( "googlesitekit_{$this->module_slug}_tag_blocked", false );

URLへの追加文字列を認識する

list/NNN/x の x を認識させるためにはリライトルールの追加が必要です。

add_rewrite_rule(
'^list/([0-9]{1,})/x$',
'index.php?category_name=list&p=$matches[1]&x=yes',
'top'
);

この x をWP_Queryで認識させます

add_filter( 'query_vars', function($qvars){
$qvars[] = 'x';
return $qvars;
}, 10, 1 );

これらは ‘init’ アクションフックに登録しなければなりません。

まとめるとこんな感じで動きました。

add_action( 'init', function(){

add_rewrite_rule(
'^list/([0-9]{1,})/x$',
'index.php?category_name=list&p=$matches[1]&x=yes',
'top'
);

add_filter( 'query_vars', function($qvars){
$qvars[] = 'x';
return $qvars;
}, 10, 1 );
}, 10, 0 );

add_action( 'wp', function( $wp ){

if ( 'yes' === get_query_var( 'x' ) ) {
add_filter( 'googlesitekit_adsense_tag_blocked', '__return_true', 10, 1 );
}
}, 10, 1 );
, ,

Posted by

on

in category