広告側で出し分けの設定を行う場合はURLを変更する必要がある。
たとえば、トップページと固定ページのメインビジュアルの変えたものをBパターンとして作成する場合、以下で完結するが、うまくいかない場合がある。
add_rewrite_endpoint( 'p2', EP_ROOT | EP_PAGES );
それは表示設定の「投稿ページ」に固定ページが設定されているときで、この場合はトップページが投稿ページのアーカイブページを指すことになる。
この構成になっている場合は、EP_ROOTを使用するのをやめて自前でリライトルールを書き換える必要がある。
add_rewrite_endpoint( 'p2', EP_PAGES );
add_filter( 'template_include', function ( $template ) {
if( get_query_var( 'p2', false ) !== false && ! is_singular( 'page' ) ) {
$template = locate_template( 'front-page.php' );
}
return $template;
}, 99, 1);
add_filter( 'query_vars', function ( $vars ) {
$vars[] = 'p2';
return $vars;
} );
add_action( 'init', function () {
add_rewrite_rule( '^p2/?$', 'index.php?&p2=1', 'top' );
} );
add_action( 'pre_get_posts', function ( $query ) {
if ( ! is_admin() && $query->is_main_query() && get_query_var( 'p2', false ) !== false && ! is_singular( 'page' ) ) {
$query->set( 'page_id', get_option( 'page_on_front' ) );
$query->is_page = true;
$query->is_home = true;
$query->is_singular = true;
$query->is_front_page = true;
}
} );
remove_action( 'template_redirect', 'redirect_canonical' );
メインクエリを書き換えているが、これをしない場合、テンプレートはfront-page.phpを表示しているが中身が入ってこないことになるため注意する。
そして、headタグ内にカノニカルタグを追加する。
add_action( 'wp_head', function () {
if ( get_query_var( 'p2', false ) !== false ) {
echo '<link rel="canonical" href="' . get_permalink() . '" />';
}
} );
なお、Bパターンにアクセスしたユーザーに対して、AパターンのURL(正規URL)にリダイレクトさせずに、Cookieを利用して常にBパターンの表示にする場合は以下のようにする。
function is_pattern_2 () {
if ( get_query_var( 'p2', false ) !== false || ( isset( $_COOKIE[ 'use_pattern' ] ) && $_COOKIE[ 'use_pattern' ] === 'p2' ) ) {
return true;
} else {
return false;
}
}
add_rewrite_endpoint( 'p2', EP_PAGES );
add_filter( 'template_include', function ( $template ) {
if ( is_pattern_2() && ( ! isset( $_COOKIE[ 'use_pattern' ] ) || $_COOKIE[ 'use_pattern' ] !== 'p2' ) ) {
$cookie_name = 'use_pattern';
$cookie_value = 'p2';
$expiry_time = time() + (86400 * 30); // 30日間有効の場合
setcookie( $cookie_name, $cookie_value, $expiry_time, '/', '', true, true );
}
if ( isset( $_GET[ 'reset-pattern' ] ) ) { // Cookieリセット用
setcookie( 'use_pattern', '', time() - 3600, '/', '', true, true );
}
if ( is_pattern_2() && ! is_singular( 'page' ) && is_front_page() ) {
// is_front_page() を指定しているのは search.php が反応しないようにするため
$template = locate_template( 'front-page.php' );
}
return $template;
}, 99, 1);
add_filter( 'query_vars', function ( $vars ) {
$vars[] = 'p2';
return $vars;
} );
add_action( 'init', function () {
add_rewrite_rule( '^p2/?$', 'index.php?&p2=1', 'top' );
} );
add_action( 'pre_get_posts', function ( $query ) {
if ( ! is_admin() && $query->is_main_query() && is_pattern_2() && ! is_singular( 'page' ) && is_home() ) { // この条件はサイト構成によって変更する
$query->set( 'page_id', get_option( 'page_on_front' ) );
$query->is_page = true;
$query->is_home = true;
$query->is_singular = true;
$query->is_front_page = true;
}
} );
remove_action('template_redirect', 'redirect_canonical');
add_action( 'wp_enqueue_scripts', function () {
if ( is_pattern_2() ) {
wp_enqueue_style( 'style2', get_theme_file_uri( '/css/pattern2.css' ), [ 'style' ], '1.0.0' );
}
} );
なおこれを実装する際に、PHPの$_COOKIEが取得できない場合があったが、ブラウザにCookieが保存されているのであれば、サーバーの設定を見直すと良い。
当方の場合、サーバーキャッシュが原因であった。
有名どころだと、WPXサーバーではCookieの値でキャッシュを無効にできる設定があるので、上のサンプルの場合は「use_pattern」を指定すると望み通りに動いた。