eijiy さん、こんばんは。
投稿は複数のカテゴリーを持つことがあるので、get_the_category() でカテゴリーオブジェクトの配列を取得してループさせればいいと思います。
<?php
if ( is_single() ) :
$categories = get_the_category( $post->ID );
// カテゴリー ID 順に並べ替える場合は下の行をアンコメント
// if ( !empty( $categories ) ) usort( $categories, '_usort_terms_by_ID' );
foreach ( $categories as $cnt => $cat ) :
?>
<div id="toggler-<?php echo $cnt+1; ?>" class="opened" title="<?php echo esc_attr( $cat->name ); ?> の投稿一覧">
<div>
<ul>
<?php
$single_posts = get_posts( "numberposts=-1&category=$cat->term_ID&order=asc" );
foreach ( $single_posts as $post ) :
?>
<li><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
<?php
endforeach; // single_posts
?>
</ul>
</div>
</div>
<?php
endforeach; // categories
endif; // is_single
?>
動作は未確認ですがこんな感じでしょうか。
# $cat->term_ID は $cat->cat_ID 、 $cat->name は $cat->cat_name でもいいと思います。
mizubeさん、返信ありがとうございます。
紹介していただいたコードでも同じように、全ての投稿一覧が表示されてしまいます。
カテゴリー名は表示されるようになりましたが、どのカテゴリーに属する記事であっても親カテゴリーABCDの内Dしか表示されません。尚、Dのみ子カテゴリーがありません。
解説サイトで、get_the_categoryではIDが正しく取得できないことがあるとか書いてありましたが、どうなんでしょうか。
eijiy さん
紹介していただいたコードでも同じように、全ての投稿一覧が表示されてしまいます。
ごめんなさい、これの原因は私のミスです。
$cat->term_ID
となっているところは、正しくは $cat->term_id
でした。
大変申し訳ありません。正しくは
<?php
if ( is_single() ) :
$categories = get_the_category( $post->ID );
// カテゴリー ID 順に並べ替える場合は下の行をアンコメント
// if ( !empty( $categories ) ) usort( $categories, '_usort_terms_by_ID' );
foreach ( $categories as $cnt => $cat ) :
?>
<div id="toggler-<?php echo $cnt+1; ?>" class="opened" title="<?php echo esc_attr( $cat->name ); ?> の投稿一覧">
<div>
<ul>
<?php
$single_posts = get_posts( "numberposts=-1&category=$cat->term_id&order=asc" );
foreach ( $single_posts as $post ) :
?>
<li><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
<?php
endforeach; // single_posts
?>
</ul>
</div>
</div>
<?php
endforeach; // categories
endif; // is_single
?>
です。これでもう一度お試しください。
カテゴリー名は表示されるようになりましたが、どのカテゴリーに属する記事であっても親カテゴリーABCDの内Dしか表示されません。尚、Dのみ子カテゴリーがありません。
これについては現象をよく理解できませんでした。
が、もしかすると上記の修正で解決することかもしれません。
以下のコードAとコードBを試している最中、不思議な事に両方とも記述するとコードBが思い通りに動き、コードAを外すとコードBが思い通りに動きません。
コードA
<?php
if ( is_single() ) :
$categories = get_the_category( $post->ID );
// カテゴリー ID 順に並べ替える場合は下の行をアンコメント
// if ( !empty( $categories ) ) usort( $categories, '_usort_terms_by_ID' );
foreach ( $categories as $cnt => $cat ) :
?>
<div id="toggler-<?php echo $cnt+1; ?>" class="closed" title="<?php echo esc_attr( $cat->name ); ?> の投稿一覧">
<div>
<ul>
<?php
$single_posts = get_posts( "numberposts=-1&category=$cat->term_ID&order=asc" );
foreach ( $single_posts as $post ) :
?>
<li><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
<?php
endforeach; // single_posts
?>
</ul>
</div>
</div>
<?php
endforeach; // categories
endif; // is_single
?>
コードB
<?php if (is_single()) : ?>
<ul>
<?php
$cat = get_the_category(); $cat = $cat[0];
//子孫が要る時
remove_filter( 'pre_option_category_children', 'my_category_children' );
//子孫が要らない時
//add_filter( 'pre_option_category_children', 'my_category_children' );
//
$myposts = get_posts('category='. $cat->cat_ID);
//$myposts = get_posts('category='. $cat->category_parent);
foreach($myposts as $post) :
?>
<li><a href="<?php the_permalink() ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
ここで言う思い通りの動きとは、単一記事表示中は同一カテゴリーの投稿一覧をサイドバーに表示させたいという事ですが、どうしてコードAを外すとコードBが機能しなくなるのでしょうか。
どなたかご教授頂けないでしょうか。
尚、コードBの子孫が要る時と要らない時は、自作テーマのfunctions.phpに以下のコードを記述(フォーラムから引用)しています。
function my_category_children( $return ) {
return array();
}
add_filter( 'pre_option_category_children', 'my_category_children' );
宜しくお願い致します。
mizubeさんのコードで試した結果、どのカテゴリーに属する記事であっても親A,B,C,Dカテゴリーの内、子カテゴリーを持たないカテゴリーDの名前と投稿一覧がされました。
うーん、ごめんなさい。もしかすると私ではお役に立てないかもしれません。
実は、修正後の私のコードですが、WP Multibyte Patch のみを有効化した WP3.0.1 で TwentyTen テーマの sidebar.php に追加したところ、きちんと動作していることを確認しました(つまり、本当は単一記事が属するすべてのカテゴリーの投稿一覧が表示されるはずなんです)。
もしかすると eijiy さんの追加した別のコードに起因している現象かもしれません。
このコードより前に $post の値が書き換わるような処理を行うコードを single.php または sidebar.php に記述していませんか? その場合は、意味があるかどうか怪しいですが、私の提示したコードの先頭を
<?php if ( is_single() ) : ?>
から
<?php if ( is_single() ) : wp_reset_query(); ?>
に変更してみてください。
mizubeさん、wp_reset_query()を追加する事で思い通りになりました。
<?php
if ( is_single() ) : wp_reset_query();
$categories = get_the_category( $post->ID );
// カテゴリー ID 順に並べ替える場合は下の行をアンコメント
// if ( !empty( $categories ) ) usort( $categories, '_usort_terms_by_ID' );
foreach ( $categories as $cnt => $cat ) :
?>
<div id="toggler-<?php echo $cnt+1; ?>" class="opened" title="<?php echo esc_attr( $cat->cat_name ); ?> の投稿一覧">
<div>
<ul>
<?php
//子孫が要る時
//remove_filter( 'pre_option_category_children', 'my_category_children' );
//子孫が要らない時
add_filter( 'pre_option_category_children', 'my_category_children' );
//
$single_posts = get_posts( "numberposts=-1&category=$cat->cat_ID&order=asc" ); //$cat->term_idでもいい
foreach ( $single_posts as $post ) :
?>
<li><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
<?php
endforeach; // single_posts
?>
</ul>
</div>
</div>
<?php
endforeach; // categories
endif; // is_single
?>
ちょっと追加してますが、お陰で完成しました。
ありがとうございました。
また機会があれば宜しくお願い致します。