タグアーカイブページでタグ名を取得する
ブログのタグアーカイブページ(https://hubspot.pensees.co.jp/tips/tag/cms など)では、「tag」の変数名でタグのスラッグは取得できますが肝心のタグ名が取得できません。タグ名をタイトルなどで表示しようと思うと地味に困るこの仕様ですが、解決策がありますので紹介します。
方法1. blog_tagsを使う(ちょっと不確実なやり方)
まず最初に思い付いたのがこの方法で、blog_tags
関数を使います。この関数でそのブログのタグをたくさん取得し、forループ内でスラッグが一致したらタグ名を出力する、という考え方です。コードはおおよそ次の通りです。
{%- for blog_tag in blog_tags('default', 250) -%} {%- if blog_tag.slug == tag -%} {{ blog_tag }} {%- endif -%} {%- endfor -%}
シンプルな考え方ではありますがこの方法には欠点があり、タグが250を超えた場合に確実に取得できる保障がありません。現実にタグが250を超えるケースに遭遇したことはなく、またそんな状況はメディアとしてタグ運用を考え直した方がよいですが、それはそれ、これはこれでプログラムとしてはどんな状況であろうと動くことを担保したいものです。
そして辿り着いたのが、次の方法です。
方法2. いったん記事を取得する
タグ名を出力するに当たり、欲しいのはタグオブジェクト(ディクショナリ)です。これを取得するのに確実な方法は何かと考えたときに思い当たったのが、記事を取得することでした。
記事は topic_list
変数がタグの配列になっており、そのメンバがタグのオブジェクトになっています。
- タグアーカイブが出力されており
- かつ画面上からタグアーカイブに遷移できる
ということはそのタグが付いた記事が必ず1つ以上あることになりますので、この確実性を利用しblog_recent_tag_posts
関数を使用してタグのオブジェクトを取得します。コードは次の通りです。
{%- set tag_posts = blog_recent_tag_posts('default', [tag], 1) -%} {%- for blog_tag in tag_posts[0].topic_list -%} {%- if blog_tag.slug == tag -%} {{ blog_tag.name }} {%- endif -%} {%- endfor -%}
これで、例えタグの数が250以上あろうとも確実にタグ名を取得できるようになりました。