じじい

カテゴリーページ(カテゴリーアーカイブ)などで、現在のカテゴリー以下に所属する記事を一覧表示する方法じゃ。

記事一覧表示

記事を一覧表示するだけなら簡単なのじゃが、下位カテゴリー(子カテゴリー)を階層表示する場合は一工夫が必要じゃった。

使用方法

まず、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(' &raquo 編集 &laquo',' | ',''); ?>
						- <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

コメントをどうぞ