category

月別アーカイブへのリストの出力を見直してみる #craftcms

2019-07-20

paginate タグが便利すぎた、と書いたんですが。

2019-07-19

今朝エラーがでてて @tinybeans がみてくれて、月別アーカイブ出してるところが問題だね、ということで。

以前書いてたこちらのがぼちぼちよろしくない、ということで。

2019-04-24
ただ、これだとエントリが多い時がなんか処理が重そうな気がするので、それは何かしら考えないといけないんだろうな。

ということで処理を見直してみた。

コード全体としてはこんな感じ

<h2>月別アーカイブ</h2>
{% spaceless %}
{% set startEntry = craft.entries().id(4127).one() %}
{% set startEntryYear = startEntry.postDate|date('Y') %}
{% set startEntryMonth = startEntry.postDate|date('n') %}
{% set nowYear = now|date('Y') %}
{% set nowMonth = now|date('n') %}

{% for year in nowYear..startEntryYear %}
<h3>{{ year }}</h3>
  <ul class="list-inline">
  {% set startMonth = '1' %}
  {% set endMonth = '12' %}
  {% if loop.first %}
    {% set endMonth = nowMonth %}
    {% else %}
    {% set endMonth = '12' %}
  {% endif %}
  {% if loop.last %}
    {% set startMonth = startEntryMonth %}
    {% else %}
    {% set startMonth = '1' %}
  {% endif %}

  {% for month in startMonth..endMonth %}
  {% set startDate = year ~ '-' ~ month ~ '-' ~ '01' %}
  {% set endDate =( startDate | date_modify('+1 month')) | date('Y-m-d') %}
  {% set count = craft.entries.section('article').postDate(['and', ">= #{startDate}", "< #{endDate}"]).count() %}
  {% if count != "0"%}<li class="list-inline-item"><a href="/archive/{{ year }}/{{ month }}">{{ month }}月({{count}})</a></li>{% endif %}
  {% endfor %}

  </ul>
{% endfor %}
{% endspaceless %}

最初(最も古い)の記事の年月を取得して、今の年月を取得しておけば、ということでそういう感じで先にセットしておく。

あとは今年から一番最初の年までループする。
そのループのなかで1月から12月までループする。
という処理だけ。

件数を取得するところを

{% set count = craft.entries.section('article').postDate(['and', ">= #{startDate}", "< #{endDate}"]).count() %}

こんなかんじでpostDateを使ってみた。とりあえず取れてるから良さそう。

countを使うようにしてみて、エラーが消えたから幾分マシになった気はする。

動的CMSの場合はこの辺もっと気をつけないとだなぁ、、、

MTだとarchivelistタグがあるから楽ちんだけど、この辺は仕方ないなー。