hexo-修改永久链接后,如何保留旧链接

当你想修改hexo博客的永久链接(permalink),又不想让旧链接失效,可以考虑下这种方法

up主在 2021-10-01 这天修改了永久链接的规则,为了不影响之前已发布的文章链接,我们通过扩展API给以前的文档生成两个路由,让之前的文章同时支持两种链接:

  • befor: :year-:month-:day-:title
  • after: :year-:month-:day-:title and :title

官方已经给出了插件的使用防范:https://hexo.io/zh-cn/api/generator#%E7%94%9F%E6%88%90%E6%89%80%E6%9C%89%E6%96%87%E7%AB%A0,

但是,按官方提供的demo修改完之后,发现sidebar不出现了,导致布局乱套了,不但侧边栏(sidebar)没了,上一篇/下一篇的按钮也没了

通过查看正常和不正常的页面的源代码(浏览器右键->源码->搜索”sidebar”,对比两个页面),发现:

themes/ButterflyOut/layout/includes/head/config_site.pug:16 – isSidebar 为 true 时,侧边栏(TOC)才会出现;

查看源码得知:

themes/ButterflyOut/layout/includes/head/config_site.pug:8 – 由于 is_post 返回false,导致 isSiderBar = false

is_posthexo 源码看,

node_modules/hexo/lib/plugins/helper/index.js:34 – is_post 其实就是 is.post() 方法返回的

node_modules/hexo/lib/plugins/helper/is.js:27 – is.post() 方法里面就一个属性 page.__post

node_modules/hexo/lib/plugins/generator/post.js:23 – 最终发现是这里赋值的,并且这里上下文的方法不就是跟我们这个插件所覆盖的功能嘛,我们可以模仿这里的写法来优化的插件

code show

在hexo项目根目录下新建脚本:scripts/redefine_permalink.js(脚本名字随意)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// 2021-10-15,up主修改了永久链接的规则,为了不影响之前已发布的文章链接,我们这里修改下生成文章的脚本,让之前的文章同时支持两种链接:
// - befor: `:year-:month-:day-:title`
// - after: `:year-:month-:day-:title` and `:title`
var postDateV1 = new Date("2021-10-15");

hexo.extend.generator.register("post", function (locals) {
const posts = locals.posts.sort("-date").toArray();
let length = locals.posts.length;
return locals.posts
.map(function (post, i) {
const { path, layout } = post;
// 不需要 layout
if (!layout || layout === "false") {
return {
path,
data: post.content,
};
}
// 上一篇 / 下一篇
if (i) post.prev = posts[i - 1];
if (i < length - 1) post.next = posts[i + 1];

const layouts = ["post", "page", "index"];
if (layout !== "post") layouts.unshift(layout);
post.__post = true; // 见源码

// 我们最开始的目的:兼容两种 Permalink
var date = new Date(post.date);
if (date < postDateV1 && post.date) {
const oldLink = post.date.format("YYYY/MM/DD/") + post.path;
console.log("oldLink", oldLink);
return [
{
path: oldLink,
data: post,
layout: "post",
},
{
path: post.path,
data: post,
layout: "post",
},
];
}
return [
{
path: post.path,
data: post,
layout: "post",
},
];
})
.reduce(function (a, b) {
return a.concat(b);
});
});

Q&A

  • 会不会影响到评论插件

    评论插件是根据 title 来生成issue的,所以不会影响评论

参考

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注