プラグイン無しでアクティブパラメータを付与して投稿ページのテンプレートを出し分けする方法

アクティブパラメータ

WordPressのカスタマイズを行っていると、記事の内容によってページの出し分けをするためにページのテンプレートをいじり、手動でテンプレートを指定することがあります。

ですが、アクティブパラメータをURLに付与して、一つの投稿ページでテンプレートを出し分けする方法があります。

もちろん、この方法でパラメータを付与して、コンテンツの出力もコントロールするので、重複コンテンツのペナルティが発生しないよう、 rel=”canonical” でURLを統一にする対応が必要ですが、検索流入を意図していない noindex を付与した広告用のLPにこの方法を使い A/Bテストを行うなど、色々な活用ができると思います。

そこで今回は、プラグイン無しでアクティブパラメータを付与して投稿ページのテンプレートを出し分けする方法についてご紹介します。

実装のサンプル

このページのURLの末尾 に ?info=test1column のパラメータを付与することで、以下のようなこのページの1カラムのテンプレートに切り替えたバージョンが閲覧できます。

1カラムのテスト
ここをクリックするとサンプルが見れます。

アクティブパラメータとは?

パラメータは、サーバー側で動くプログラムに情報を送るために、URLの末尾に付け加える文字列です。

正しいURL
https://hogehoge.com

上記の正しいURLの末尾に、「?(クエスチョンマーク)」を付けて、複数の値を指定する場合は「&」で「変数=値」をつないでいきます。

パラメータ付のURL
https://hogehoge.com?〇〇〇=■■■■

このパラメーター付のURLにはパッシブパラメータと、アクティブパラメータの2種類があります。

パッシブパラメータ

パッシブパラメータが付与されたページでは、コンテンツの内容は変化しません。

Goolge analyticsのトラッキング用パラメータがこれにあたり、どのページから自社のサイトへアクセスしたのかを計測するために、URLの末尾に付け加えるパラメータを「パッシブパラメータ」と呼びます。

アクティブパラメータ

アクティブパラメータは、指定した値によってコンテンツの内容が変化し、商品ページでカラー別のページが生成されるECサイトでよく見られます。

その為、同じ商品を色やサイズによって、異なるパラメータURLで管理している場合、rel=”canonical”を設置して、クローラーにどのページを優先的にクロールしてほしいかを伝えることが必要なのはこの為です。

MEMO
当サイトで使用している WordPressテーマSANGOでは、rel=”canonical” を自動で記述してくれるので、これを実装した場合重複コンテンツの対策は不要です。

コピペ用コード

コピペ用コードをfunctions.phpに貼り付けするだけで完成ですが、間違った記述を行うと全ての画面表示が真っ白になったりするので注意しましょう。

注意
functions.phpをいじる場合、ftpで必ずバックアップを取ってから行い、テーマ本体ではなく子テーマの方に関数をコピペするようにしましょう。

コピペの前の準備

まず、コピペ用の記述とは別に、パラメータで表示させたいテンプレートファイルを作成する必要があります。

表示させたいテンプレートファイルは、デフォルトで使用する single.php をコピーするなどして、ファイル名を single-XXXXX.php の名前で保存し/wp-content/themes/ の使用しているWordPressテーマの階層に保存します。

ここでつけた single-XXXXX.php の XXXXX の名前の部分が、表示させるパラメータになります。

MEMO
ここでご紹介するコピペ用のコードを、WordPressテーマSANGOで使用する場合、子テーマではなく親テーマの階層に保存しましょう。

通常の投稿ページ用のコード

以下のコードをコピペして、URLの末尾に ?info=XXXXX を記述すると、投稿ページで指定したテンプレートをパラメータで呼び出して出力します。

コードを表示する

functions.php

function shop_template_switch($template) {
    $new_template = $template;
    if (isset($_GET['info'])) {
        $new_template = 'single-' . esc_html($_GET['info']) . '.php';
        if (is_array($template)) {
            $new_template = array(
                $new_template,
                isset($template[1]) ? $template[1] : 'single.php'
                );
        } else {
            $new_template = preg_replace('/[^\/]+\.php$/i', $new_template, $template);
            if (!file_exists($new_template)) {
                $new_template = $template;
            }
        }
    }
    return $new_template;
}
add_filter('single_template', 'shop_template_switch');

カスタム投稿ページ用のコード

カスタム投稿タイプで出力する場合は、以下のコードを functions.php に貼り付けします。

以下は seminar と言うカスタム投稿タイプの例です。

コードを表示する

functions.php

function shop_template_switch($template) {
    $new_template = $template;
    $post = get_queried_object();
    if (is_singular( 'seminar', $post)) {
        if (isset($_GET['info'])) {
            $new_template = 'single-' . esc_html($_GET['info']) . '.php';
            if (is_array($template)) {
                $new_template = array(
                    $new_template,
                    isset($template[1]) ? $template[1] : 'single-seminar.php'
                    );
            } else {
                $new_template = preg_replace('/[^\/]+\.php$/i', $new_template, $template);
                if (!file_exists($new_template)) {
                    $new_template = $template;
                }
            }
        }
    }
    return $new_template;
}
add_filter('single_template', 'shop_template_switch');

参考サイト

参考パラメータとは?ペナルティを避けるためのURLパラメータ活用法を伝授!PINTO!