商品カテゴリ選択時に、商品カテゴリ専用のテンプレートを表示する その2

前回の続き

function.php側を商品とそれ以外に分けてみた。
「選択されたカテゴリが商品カテゴリか、その子孫カテゴリだった場合」を判断するには、
「is_category(var)」ではなく、「in_category(var)」を使うのが正解らしい。
「is_category(var)」だと、現在表示しているカテゴリがvarに一致するかどうかと言う意味になってしまう。

参考:WordPressCodex 条件分岐タグ

なんで、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&#91;0&#93;; ?>
	・・・中略・・・
<?php else: ?>
	<?php // アーカイブで表示した場合は、カテゴリ名をカテゴリ名から取得 ?>
	<?php $category_name = get_query_var( 'category_name' ); ?>
	
<?php endif; ?>
<?php $loop = new WP_Query('category_name=' . $category_name ); ?>

これで無事に、商品アーカイブとブログ記事のアーカイブで表示を切り分ける事ができた。
・・・と思ったら、商品アーカイブだとタイトル出とらんやんけ。
ま、ここまで来たらあとちょぃかな。


この投稿へのコメント

  1. doop said on 2012年5月29日 at 23:40

    よくよく考えたら、ここでquery_postsを使うのは邪道なんかな。
    new WP_Query()に変更しておこう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL