サポート » 使い方全般 » 親カテゴリーページで子カテゴリーの記事タイトル一覧を表示したい

  • 解決済 ryosuke

    (@ryosuke)


    親カテゴリーページを表示したときに、子カテゴリーを以下の条件で表示させることができません。

    ・その親カテゴリーに属される子カテゴリーのカテゴリー名を表示
    ・その子カテゴリーのエントリータイトルや概要を表示
    ・子カテゴリーがなければ、親カテゴリーのエントリータイトルや概要を表示
    ・子カテゴリーが複数ある場合はループ

    「親カテゴリーに子カテゴリーのエントリーを表示させたくない」
    などを参考に、以下までは作成できましたが、そこから進めません。
    どなたか、助けていただけますでしょうか?

    <?php if ( is_category() ) {
    		$cat = get_query_var( 'cat' );
    		$paged = get_query_var( 'paged' );
    		query_posts( array( 'category__and' => array( $cat ), 'paged' => $paged ) );
    	} ?>
    	<?php while (have_posts()) : the_post(); ?>
    		<div <?php post_class(); ?>>
    		<?php the_thumb('altappend=thumb_&width=79&height=79'); ?>
    		<h3 id="post-<?php the_ID(); ?>"><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php printf(__('Permanent Link to %s'), the_title_attribute('echo=0')); ?>"><?php the_title(); ?></a></h3>
    		<small><?php the_time(__('l, F jS, Y')) ?></small>
    
    		<div class="entry">
    		<?php the_excerpt() ?>
    		</div>
    
    		<p class="postmetadata"><?php the_tags(__('Tags:'), ', ', '<br />'); ?> <?php printf(__('Posted in %s'), get_the_category_list(', ')); ?> | <?php edit_post_link(__('Edit'), '', ' | '); ?>  <?php comments_popup_link(__('No Comments »'), __('1 Comment »'), __('% Comments »'), '', __('Comments Closed') ); ?></p>
    
    		</div>
    
    	<?php endwhile; ?>

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • 失礼ですが、提示された条件だけではいろいろなケースが想定できてしまいます。

    • 親カテゴリーにのみ属す記事はどのように扱うのか?
    • 孫カテゴリーが存在する場合にはそれらに属する記事はどのように扱うのか?
    • 子カテゴリーに属する記事は何件表示するのか?
    • 子カテゴリーの記事は、次のページ、前のページに遷移した場合それぞれどのように表示されるべきか?

    など不明な点が多いです。
    そもそもカテゴリーページの体裁はどのような形を目指しているのか、もう少し具体的に書いて頂けるとコードの提示もしやすいのですが。

    とりあえずありがちだと想像しているのは、以下の 2 通りです。

    • カテゴリーページにて表示させる記事そのものを、子カテゴリー毎に分類してから表示させたい。
    • 親カテゴリーページでは、子カテゴリー毎に、設定した表示件数ずつ記事を表示し、それぞれがページングに対応している。

    この 2 つは似ていますが、全く異なるものです。

    丁寧なお返事ありがとうございます。
    お手数お掛けしてしまい申し訳ございません。

    まず、ご質問に回答させていただきます。
    > * 親カテゴリーにのみ属す記事はどのように扱うのか?
    子カテゴリーがない場合、記事一覧(全て)を表示させる。

    > * 孫カテゴリーが存在する場合にはそれらに属する記事はどのように扱うのか?
    孫カテゴリー以下は表示させない。

    > * 子カテゴリーに属する記事は何件表示するのか?
    5件程度で良いのですが、パラメーターで変更できるとなお良いです。

    > * 子カテゴリーの記事は、次のページ、前のページに遷移した場合それぞれどのように表示されるべきか?
    同カテゴリー(子カテゴリー)内の「次のページ」「前のページ」に遷移させたい。

    カテゴリーページの体裁はニュースサイトのようなものをイメージしております。
    以下のようなイメージです。
    【親カテゴリーAページの場合】

    ├ 親カテゴリーA名
    │ └ 子カテゴリーがない場合、親カテゴリーのみに属する記事一覧(記事タイトル、要約、サムネイルなど)(全て)

    ├ 子カテゴリーAA名 (→子カテゴリーAAのカテゴリーページにリンク)
    │ └ 子カテゴリーAAに属する記事一覧(記事タイトル、要約、サムネイルなど)(5件)

    └ 子カテゴリーAB名 (→子カテゴリーABのカテゴリーページにリンク)
      └ 子カテゴリーABに属する記事一覧(記事タイトル、要約、サムネイルなど)(5件)

    【親カテゴリーBページの場合】

    ├ 親カテゴリーB名
    │ └ 子カテゴリーがない場合、親カテゴリーのみに属する記事一覧(記事タイトル、要約、サムネイルなど)(全て)

    ├ 子カテゴリーBA名 (→子カテゴリーBAのカテゴリーページにリンク)
    │ └ 子カテゴリーBAに属する記事一覧(記事タイトル、要約、サムネイルなど)(5件)

    └ 子カテゴリーBB名 (→子カテゴリーBBのカテゴリーページにリンク)
      └ 子カテゴリーBBに属する記事一覧(記事タイトル、要約、サムネイルなど)(5件)

    ※記事タイトルからそれぞれの単独記事ページにリンク
    ※サムネイルはプラグインのpost_thumbを使い実現を考えています。

    > * カテゴリーページにて表示させる記事そのものを、子カテゴリー毎に分類してから表示させたい。
    > * 親カテゴリーページでは、子カテゴリー毎に、設定した表示件数ずつ記事を表示し、それぞれがページングに対応している。

    おそらく、「親カテゴリーページでは、子カテゴリー毎に、設定した表示件数ずつ記事を表示し、それぞれがページングに対応している。」かと思いますが、イマイチ理解できていないです。

    誠に申し訳ございませんが、もう少しお付き合いいただけますでしょうか。

    こちらこそ、質問文が少し分かりにくかったようで申し訳ありません。
    私の質問は、親カテゴリーページの表示のさせ方についてで、子カテゴリー、と書いている部分はすべて、親カテゴリーページ中に表示させる子カテゴリーの記事のことを指しています。

    > * 親カテゴリーにのみ属す記事はどのように扱うのか?
    子カテゴリーがない場合、記事一覧(全て)を表示させる。

    親カテゴリーにのみ属す記事というのは、 親カテゴリーには属すが子カテゴリーには属さない記事のことです。通常カテゴリーページでは、そのカテゴリーの記事と、その子カテゴリーの記事があわせて表示されますので、場合によっては子カテゴリーも子カテゴリーに属す記事も存在するが、それに属さない親カテゴリーだけに属す記事というのが発生する可能性があります (例:「スポーツ > 球技 > 野球」という階層があり、「野球」カテゴリーの記事も存在するが、「球技」カテゴリーにだけ属す記事がある) 。その場合、(「球技」カテゴリーのページで、野球、サッカー、など、子カテゴリーの記事一覧は表示させるが) 子カテゴリーに属さない記事 (「球技」カテゴリーにだけ属す記事) は表示させないのか、という意図の質問でした。

    > * 子カテゴリーの記事は、次のページ、前のページに遷移した場合それぞれどのように表示されるべきか?
    同カテゴリー(子カテゴリー)内の「次のページ」「前のページ」に遷移させたい。

    これについて、よく理解できませんでした。どのような挙動なのでしょうか?

    質問ばかりになってしまってすみません。例えば、通常は、表示件数が 5 件だとすると、 前のページでは 6 件目から 10 件目までが表示されます。そのページにて表示する子カテゴリー達の記事一覧も、それぞれ同じくそれぞれの 6 件目から 10 件目までを表示するのでしょうか?

    親カテゴリーページでは、子カテゴリー毎に、設定した表示件数ずつ記事を表示し、それぞれがページングに対応している。

    これは、そういう状態を意図した文章でした。ほんと分かりにくいですね。

    例えば、親カテゴリーページについて、子カテゴリーが存在する場合、親カテゴリーにのみ属す記事というのは存在せず、そういったページでは前のページ、次のページが必要ない、というのであれば、子カテゴリーの記事一覧として各 5 件ずつ表示し、それぞれの最後に、「このカテゴリーの記事一覧 »」のような子カテゴリーページへのリンクを設置するだけで足りるのであれば、多少ややこしいページングのことを考えなくて済むので、その方が簡単です。

    不必要なやりとりが多いなとうんざりされているかもしれませんが (ごめんなさい) もう少し補足をお願いします。

    何度も申し訳ございません。本当にありがとうございます。

    とても丁寧に分かりやすく説明していただき感謝しております。
    私の頭が整理されておらず、非常に中途半端な仕様となっておりました。

    >> * 子カテゴリーの記事は、次のページ、前のページに遷移した場合それぞれどのように表示されるべきか?
    >同カテゴリー(子カテゴリー)内の「次のページ」「前のページ」に遷移させたい。
    これについて、よく理解できませんでした。どのような挙動なのでしょうか?

    すみません、子カテゴリーに属される記事の単独ページ(single.php)を開いた時点の挙動と勘違いしておりました。
    親カテゴリーページにおいて子カテゴリー一覧が表示されている場合、
    親カテゴリーのみに属する記事一覧はページングに対応させたいのですが、
    子カテゴリー一覧についてはページングではなく、
    「このカテゴリーの記事一覧 ≫」のリンクで問題ございません。

    子カテゴリーの記事一覧として各 5 件ずつ表示し、それぞれの最後に、「このカテゴリーの記事一覧 ≫」のような子カテゴリーページへのリンクを設置するだけで足りるのであれば、多少ややこしいページングのことを考えなくて済むので、その方が簡単です。

    仰るとおりの挙動を想定しておりました。
    ただ、子カテゴリー一覧ページを開いた際、
    子カテゴリーが親カテゴリーとなる(この場合、孫カテゴリーが子カテゴリーとなる)ことなど、
    親カテゴリーのみに属される記事もありますので、
    以下のように考えましたがいかがでしょうか。

    【親カテゴリーA一覧ページの場合】

    └ 親カテゴリーA名
      └ 親カテゴリーAのみに属する記事一覧(記事タイトル、要約、サムネイルなど)(10件)
       次のページ>「1」「2」「…」(←親カテゴリーAの次の5件、WP-PageNaviプラグインを使いたい)

    ├ 子カテゴリーAA名 (→子カテゴリーAAのカテゴリーページ「一覧」にリンク)
    │ └ 子カテゴリーAAのみに属する記事一覧(記事タイトル、要約、サムネイルなど)(5件)(←記事ページにリンク)
    └ 子カテゴリーAB名 (→子カテゴリーABのカテゴリーページ「一覧」にリンク)
      └ 子カテゴリーABのみに属する記事一覧(記事タイトル、要約、サムネイルなど)(5件)(←記事ページにリンク)

    不必要なやりとりが多いなとうんざりされているかもしれませんが (ごめんなさい) もう少し補足をお願いします。

    こちらこそ、頭を整理することまでフォローいただき、本当に感謝しております。

    これまでのやりとりから、私が解釈した形式でのコードを書いてみました。もう少しきれいに書けると良かったのですが悪しからず。 WP2.8.4 、 Default テーマでの動作を確認しています。
    WordPress ループの部分は適宜変更してください。ただ、ページ送り部分のテンプレート関数の位置には注意してください。場所によっては思わぬ挙動をするはずです。

    <?php
    if ( is_category() ) :
    
    	// クエリからカテゴリーとページ数を取得
    	$catid = get_query_var( 'cat' );
    	$paged = get_query_var( 'paged' );
    
    	// 子カテゴリーを配列で取得
    	$children = get_term_children( $catid, 'category' );
    	// 子カテゴリー一覧の表示件数 (sp = showposts)
    	$child_sp = 5;
    
    	// クエリを発行してしまうと、 single_cat_title() が機能しなくなる
    	$single_cat_title = single_cat_title( '', false );
    	// Default テーマの場合次の行のコメントを解除すると幸せ
    	// $single_cat_title = printf(__('Archive for the ‘%s’ Category', 'kubrick'), $single_cat_title);
    
    	// 子カテゴリーが存在する場合、それらを除くクエリを発行
    	if ( !empty( $children ) ) {
    		query_posts( array(
    			'category__in' => array( $catid ),
    			'category__not_in' => $children,
    			'paged' => $paged,
    		) );
    	}
    ?>
    
    	<?php if ( have_posts() ) : ?>
    
    		<h2 class="pagetitle"><?php echo $single_cat_title; ?></h2>
    
    		<?php posts_nav_link(); /* WP_PageNavi 等と置き換え */ ?>
    
    		<?php while ( have_posts() ) : the_post(); ?>
    		<div <?php post_class(); ?>>
    
    			<h3 id="post-<?php the_ID(); ?>"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
    			<small><?php the_time(__('l, F jS, Y')) ?></small>
    
    			<div class="entry">
    			<?php the_excerpt(); ?>
    			</div>
    
    			<p class="postmetadata"><?php the_tags(__('Tags:'), ', ', '<br />'); ?> <?php printf(__('Posted in %s'), get_the_category_list(', ')); ?> | <?php edit_post_link(__('Edit'), '', ' | '); ?>  <?php comments_popup_link(__('No Comments &raquo;'), __('1 Comment  &raquo;'), __('% Comments  &raquo;'), '', __('Comments Closed') ); ?></p>
    
    		</div>
    
    		<?php endwhile; ?>
    
    		<?php posts_nav_link(); /* WP_PageNavi 等と置き換え */ ?>
    
    	<?php endif; ?>
    
    <?php
    	// 子カテゴリーが存在する場合
    	if ( !empty( $children ) ) :
    
    		foreach ( $children as $child ) :
    
    			// 子カテゴリーのオブジェクトを取得
    			$child_cat_object = get_category( $child );
    			// 孫カテゴリーはスキップ
    			if ( $child_cat_object->category_parent != $catid ) continue;
    
    			// 子カテゴリー用のクエリを作成
    			query_posts( array(
    				'cat' => $child,
    				/*
    				 * 孫カテゴリーを子カテゴリーの記事として含めない場合は 'cat' => $child ではなく
    				 * 'category__in' => array( $child ),
    				 */
    				'showposts' => $child_sp,
    			) );
    ?>
    
    	<?php if ( have_posts() ) :
    		// 子カテゴリーページのタイトルと URL を取得
    		$child_cat_title = apply_filters( 'single_cat_title', get_cat_name( $child ) );
    		$child_cat_link  = get_category_link( $child );
    	?>
    
    		<h2 class="pagetitle"><a href="<?php echo $child_cat_link; ?>"><?php echo $child_cat_title; ?></a> の最新記事</h2>
    
    		<?php while ( have_posts() ) : the_post(); ?>
    		<div <?php post_class(); ?>>
    
    			<h3 id="post-<?php the_ID(); ?>"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
    			<small><?php the_time(__('l, F jS, Y')) ?></small>
    
    			<div class="entry">
    			<?php the_excerpt(); ?>
    			</div>
    
    			<p class="postmetadata"><?php the_tags(__('Tags:'), ', ', '<br />'); ?> <?php printf(__('Posted in %s'), get_the_category_list(', ')); ?> | <?php edit_post_link(__('Edit'), '', ' | '); ?>  <?php comments_popup_link(__('No Comments &raquo;'), __('1 Comment  &raquo;'), __('% Comments  &raquo;'), '', __('Comments Closed') ); ?></p>
    
    		</div>
    
    		<?php endwhile; ?>
    
    		<p class="child-nav"><a href="<?php echo $child_cat_link; ?>">「<?php echo $child_cat_title; ?>」カテゴリーの記事一覧へ &raquo;</a></p>
    
    	<?php endif; ?>
    
    <?php
    		endforeach;
    		// query_posts を発行している場合にクエリをリセット
    		wp_reset_query();
    	endif;
    endif;
    ?>

    安直に投稿してみましたが、これで正解なのか実際にはイマイチ自信がありません。動作を確認して頂いて、そうじゃないよ、というところがあれば遠慮なくご指摘ください。修正します。

    # 一部フォーラムの仕様で、数値文字参照と実体参照がうまくエスケープできてません。コピーしたあとに修正が必要です。

    いろいろと、ご配慮いただき有り難うございます!

    さっそく動作を確認させていただきましたところ、私の思ったとおりの結果で大満足です!

    孫カテゴリーを子カテゴリーの記事として含める or 含めない につきましても、
    いずれかを選択できるようコメントアウトでフォローいただき助かりました。

    私もWordPressをもっと勉強して参ります。
    この度は本当に有り難うございました!

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「親カテゴリーページで子カテゴリーの記事タイトル一覧を表示したい」には新たに返信することはできません。