カテゴリーページ(カテゴリーアーカイブ)などで、現在のカテゴリー以下に所属する記事を一覧表示する方法じゃ。
記事を一覧表示するだけなら簡単なのじゃが、下位カテゴリー(子カテゴリー)を階層表示する場合は一工夫が必要じゃった。
使用方法
まず、functions.phpに下記コードを記述する。
/***** カテゴリ一覧表示 *****/
function get_child_category_all($id,$odrby,$odr) {
if ( $odrby == 'title' ) $odrby = 'name';
elseif ( $odrby == 'date' ) $odrby = 'name';
elseif ( $odrby == 'menu_order') $odrby = 'order';
// 全カテゴリ取得 オブジェクトキャッシュを利用
if ( ! $terms = wp_cache_get( 'all_category_lists', 'category' ) ) {
$terms = get_terms( 'category', 'fields=all&get=all&orderby=' . $odrby . '&order=' . $odr );
// オブジェクトキャッシュに追加
wp_cache_add( 'all_category_lists', $cat_all, 'category' );
}
$cat_all = array();
if(!$id){
$cat_all = $terms;
}else{
foreach ($terms as $term) {
// 引数1が引数2の親である場合にtrueを返す。('1','4')ではなく(1,4)で指定。
if( cat_is_ancestor_of($id, $term->term_id) ) array_push($cat_all, $term);
}
}
return $cat_all;
}
function get_cat_archive_list($list,$showpost,$odrby,$odr) {
// $list 出力対象カテゴリID(複数「,」区切り) : 指定なし or 0=すべて
// $showpost 指定カテゴリ内の投稿記事タイトルを表示しない : true / false(デフォルト)
// $odrby ソート項目 : date/name/id/order
// $odr ソート順 : DESC/ASC
$ary = explode(",",$list); // 第一階層
foreach($ary as $id){
$url = get_category_link($id);
$nam = get_cat_name($id);
?>
<div class="post_list">
<ul>
<!--<li class="catname"><a href="<?php echo get_category_link($id) ?>"><?php echo get_cat_name($id) ?></a></li>-->
<?php
if (!$showpost) get_child_category_post($id,false,$odrby,$odr,'','');
$terms = get_child_category_all($id,$odrby,$odr); // 第二階層
foreach ($terms as $term) {
$counter = new WP_Query("posts_per_page=-1&cat=$term->term_id");// 記事がない場合はカテゴリ名も表示しない
if ($term->parent == $id && $counter->have_posts()) { ?>
<li class="catname"><a href="<?php echo get_category_link($term->term_id) ?>"><?php echo get_cat_name($term->term_id) ?></a></li>
<?php if (!$showpost) get_child_category_post($term->term_id,false,$odrby,$odr,'<ul>','</ul>');
$chi = get_child_category_all($term->term_id,$odrby,$odr); // 第三階層
foreach ($chi as $chi_id) {
$counter = new WP_Query("posts_per_page=-1&cat=$chi_id->term_id");
if ($chi_id->parent == $term->term_id && $counter->have_posts()) { ?>
<ul>
<li class="catname"><a href="<?php echo get_category_link($chi_id->term_id) ?>"><?php echo get_cat_name($chi_id->term_id) ?></a></li>
<?php if (!$showpost) get_child_category_post($chi_id->term_id,false,$odrby,$odr,'<ul>','</ul>');
$chi2 = get_child_category_all($chi_id->term_id,$odrby,$odr); // 第四階層
foreach ($chi2 as $chi_id2) {
$counter = new WP_Query("posts_per_page=-1&cat=$chi_id2->term_id");
if ($chi_id2->parent == $term->term_id && $counter->have_posts()) { ?>
<ul>
<li class="catname"><a href="<?php echo get_category_link($chi_id2->term_id) ?>"><?php echo get_cat_name($chi_id2->term_id) ?></a></li>
<?php if (!$showpost) get_child_category_post($chi_id2->term_id,true,$odrby,$odr,'<ul>','</ul>'); // カテゴリ以下全て
?>
</ul>
<?php } ?>
<?php } ?>
</ul>
<?php }
}
}
} ?>
</ul>
</div>
<?php }
}
function get_child_category_post($cat_id,$recflg,$odrby,$odr,$before,$after) {
// $recflg:指定カテゴリ以下すべての記事を出力する false/true
// $before:最初に出力する文字 デフォルト空白
// $after:最後に出力する文字 デフォルト空白
global $post;
$flg = false;
$posts_data = get_posts("numberposts=-1&category=$cat_id&orderby=$odrby&order=$odr");
if($posts_data){ ?>
<?php foreach ($posts_data as $post){
setup_postdata($post);
if($recflg || in_category($cat_id)) {
if(!$flg) {echo $before;$flg=true;}
$str=mb_strimwidth(the_title('','',false), 0, 80, '...',utf8);//半角80文字以上は...と略す ?>
<li class="postname"><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php echo $str; ?></a>
<span class="cat_list_archive">
<?php the_tags(' - <span class="tags">', ', ', '</span>'); ?>
<?php if ( comments_open() ) : ?>
- <span class="bubble"><?php comments_popup_link('コメント','コメント (1)', 'コメント (%)', '',''); ?></span>
<?php endif; ?>
<?php edit_post_link(' » 編集 «',' | ',''); ?>
- <span class="date_list"><?php the_time('Y/m/d G:i'); ?></span>
</span>
</li>
<?php }
}
if($flg) echo $after;
}
}
記事タイトルが長いと改行されてしまうので、半角80文字以上の場合は「 ... 」に略すようにしておる。
また、4階層以上の記事は、4階層目に集約して出力しておる。必要があれば適時修正して欲しい。
次に、記事一覧を表示させたい場所で関数を呼び出す。
index.php、archive.php、category.phpなど。
<?php
$cat_id = get_query_var('cat'); // 現在のカテゴリIDを取得
get_cat_archive_list($cat_id);
?>
カテゴリ: WordPress小技集
2010/05/06 9:15


