月別・カテゴリ別・タグ別 記事一覧(Archives)作成方法

wordpressにて月別・カテゴリ別・タグ別で記事一覧を作成する。

全部表示なんて重たいことはしたくない。
出来れば月毎にタイトル一覧を全部表示したいなんてそんな人に。
記事内でPHPを実行できるプラグインを入れた後に以下を適用。

出来上がるとこんな感じ。

※日に日に直してます。

Archives:月別メニュー

<ul class="custom_menu"><?php
// 月
$args = array(
		'type' => 'monthly', 'limit' => '',
		'format' => 'html',
		'show_post_count' => true,
		'echo' => 0
	);
$links = wp_get_archives($args);
print_r($links);
?></ul>

Category:カテゴリ別メニュー

<ul class="custom_menu"><?php
$wp_cats = get_categories(array('hide_empty' => true));
foreach( $wp_cats as $wckey => $wcval ){
	print('<li><a href="'.get_option('siteurl')."/category/".$wcval->slug.'">'.$wcval->name.'</a> ('.$wcval->count.')</li>');
}
?></ul>

Tag:タグ別メニュー

<ul class="custom_menu"><?php
$wp_tags = get_tags(array('hide_empty' => true));
$first = reset($wp_tags);
foreach( $wp_tags as $wtkey => $wtval ){
	print('<li><a href="'.get_option('siteurl')."/?tag=".$wtval->slug.'">'.$wtval->name.'</a> ('.$wtval->count.')</li>');
}
?></ul>

記事一覧を出す

これは3環境とも使いまわせるようにまったく同じなので、お好みで外部ファイル化してもいい。
ただ『ケータイ対応プラグイン』入れてる人は、get_template_directory()とかテーマの入ってるところを基準にしてincludeすると、ケータイでnot finedとか出るから注意。

<?php
query_posts($query_string."");

// list
$plus = "";
if($paged){	$plus.= "&paged=".$paged;	}
if($_REQUEST['ctg']){ $plus.= "&cat=".htmlentities($_REQUEST['ctg'],ENT_QUOTES,"UTF-8");	}
if($_REQUEST['tg']){
//$plus.= "&tag_id=".htmlentities($_REQUEST['tg'],ENT_QUOTES,"UTF-8");
$plus.= "&tag=".htmlentities($_REQUEST['tg'],ENT_QUOTES,"UTF-8");
}

if($_REQUEST['archives']){
	$plus.= "&m=".preg_replace("/[^0-9]/", "",$_REQUEST['archives']);
}else{
	if($_REQUEST['year']){ $plus.= "&year=".preg_replace("/[^0-9]/", "",$_REQUEST['year']);	}
	if($_REQUEST['month']){ $plus.= "&monthnum=".preg_replace("/[^0-9]/", "",$_REQUEST['month']);	}
	if($_REQUEST['day']){ $plus.= "&day=".preg_replace("/[^0-9]/", "",$_REQUEST['day']);	}
}

if (have_posts()) :  query_posts('&posts_per_page=-1&order=DESC'.$plus);
//if (have_posts()) :  query_posts($getlistArray);
	$qp_cnt = 0;
	while (have_posts()) : the_post();
	   if ($qp_cnt == 0){
		$answer = "";
		if (is_category()) {	// category
			$answer.= " category:".single_cat_title('', false);
		}
		if (is_tag()) {	// tag
			$answer.= " tag:".single_tag_title('', false);
		}
		if (is_day()) {	// day
			$answer.= " ".get_the_time(__('Y-m-d'));
		}elseif (is_month()) {	// month
			$answer.= " ".get_the_time(__('Y-m'));
		}elseif (is_year()) {	// year
			$answer.= " ".get_the_time('Y');
		}
		?>
		<h3>Archives for<?php print($answer); ?></h3>
		<ul class="archive  custom_list">
<?php }	?>
    <li><a href="<?php the_permalink() ?>"><?php the_title(); ?></a><small> [<?php the_time('Y-m-d') ?>]</small></li>
<?php $qp_cnt++;	endwhile; ?>
</ul>

<!--div class="navigation">
   <div class="alignleft">
   <?php next_posts_link(__('&laquo; Older Entries', 'kubrick')); ?>
 </div>
   <div class="alignright">
   <?php previous_posts_link(__('Newer Entries &raquo;', 'kubrick')); ?>
 </div>
</div-->
<?php endif; ?>

<?php
wp_reset_query();
query_posts($query_string."");
?>

これは気をつけないといけないこといくつかあったと思うけども…。

全記事表示とか重たくなるから『?archive=年月』のパラメータで内容変更出来る下記のパターンのが安全かと

<ul class="archive"><?php
$get_archive = isset($_GET["archive"]) ? $_GET["archive"] : date("Ym");
$get_archive = preg_replace("/[^0-9]/", "",$get_archive);

if(strlen($get_archive) >= 6)
{
	$dates['year'] = mb_strimwidth($get_archive,0,4);
	$dates['month'] = mb_strimwidth($get_archive,4,2);

	print("<h4>Archives at {$get_archive}</h4>");
	//$posts = get_posts('numberposts=100&category=5');//カテゴリで云々したい場合はこのような形
	$posts = get_posts('numberposts=100&m='.$get_archive);
	if($posts){
		foreach($posts as $post){
			// ページID指定の場合
			$post_url = esc_url( site_url() )."/?p=".$post->ID;
			print('<li><a href="'.$post_url.'">'.$post->post_title.'</a></ li>');
			// パーマリンクの場合
			$post_url = esc_url( site_url() )."/{$dates['year']}/{$dates['month']}/".$post->post_name;
			print('<li><a href="'.$post_url.'">'.$post->post_title.'</a></ li>');
		}
	}else{
		print('<li>該当記事はありません。</ li>');
	}
}
?></ul>

コメント

タイトルとURLをコピーしました