ショウジンブログ on Hatena

“お芝居をしないと、この社会では異邦人として扱われるほかない”

投稿用テンプレート(single.php)をカテゴリ別に分ける@WordPress

WordPressでは「投稿」をフロント(訪問者側)で表示するのに「single.php」を使います。

実際はテンプレート階層があるので、index.phpで表示することもあるのですが(single.phpが存在しない場合)、あんまりそれは(作ってる途中でない限り)ないかと思いますので、ここでは「投稿=single.php」ということで進めます。

投稿のカテゴリによって表示する内容を変えたい場合があります。

たとえば、セミナー講師の方のWordPressサイトだとして、セミナーの開催情報を投稿で告知していた場合、カテゴリにセミナーごとの種別をもたせているとします。

セミナーの詳細情報(開催日時や会場情報、申込先等)をカスタムフィールドで用意しておき、これが(フィールドグループが)カテゴリごとに違う場合、single.phpで出力するものを分ける必要があります。

そんなとき(カテゴリごとに出力する内容が変わることがある)に使えます。

ようするに、カテゴリごと、投稿用テンプレートで出力する内容を分けたい場合です。

各カテゴリ用のテンプレートを用意する

single.phpにinclude(読み込む)、カテゴリごとの内容をファイルを分けて用意します。

single.phpで完結させることも出来ますが、そうすると冗長になり、メンテナンス性、可読性を損なうので、この例では分けて読み込むことにします。

テーマのディレクトリ内にそれ用の「_single」というディレクトリを作り、その中に以下のファイルを用意します。(ファイル名とカテゴリのスラッグを同じにしています)

  • _single/blog.php(カテゴリ:ブログ用)
  • _single/info-arrival.php(カテゴリ:新着商品情報)
  • _single/news.php(カテゴリ:お知らせ用)

テーマディレクトリ直下でもいいですが、includeするものなので、このように分けておいたほうがわかりやすいかと思います。(そのへんはお好み、環境次第で)

f:id:showjinx:20160705143125j:plain

これらのファイルに、そのカテゴリにだけ出力したいもの。たとえば先述のように、そのカテゴリだけに用意したカスタムフィールドの内容とか、写真とか、バナー画像とか、リンク先とか、そういうものを記述しておきます。

single.phpに条件文を書く

in_category()関数を使ってカテゴリスラッグを指定し、その際に読み込むファイルをパスで指定します。

この例ではデフォルトの編集エリア(the_contentで出力される)に入力されたものの下に、カテゴリごとに出力されるファイルを読み込んで表示されるようにしています。

f:id:showjinx:20160705143223j:plain

<?php
    $post = $wp_query->post;
    if ( in_category('news') ) {
        include(TEMPLATEPATH.'/_single/news.php');
    } elseif ( in_category('blog') ) {
        include(TEMPLATEPATH.'/_single/blog.php');
    } elseif ( in_category('info-arrival') ) {
        include(TEMPLATEPATH.'/_single/info-arrival.php');
    } else {
        /* カテゴリスラッグ「news, blog, info-arrival」以外の場合はsingle.phpで完結 */
    };
?>

上記のコードは条件文のところだけです。

single.php全体のコードは以下です。

single.php

<?php get_header(); ?>
        <?php get_sidebar(); ?>
        <div class="main col-12 col-8-m col-8-l">

            <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
                <h2 class="title_post"><?php the_title(); ?></h2>
                <ul class="optional">
                    <li class="date">Published: <?php echo get_post_time('M jS, Y'); ?></li>
                </ul>
                <?php the_content(); ?>
            <?php endwhile; ?>
            <?php else: ?>
                <p>記事がありません</>
            <?php endif; ?>

            <?php
                $post = $wp_query->post;
                if ( in_category('news') ) {
                    include(TEMPLATEPATH.'/_single/news.php');
                } elseif ( in_category('blog') ) {
                    include(TEMPLATEPATH.'/_single/blog.php');
                } elseif ( in_category('info-arrival') ) {
                    include(TEMPLATEPATH.'/_single/info-arrival.php');
                } else {
                    /* カテゴリスラッグ「news, blog, info-arrival」以外の場合はsingle.phpで完結 */
                };
            ?>
        <!-- / .main --></div>

    <!-- / .contents --></div>

<?php get_footer(); ?>