Skip to content

Commit 3d2296f

Browse files
authored
refactor: optimize lastmod as much as possible for a fixed time (#26)
### What this PR does? 优化 Sitemap 中关于文章和自定义页面的最后修改时间 how to test it? 生成 sitemap 会有缓存, 每天会重新生成一次,如果修改了文章可以重启插件让其重新生成来**测试 lastmod 的值** /kind improvement Fixes #10 ```release-note 优化 Sitemap 中关于文章和自定义页面的最后修改时间 ```
1 parent 4484433 commit 3d2296f

File tree

5 files changed

+81
-31
lines changed

5 files changed

+81
-31
lines changed

src/main/java/run/halo/sitemap/DefaultSitemapEntryLister.java

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,14 @@ public Flux<SitemapEntry> list(SitemapGeneratorOptions options) {
3636
.map(options::transform);
3737
}
3838

39-
private Flux<String> listPostUrls() {
39+
private Flux<UrlEntryMeta> listPostUrls() {
4040
return client.list(Post.class, post -> post.isPublished() && !post.isDeleted()
4141
&& Post.VisibleEnum.PUBLIC.equals(post.getSpec().getVisible()),
4242
defaultComparator())
43-
.map(post -> post.getStatusOrDefault().getPermalink());
43+
.map(Post::getStatusOrDefault)
44+
.map(status -> new UrlEntryMeta(status.getPermalink())
45+
.setLastModifiedTime(status.getLastModifyTime())
46+
);
4447
}
4548

4649
Comparator<Post> defaultComparator() {
@@ -49,13 +52,16 @@ Comparator<Post> defaultComparator() {
4952
return Comparator.comparing(createTime).thenComparing(name);
5053
}
5154

52-
private Flux<String> listSinglePageUrls() {
55+
private Flux<UrlEntryMeta> listSinglePageUrls() {
5356
return client.list(SinglePage.class, singlePage -> singlePage.isPublished()
5457
&& Objects.equals(false, singlePage.getSpec().getDeleted())
5558
&& ExtensionOperator.isNotDeleted().test(singlePage)
5659
&& Post.VisibleEnum.PUBLIC.equals(singlePage.getSpec().getVisible()),
5760
pageDefaultComparator())
58-
.map(post -> post.getStatusOrDefault().getPermalink());
61+
.map(SinglePage::getStatusOrDefault)
62+
.map(status -> new UrlEntryMeta(status.getPermalink())
63+
.setLastModifiedTime(status.getLastModifyTime())
64+
);
5965
}
6066

6167
Comparator<SinglePage> pageDefaultComparator() {
@@ -65,21 +71,23 @@ Comparator<SinglePage> pageDefaultComparator() {
6571
return Comparator.comparing(createTime).thenComparing(name);
6672
}
6773

68-
private Flux<String> listCategoryUrls() {
74+
private Flux<UrlEntryMeta> listCategoryUrls() {
6975
return client.list(Category.class,
7076
category -> category.getMetadata().getDeletionTimestamp() == null,
7177
Comparator.comparing(tag -> tag.getMetadata().getCreationTimestamp()))
72-
.map(category -> category.getStatusOrDefault().getPermalink());
78+
.map(Category::getStatusOrDefault)
79+
.map(status -> new UrlEntryMeta(status.getPermalink()));
7380
}
7481

75-
private Flux<String> listTagUrls() {
82+
private Flux<UrlEntryMeta> listTagUrls() {
7683
return client.list(Tag.class,
7784
tag -> tag.getMetadata().getDeletionTimestamp() == null,
7885
Comparator.comparing(tag -> tag.getMetadata().getCreationTimestamp()))
79-
.map(tag -> tag.getStatusOrDefault().getPermalink());
86+
.map(Tag::getStatusOrDefault)
87+
.map(status -> new UrlEntryMeta(status.getPermalink()));
8088
}
8189

82-
private Flux<String> urlsForListPages() {
90+
private Flux<UrlEntryMeta> urlsForListPages() {
8391
// TODO 优化系统其他路由获取
8492
return client.fetch(ConfigMap.class, "system")
8593
.mapNotNull(ConfigMap::getData)
@@ -92,7 +100,8 @@ private Flux<String> urlsForListPages() {
92100
StringUtils.prependIfMissing(themeRouteRules.getArchives(), "/")
93101
);
94102
})
95-
.flatMapMany(Flux::fromIterable);
103+
.flatMapMany(Flux::fromIterable)
104+
.map(url -> new UrlEntryMeta(url).setPriority(0.5));
96105
}
97106

98107
@Data

src/main/java/run/halo/sitemap/SitemapEntry.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ public class SitemapEntry {
1515
* <p>Parent tag for each URL entry. The remaining tags are children of this tag.</p>
1616
* required.
1717
*/
18-
@NonNull
1918
private String loc;
2019

2120
private String lastmod;

src/main/java/run/halo/sitemap/SitemapGeneratorOptions.java

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import lombok.Builder;
1010
import lombok.Data;
1111
import lombok.NonNull;
12-
import org.apache.commons.lang3.StringUtils;
1312
import run.halo.app.infra.utils.PathUtils;
1413

1514
/**
@@ -54,14 +53,26 @@ public class SitemapGeneratorOptions {
5453
@Builder.Default
5554
private ChangeFreqEnum changefreq = ChangeFreqEnum.DAILY;
5655

57-
@Builder.Default
58-
private double priority = 0.7;
59-
6056
/**
61-
* Add &lt;lastmod/&gt; property. Default true
57+
* How to assign sitemap priorities:
58+
* <pre>
59+
* 1.0-0.8
60+
* Homepage, product information, landing pages.
61+
*
62+
* 0.7-0.4
63+
* News articles, some weather services, blog posts, category pages, pages that no site would be complete without.
64+
*
65+
* 0.3-0.0
66+
* FAQs, outdated info, old press releases, completely static pages that are still relevant enough to keep from deleting entirely.
67+
* </pre>
68+
*
69+
* @see
70+
* <a href="https://www.contentpowered.com/blog/xml-sitemap-priority-changefreq/">xml-sitemap-priority-changefreq</a>
71+
* @see
72+
* <a href="https://slickplan.com/blog/xml-sitemap-priority-changefreq">xml-sitemap-priority-changefreq</a>
6273
*/
6374
@Builder.Default
64-
private boolean autoLastmod = true;
75+
private double priority = 0.7;
6576

6677
/**
6778
* <p>Array of relative paths (wildcard pattern supported) to exclude from listing on sitemap
@@ -79,28 +90,33 @@ public class SitemapGeneratorOptions {
7990
@Builder.Default
8091
private boolean generateIndexSitemap = true;
8192

82-
public SitemapEntry transform(String url) {
83-
if (StringUtils.isBlank(url)) {
84-
return null;
85-
}
86-
String escapedUrl = UrlUtils.escapeSitemapUrl(url);
93+
public SitemapEntry transform(UrlEntryMeta context) {
94+
String escapedUrl = UrlUtils.escapeSitemapUrl(context.getUrl());
8795
String loc = UrlUtils.toURI(escapedUrl).normalize().toASCIIString();
8896
if (!PathUtils.isAbsoluteUri(loc)) {
8997
loc = getSiteUri().resolve(escapedUrl).normalize().toASCIIString();
9098
}
9199

92-
SitemapEntry.SitemapEntryBuilder builder = SitemapEntry.builder()
100+
var builder = SitemapEntry.builder()
93101
.loc(loc)
94-
.changefreq(changefreq)
95-
.priority(priority);
102+
.changefreq(changefreq);
103+
104+
if (context.getPriority() != null) {
105+
builder.priority(context.getPriority());
106+
} else {
107+
builder.priority(priority);
108+
}
96109

97-
if (dateTimeFormatter != null && autoLastmod) {
110+
if (context.getLastModifiedTime() != null) {
111+
builder.lastmod(
112+
W3cDatetimeFormat.format(context.getLastModifiedTime(), dateTimeFormatter));
113+
} else {
98114
builder.lastmod(W3cDatetimeFormat.format(Instant.now(), dateTimeFormatter));
99115
}
116+
100117
return builder.build();
101118
}
102119

103-
104120
private URI getSiteUri() {
105121
try {
106122
return siteUrl.toURI();
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package run.halo.sitemap;
2+
3+
import io.micrometer.common.util.StringUtils;
4+
import java.time.Instant;
5+
import lombok.Data;
6+
import lombok.experimental.Accessors;
7+
8+
@Data
9+
@Accessors(chain = true)
10+
public class UrlEntryMeta {
11+
private String url;
12+
13+
/**
14+
* see also {@link SitemapGeneratorOptions#getPriority()}.
15+
*/
16+
private Double priority;
17+
18+
private Instant lastModifiedTime;
19+
20+
public UrlEntryMeta(String url) {
21+
if (StringUtils.isBlank(url)) {
22+
throw new IllegalArgumentException("url must not be blank");
23+
}
24+
this.url = url;
25+
}
26+
}

src/test/java/run/halo/sitemap/SitemapGeneratorOptionsTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,23 @@ void transform() throws MalformedURLException {
1919
SitemapGeneratorOptions options = SitemapGeneratorOptions.builder()
2020
.siteUrl(new URL("https://halo.run"))
2121
.build();
22-
SitemapEntry entry = options.transform("/about");
22+
SitemapEntry entry = options.transform(new UrlEntryMeta("/about"));
2323
assertEquals("https://halo.run/about", entry.getLoc());
2424
assertEquals(ChangeFreqEnum.DAILY, entry.getChangefreq());
2525
assertEquals(0.7, entry.getPriority());
2626

27-
entry = options.transform("/archives");
27+
entry = options.transform(new UrlEntryMeta("/archives"));
2828
assertEquals("https://halo.run/archives", entry.getLoc());
2929
assertEquals(ChangeFreqEnum.DAILY, entry.getChangefreq());
3030
assertEquals(0.7, entry.getPriority());
3131

32-
entry = options.transform("/categories/ümlat/>&>中");
32+
entry = options.transform(new UrlEntryMeta("/categories/ümlat/>&>中"));
3333
assertEquals("https://halo.run/categories/%C3%BCmlat/&gt;&amp;&gt;%E4%B8%AD",
3434
entry.getLoc());
3535
assertEquals(ChangeFreqEnum.DAILY, entry.getChangefreq());
3636
assertEquals(0.7, entry.getPriority());
3737

38-
entry = options.transform("https://guqing.xyz/hello-中国<>&");
38+
entry = options.transform(new UrlEntryMeta("https://guqing.xyz/hello-中国<>&"));
3939
assertEquals("https://guqing.xyz/hello-%E4%B8%AD%E5%9B%BD&amp;lt;&amp;gt;&amp;amp;",
4040
entry.getLoc());
4141

0 commit comments

Comments
 (0)