2016年、2017年、2018年というような「年度」をカスタムタクソノミータームとした、毎年タームが増えていくWordPressサイトを作った時のメモです。
グローバルメニューの中に「最新年度のカスタムタクソノミーアーカイブページヘのリンク」が必要で、年度が変わってタームが増えたら自動的に最新年度ページへのリンクを出力する仕組みが必要になりました。
今年が2016年だったとして、来年になったら自動的に2017年のカスタムタクソノミータームアーカイブページへリンクを切り替えたいわけです。
仕様として、カスタムタクソノミーは「year」、タームは前述のように「年度」、タームスラッグは「西暦」とします。
コードを以下のように作りました。
<ul>
<?php
/**
* カスタムタクソノミー「year」のタームアカーイブページヘのリンクを動的に表示させる
* 仕様としてカスタムタクソノミーのスラッグは西暦を使っていて、西暦を降順で取得し、一つ目のデータからリンクを生成する
*/
//ソートの仕方を指定
$args = array(
'hide_empty' => 0, // デフォルトでは投稿を持っていない(空の)タームを返さない。 0=falseを指定すると返す。
'orderby' => 'slug',
'order' => 'DESC'
);
//ソートしたタームの配列を取得
$terms = get_terms( 'year', $args);
//最新の西暦のタームへのリンクを出力
echo '<li class="menu-item"><a href="';
echo home_url() . '?taxonomy=year&term=' . $terms[0]->slug . '/'; //ソートしたタームの一つ目からurlを生成
echo '">最新の西暦</a></li>';
?>
</ul>
タクソノミー「year」のターム「西暦」の最新を取得するために、get_terms()でターム情報が入ったオブジェクトを取得し、「最新の西暦」であるタームを取得するためにタームスラッグを降順でソート。タームスラッグを西暦にしてあるので、新しい年が常にオブジェクトの一番目に来ます。
取得したターム「最新の西暦」の名前とスラッグを組み合わせてリンクを生成します。
get_terms()の二番目の引数のオプションに「hide_empty」というのがあるのですが、これでハマりました。デフォルトではtrueになっているのですが、そのままだと「タームは作ったけど投稿はまだ無い」という場合に、オブジェクトの中に入ってきません。場合によっては$terms[0]->slugで取りたくても[0]が無い!という状況になってしまいます。
うまくいかない時はこのオプションに注意したほうが良さそうです。