【WordPress】single.phpに複数のテンプレートを指定する方法

今回はWordPressのsingle.phpに複数のテンプレートを指定する方法を紹介します。

例えば、パーマリンクが http://example.com/archives/1のページをを印刷コピーしたい場合、http://example.com/archives/1?type=printにアクセスして、テンプレートのsingle.phpを読み込むのではなく、代わりにsingle-print.phpを読み込みたい。こんな場合に使えるかと思います。

 

やり方

WordPressに元から備わっているsingle_templateというフィルターフックを利用して通常とは異なるテンプレートを読み込むようにすればokです。

以下のコードをfunctions.phpにまるっとコピペしてしまいましょう。

function single_template_switch($template) {
    $new_template = $template;
    if (isset($_GET['type'])) {
        $new_template = 'single-' . esc_html($_GET['type']) . '.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', 'single_template_switch');

 

次にsingle-A.phpとsingle-B.phpを作ります。名前は各自好きなものに変更してください。

そして、

<a href="<?php the_permalink(); ?>?type=A">パターンA</a>
<a href="<?php the_permalink(); ?>?type=B">パターンB</a>

こんな感じでリンクさせてあげると内容は同じでも違うデザインにすることができます。

 

ただし、これだけでは本文を変えることはできないので、例えば

むかしむかしあるところにおじいさんがいた。
おばあさんもいた。
「そして鬼もいるぞ。」
「わあ!鬼だ!」
〜

この本文を

[sp]むかしむかしあるところにおじいさんがいた。[no]
おばあさんもいた。[br]
「そして鬼もいるぞ。」
「わあ![sp]鬼だ!」[br]
〜

こんな感じに変更します。

変更する際はテキストをまとめて置換してしまいましょう。置換にはTextSSを使うと効率的です。

 

functions.phpに以下を記述します。

function single_A($text){
$replace = array(
'[sp]' => '',
'[no]' => '<br>',
'[br]' => '<br>',
);
$text = str_replace(array_keys($replace), $replace, $text);
return $text;
}
function singleA(){
add_filter('the_content', 'single_A');
}

function single_B($text){
$replace = array(
'[sp]' => ' ',
'[no]' => '',
'[br]' => '<br>',
);
$text = str_replace(array_keys($replace), $replace, $text);
return $text;
}
function singleB(){
add_filter('the_content', 'single_B');
}

 

そしてsingle-A.phpとsingle-B.phpそれぞれの以下の部分

<?php the_content(); ?>

これを以下のように変更します。

<?php singleA(); ?>
<?php the_content(); ?>

これで[sp][no][br]あたりのタグを改行タグに変更したり、なくしておきます。

とりあえずこんな感じでできると思います。