Browse Source

feat(widget): restrict post filter to only one tag or category

Close #815

BREAKING CHANGES

Remove `tags_include` and `tags_exclude` from `home/posts.md`
Add `filter_tag` and `filter_category` to `home/posts.md`
George Cushen 6 years ago
parent
commit
fbcb7f2761
2 changed files with 33 additions and 82 deletions
  1. 9 12
      exampleSite/content/home/posts.md
  2. 24 70
      layouts/partials/widgets/posts.html

+ 9 - 12
exampleSite/content/home/posts.md

@@ -1,23 +1,15 @@
 +++
 # Recent Posts widget.
 # This widget displays recent posts from `content/post/`.
-widget = "posts"
-active = true
+widget = "posts"  # Do not modify this line!
+active = true  # Activate this widget? true/false
+weight = 40  # Order that this section will appear.
 date = 2016-04-20T00:00:00
 
 title = "Recent Posts"
 subtitle = ""
 
-# Order that this section will appear in.
-weight = 40
-
-# Filter posts by tag.
-#  By default, show all recent posts.
-#  Filtering example: `tags_include = ["hugo", "academic"]`
-tags_include = []
-tags_exclude = []
-
-# Number of posts to list.
+# Number of recent posts to list.
 count = 5
 
 # List format.
@@ -25,5 +17,10 @@ count = 5
 #   1 = Detailed
 #   2 = Stream
 list_format = 2
+
+# Filter posts by tag or category.
+#  E.g. to only show posts tagged with `Academic`, set `filter_tag = "Academic"`
+filter_tag = ""
+filter_category = ""
 +++
 

+ 24 - 70
layouts/partials/widgets/posts.html

@@ -1,6 +1,19 @@
 {{ $ := .root }}
 {{ $page := .page }}
-{{ $posts_len := len (where (where $.Site.RegularPages "Type" "post") ".Params.notonhomepage" nil) }}
+
+{{ $query := where (where $.Site.RegularPages "Type" "post") ".Params.notonhomepage" nil }}
+{{ $archive_page := $.Site.GetPage "section" "post" }}
+
+{{/* Check if a filter should be applied. */}}
+{{ if $page.Params.filter_tag }}
+  {{ $archive_page = $.Site.GetPage (printf "tags/%s" $page.Params.filter_tag) }}
+  {{ $query = $query | intersect $archive_page.Pages }}
+{{ else if $page.Params.filter_category }}
+  {{ $archive_page = $.Site.GetPage (printf "categories/%s" $page.Params.filter_category) }}
+  {{ $query = $query | intersect $archive_page.Pages }}
+{{ end }}
+
+{{ $count := len ($query) }}
 
 <!-- Blog Posts widget -->
 <div class="row">
@@ -8,9 +21,9 @@
 
     <h1>{{ with $page.Title }}{{ . | markdownify }}{{ end }}</h1>
     {{ with $page.Params.subtitle }}<p>{{ . | markdownify }}</p>{{ end }}
-    {{ if gt $posts_len $page.Params.count }}
+    {{ if gt $count $page.Params.count }}
     <p class="view-all">
-      <a href="{{ ($.Site.GetPage "section" "post").RelPermalink }}">
+      <a href="{{ $archive_page.RelPermalink }}">
         {{ i18n "more_posts" | markdownify }}
         <i class="fas fa-angle-double-right"></i>
       </a>
@@ -22,74 +35,15 @@
 
     {{ with $page.Content }}<p>{{ . | markdownify }}</p>{{ end }}
 
-    {{ if gt (len $page.Params.tags_include) 0 }}
-      {{ $posts := where (where (where $.Site.RegularPages "Type" "post") ".Params.tags" "intersect" $page.Params.tags_include) ".Params.notonhomepage" nil }}
-
-      {{ $.Scratch.Add "show_post" "1" }}
-      {{ range $post := first $page.Params.count $posts }}
-
-        {{ $.Scratch.Set "show_post" "1" }}
-
-        {{/* If `tags_include` is set, exclude posts with no tags. */}}
-        {{ with (not .Params.tags) }}
-          {{ with $page.Params.tags_include }}
-            {{ $.Scratch.Set "show_post" "0" }}
-          {{end}}
-        {{end}}
-        {{/* If `tags_exclude` is set, exclude posts. */}}
-        {{ range $key, $val := .Params.tags }}
-          {{ if in $page.Params.tags_exclude $val }}
-          {{ $.Scratch.Set "show_post" "0" }}
-        {{end}}
-      {{end}}
-
-      {{ $show_post := $.Scratch.Get "show_post" }}
-      {{ if ne $show_post "0" }}
-        {{ if eq $page.Params.list_format 0 }}
-          {{ partial "post_li_simple" . }}
-        {{ else if eq $page.Params.list_format 1 }}
-          {{ partial "post_li_detailed" . }}
-        {{ else }}
-          {{ partial "post_li_stream" . }}
-        {{ end }}
-      {{end}}
-
+    {{ range $post := first $page.Params.count $query }}
+      {{ if eq $page.Params.list_format 0 }}
+        {{ partial "post_li_simple" . }}
+      {{ else if eq $page.Params.list_format 1 }}
+        {{ partial "post_li_detailed" . }}
+      {{ else }}
+        {{ partial "post_li_stream" . }}
       {{ end }}
-    {{ else}}
-      {{ $posts := where (where $.Site.RegularPages "Type" "post") ".Params.notonhomepage" nil }}
-
-      {{ $.Scratch.Add "show_post" "1" }}
-      {{ range $post := first $page.Params.count $posts }}
-
-        {{ $.Scratch.Set "show_post" "1" }}
-
-        {{/* If `tags_include` is set, exclude posts with no tags. */}}
-        {{ with (not .Params.tags) }}
-          {{ with $page.Params.tags_include }}
-            {{ $.Scratch.Set "show_post" "0" }}
-          {{end}}
-        {{end}}
-
-        {{/* If `tags_exclude` is set, exclude posts. */}}
-        {{ range $key, $val := .Params.tags }}
-          {{ if in $page.Params.tags_exclude $val }}
-          {{ $.Scratch.Set "show_post" "0" }}
-        {{end}}
-      {{end}}
-
-      {{ $show_post := $.Scratch.Get "show_post" }}
-      {{ if ne $show_post "0" }}
-        {{ if eq $page.Params.list_format 0 }}
-          {{ partial "post_li_simple" . }}
-        {{ else if eq $page.Params.list_format 1 }}
-          {{ partial "post_li_detailed" . }}
-        {{ else }}
-          {{ partial "post_li_stream" . }}
-        {{ end }}
-      {{end}}
-
-      {{ end }}
-    {{ end }}
+    {{end}}
 
   </div>
 </div>