概要
当サイトのリスト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 );