商品カテゴリ選択時に、商品カテゴリ専用のテンプレートを表示する その2
前回の続き
function.php側を商品とそれ以外に分けてみた。
「選択されたカテゴリが商品カテゴリか、その子孫カテゴリだった場合」を判断するには、
「is_category(var)」ではなく、「in_category(var)」を使うのが正解らしい。
「is_category(var)」だと、現在表示しているカテゴリがvarに一致するかどうかと言う意味になってしまう。
なんで、function.phpの実装は結果的にこうなった。
//カテゴリページの制御 add_action('template_redirect', 'template_redirect_item_category'); function template_redirect_item_category() { if( in_category('item') && is_category() ) { // 商品カテゴリ以下だった場合、item_category.phpを使用する include(get_stylesheet_directory() . '/item_category.php'); exit; } }
次にitem_category.php。
通常のループで表示してしまうと制御が面倒なので、
固定ページの表示だろうと、カテゴリ表示だろうと、「query_posts(var)」を使用することにし、
条件分岐で、パラメータ[category_name]のみを制御することにする。
(通常ループは固定ページ表示時は固定ページの記事として使用したいため)
通常の固定ページ表示の場合は、カスタムフィールド[category_slug]の値、
カテゴリページとして表示する場合は、表示中のカテゴリ名の値を渡すので、こんな感じになる。
<?php if (!is_category()) : while (have_posts()) : the_post(); ?> <?php // 固定ページで表示した場合は、カテゴリ名をカスタムフィールドから取得 ?> <?php $category_name = get_post_custom_values('category_slug', $post->ID); ?> <?php $category_name = $category_name[0]; ?> ・・・中略・・・ <?php else: ?> <?php // アーカイブで表示した場合は、カテゴリ名をカテゴリ名から取得 ?> <?php $category_name = get_query_var( 'category_name' ); ?> <?php endif; ?> <?php $loop = new WP_Query('category_name=' . $category_name ); ?>
これで無事に、商品アーカイブとブログ記事のアーカイブで表示を切り分ける事ができた。
・・・と思ったら、商品アーカイブだとタイトル出とらんやんけ。
ま、ここまで来たらあとちょぃかな。
この投稿へのトラックバック
トラックバックはありません。
- トラックバック URL
この投稿へのコメント
よくよく考えたら、ここでquery_postsを使うのは邪道なんかな。
new WP_Query()に変更しておこう。