自定义首页

默认首页是最近发布页面,可以通过自定义首页来改变默认行为.

第一步,修改根目录的_config.yaml

目的是将官方的近期发布迁移至一个虚拟的路径, 之前的近期文章列表就到了/lately

_config.yml
1
2
3
4
index_generator:
path: 'lately'
per_page: 10
order_by: -date

第二步,新建并自定义index.md文件

在blog/source目录下新建index.md文件,注意要将路径permalink设置为/ 以下是参考

blog/source/index.md
1
2
3
4
5
6
7
8
9
10
11
12
---
#title: '自定义首页'
menu_id: social
nav_tabs: true # 开启上方标签栏
breadcrumb: false # 关闭面包屑导航
permalink: / # 确保就是根路径(保险起见加上)
leftbar: related, linklist, recent # 开启左侧组件
rightbar: welcome # 开启左侧组件
comments: false # 关闭评论
---
主页
在此自行布局

现在打开博客即可进入自定义首页,而不是近期发布栏.
通过增加Front-matter内容丰富首页的显示效果.
需要增加首页按钮的,在nav_tabs中添加首页,路径为/,并修改nav_tabs_blog.ejs.

修改后请备份,防止主题更新覆盖,方法如下:

增加导航栏首页button

1
2
3
4
5
6
# 站点主结构树
site_tree:
# ...
index_blog:
nav_tabs:
'首页': /

替换nav_tabs_blog.ejs如下

/themes/stellar/layout/includes/nav_tabs_blog.ejs
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<%
function layoutDiv() {
var el = '';
el += '<div class="navbar top">';
el += '<div class="navbar-blur">';
el += '<div class="navbar-container">';
el += '<nav class="post">';

const { nav_tabs } = theme.site_tree.index_blog;

// 0️⃣ 特殊处理:将 nav_tabs 中的“首页”提取到最前面
if (nav_tabs && nav_tabs['首页']) {
const homeUrl = nav_tabs['首页'];

// 修正判定逻辑:仅在当前路径与首页链接一致时高亮(不使用 is_home)
const currentUrl = full_url_for(page.path || '/');
const targetHome = full_url_for(homeUrl || '/');
const isHomeActive = currentUrl === targetHome;

if (isHomeActive) {
el += '<a class="active" href="' + url_for(homeUrl) + '">首页</a>';
} else {
el += '<a href="' + url_for(homeUrl) + '">首页</a>';
}
}


// 1️⃣ 最近发布:按路径匹配激活(不使用 is_home)
{
const recentUrl = pretty_url(config.index_generator.path);
const isRecentActive = full_url_for(page.path || '').startsWith(full_url_for(recentUrl));
if (isRecentActive) {
el += '<a class="active" href="' + recentUrl + '">' + __("btn.recent_publish") + '</a>';
} else {
el += '<a href="' + recentUrl + '">' + __("btn.recent_publish") + '</a>';
}
}

// 2️⃣ 分类 (原有逻辑)
if (site.categories && site.categories.length > 0) {
if (page.category) {
el += '<a class="active" href="' + pretty_url(config.category_dir) + '">' + __("btn.category") + __("symbol.colon") + page.category + '</a>';
} else if (page.layout == "categories") {
el += '<a class="active" href="' + pretty_url(config.category_dir) + '">' + __("btn.categories") + '</a>';
} else {
el += '<a href="' + pretty_url(config.category_dir) + '">' + __("btn.categories") + '</a>';
}
}

// 3️⃣ 标签 (原有逻辑)
if (site.tags && site.tags.length > 0) {
if (page.tag) {
el += '<a class="active" href="' + pretty_url(config.tag_dir) + '">' + __("btn.tag") + __("symbol.colon") + page.tag + '</a>';
} else if (page.layout == "tags") {
el += '<a class="active" href="' + pretty_url(config.tag_dir) + '">' + __("btn.tags") + '</a>';
} else {
el += '<a href="' + pretty_url(config.tag_dir) + '">' + __("btn.tags") + '</a>';
}
}

// 4️⃣ 专栏 (原有逻辑)
if (theme.topic?.publish_list?.length > 0) {
if (page.layout == 'index_topic') {
el += '<a class="active" href="' + pretty_url(theme.site_tree.index_topic.base_dir) + '">' + __("btn.topic") + '</a>';
} else {
el += '<a href="' + pretty_url(theme.site_tree.index_topic.base_dir) + '">' + __("btn.topic") + '</a>';
}
}

// 5️⃣ 其余自定义 nav_tabs(排除“首页”)
if (nav_tabs) {
for (let key of Object.keys(nav_tabs)) {
if (key === '首页') continue; // 跳过已经渲染过的首页
if (full_url_for(page.path).startsWith(full_url_for(nav_tabs[key]))){
el += '<a class="active" href="' + url_for(nav_tabs[key]) + '">' + key + '</a>';
} else {
el += '<a href="' + url_for(nav_tabs[key]) + '">' + key + '</a>';
}
}
}

// 6️⃣ 归档 (原有逻辑)
if (site.posts && site.posts.length > 0) {
if (is_archive()) {
el += '<a class="active" href="' + pretty_url(config.archive_dir) + '">' + __("btn.archives") + '</a>';
} else {
el += '<a href="' + pretty_url(config.archive_dir) + '">' + __("btn.archives") + '</a>';
}
}

el += '</nav></div></div></div>';
return el;
}
%>
<%- layoutDiv() %>

之后就能看到首页标签了.并且首页标签在导航栏的最前面.