記事につけたタグを時系列に表示するスクリプト|WordPress(ワードプレス)

需要があるのかちょっとわからないんですが、記事に使用されたタグを時系列に並べ替えるスクリプトを書いたのでメモっておきます。

クライアントからの要求としては、最新から順にエントリにタグ付けされたタグを時系列に20件取得、といったもの。

タグを表示する方法としてはwp_tag_cloudが一番簡単そうですが、残念ながらsortの基準が名前と使用数のみ。そもそもタグが、「自分が使用された最新日付」とでもいうべき数値を持っていないのではないかと。

そうすると、最新記事から順にタグを取得して20件になった時点で停止、というやり方が有効そう。

ということで書いたコードは以下です。

<?php
//最新記事を取得
query_posts(
	Array(
		'post_type' => 'post',
		'orderby' => 'date',
		'order' => 'DESC',
		'showposts' => -1,
	)
);
//タグ名とスラッグを入れる配列を定義
$namelist = array();
$sluglist = array();

if (have_posts()) : while (have_posts()) : the_post();
//記事のタグを取得して配列に格納
	$posttags = get_the_tags();
//記事がタグを持っていた場合には処理を行う
	if($posttags){
//タグの入った配列のキー一覧を取得
		$arrayKeys = array_keys($posttags);
//キーの数(タグの数)だけループ
		for($i=0;$i<count($arrayKeys);$i++){
//タグの一覧に既に含まれていない場合に処理を行う
			if(in_array($posttags[$arrayKeys[$i]]->name,$namelist)=== FALSE){
//該当タグのキーでタグ名とスラッグを取得し、各配列にpush
				$namelist[] = $posttags[$arrayKeys[$i]]->name;
				$sluglist[] = $posttags[$arrayKeys[$i]]->slug;
//タグ一覧が20件に達したら記事のタグ一覧のループを強制的に終了
				if(count($namelist)==20){
					break;
				}
			};
		}
	}
//タグ一覧が20件に達したら記事一覧のループを強制的に終了
	if(count($namelist)==20){
		break;
	}
	endwhile; endif;
	wp_reset_query();
?>
<ul>
<?php
//20件を一覧表示
	for($i=0;$i<count($namelist);$i++){
		echo '<li><a href="/blog/tag/'.$sluglist[$i].'/">'.$namelist[$i].'</a></li>';
	}
?>
</ul>

流れとしてはまず最新記事の一覧を新着順に取得して、それぞれに付加されたタグをダブらないようにチェックした上で配列に格納します。その際、スラッグを同時に取得して同様に配列に格納します。

20件に達したら処理のループを抜けて、HTMLの形式に整形しつつ吐き出します。

リンクは、そのままの形で情報として格納されてはいないので、スラッグと組み合わせるような形で生成しつつ設定します。

やり方として少々泥臭くなってしまいましたが、一応これで最新20件のタグをリスト化することができました。

誰かの役に・・・立つかな・・・

とりあえずメモってことで。