diff --git a/docs/content/en/templates/lists.md b/docs/content/en/templates/lists.md
index c2140b472..be9df664c 100644
--- a/docs/content/en/templates/lists.md
+++ b/docs/content/en/templates/lists.md
@@ -424,7 +424,7 @@ In the above example, you may want `{{.Title}}` to point the `title` field you h
### By Publish Date
{{< code file="layouts/partials/by-page-publish-date.html" >}}
-
+
{{ range .Pages.GroupByPublishDate "2006-01" }}
{{ .Key }}
@@ -438,6 +438,41 @@ In the above example, you may want `{{.Title}}` to point the `title` field you h
{{ end }}
{{< /code >}}
+
+### By Lastmod
+
+{{< code file="layouts/partials/by-page-lastmod.html" >}}
+
+{{ range .Pages.GroupByLastmod "2006-01" }}
+{{ .Key }}
+
+{{ end }}
+{{< /code >}}
+
+### By Expiry Date
+
+{{< code file="layouts/partials/by-page-expiry-date.html" >}}
+
+{{ range .Pages.GroupByExpiryDate "2006-01" }}
+{{ .Key }}
+
+{{ end }}
+{{< /code >}}
+
### By Page Parameter
{{< code file="layouts/partials/by-page-param.html" >}}
diff --git a/resources/page/pagegroup.go b/resources/page/pagegroup.go
index fbb6e7e53..2d37a5d4d 100644
--- a/resources/page/pagegroup.go
+++ b/resources/page/pagegroup.go
@@ -284,6 +284,20 @@ func (p Pages) GroupByExpiryDate(format string, order ...string) (PagesGroup, er
return p.groupByDateField(sorter, formatter, order...)
}
+// GroupByLastmod groups by the given page's Lastmod value in
+// the given format and with the given order.
+// Valid values for order is asc, desc, rev and reverse.
+// For valid format strings, see https://golang.org/pkg/time/#Time.Format
+func (p Pages) GroupByLastmod(format string, order ...string) (PagesGroup, error) {
+ sorter := func(p Pages) Pages {
+ return p.ByLastmod()
+ }
+ formatter := func(p Page) string {
+ return p.Lastmod().Format(format)
+ }
+ return p.groupByDateField(sorter, formatter, order...)
+}
+
// GroupByParamDate groups by a date set as a param on the page in
// the given format and with the given order.
// Valid values for order is asc, desc, rev and reverse.
diff --git a/resources/page/pagegroup_test.go b/resources/page/pagegroup_test.go
index 26a25c381..fe6dbf94b 100644
--- a/resources/page/pagegroup_test.go
+++ b/resources/page/pagegroup_test.go
@@ -49,6 +49,7 @@ func preparePageGroupTestPages(t *testing.T) Pages {
p.date = cast.ToTime(src.date)
p.pubDate = cast.ToTime(src.date)
p.expiryDate = cast.ToTime(src.date)
+ p.lastMod = cast.ToTime(src.date).AddDate(3, 0, 0)
p.params["custom_param"] = src.param
p.params["custom_date"] = cast.ToTime(src.date)
pages = append(pages, p)
@@ -378,6 +379,42 @@ func TestGroupByParamDate(t *testing.T) {
}
}
+func TestGroupByLastmod(t *testing.T) {
+ t.Parallel()
+ pages := preparePageGroupTestPages(t)
+ expect := PagesGroup{
+ {Key: "2015-04", Pages: Pages{pages[4], pages[2], pages[0]}},
+ {Key: "2015-03", Pages: Pages{pages[3]}},
+ {Key: "2015-01", Pages: Pages{pages[1]}},
+ }
+
+ groups, err := pages.GroupByLastmod("2006-01")
+ if err != nil {
+ t.Fatalf("Unable to make PagesGroup array: %s", err)
+ }
+ if !reflect.DeepEqual(groups, expect) {
+ t.Errorf("PagesGroup has unexpected groups. It should be %#v, got %#v", expect, groups)
+ }
+}
+
+func TestGroupByLastmodInReverseOrder(t *testing.T) {
+ t.Parallel()
+ pages := preparePageGroupTestPages(t)
+ expect := PagesGroup{
+ {Key: "2015-01", Pages: Pages{pages[1]}},
+ {Key: "2015-03", Pages: Pages{pages[3]}},
+ {Key: "2015-04", Pages: Pages{pages[0], pages[2], pages[4]}},
+ }
+
+ groups, err := pages.GroupByLastmod("2006-01", "asc")
+ if err != nil {
+ t.Fatalf("Unable to make PagesGroup array: %s", err)
+ }
+ if !reflect.DeepEqual(groups, expect) {
+ t.Errorf("PagesGroup has unexpected groups. It should be\n%#v, got\n%#v", expect, groups)
+ }
+}
+
func TestGroupByParamDateInReverseOrder(t *testing.T) {
t.Parallel()
pages := preparePageGroupTestPages(t)