Grav の Twig テンプレートで、公開済みの最新記事一覧を出力する

10月から、このブログを Grav に切り替えました。

Grav - A Modern Flat-File CMS | Grav:
https://getgrav.org/

データベース不要の Flat-File CMS の一種で、記事は Markdown 形式で保存されます。そのため、従来 Middleman で利用していたデータを meta 関連の調整くらいで流用でき、移行も比較的簡単です。

ただ、最新記事の一覧を出力するにあたり参考にした公式リファレンスの記述だと非公開記事も含まれてしまったため、絞り込む方法を調べてみました。

List the last 5 recent blog posts | Twig Recipes | Grav Documentation:
https://learn.getgrav.org/cookbook/twig-recipes#list-the-last-5-recent-blog-posts

やったこと

サンプルコードは、下記のようになっています。

<ul>
{% for post in page.find('/blog').children.order('date', 'desc').slice(0, 5) %}
  <li class="recent-posts">
    <strong><a href="{{ post.url }}">{{ post.title }}</a></strong>
  </li>
{% endfor %}
</ul>

これは /blog に属する記事を日付順に最新5件 までループ処理する意図なのですが、残念ながら非公開や予約投稿にあたる記事も含まれてしまいます。

表示対象となる記事データは Collection と呼ばれるオブジェクトに配列として入ることから、そのオブジェクトに関する仕様を確認すると Collection::published() なる method で絞り込みができる模様です。

Collection Object - Page Collections | Grav Documentation:
https://learn.getgrav.org/content/collections#collection-object

そこで、テンプレートの .children.order('date', 'desc').children.published.order('date', 'desc') に変更。

<ul>
{% for post in page.find('/blog').children.published.order('date', 'desc').slice(0, 5) %}
  <li class="recent-posts">
    <strong><a href="{{ post.url }}">{{ post.title }}</a></strong>
  </li>
{% endfor %}
</ul>

これで公開記事のみに絞り込むことができました。

他にも任意の期間で絞り込んだり、ランダムに取得する method などもありますので、必要に応じて使い分けようと思います。

comments powered by Disqus