ljj17173

Hexo博客进阶之文章链接—自定义永久链接
永久链接我们在访问文章页面时,会发现默认的文章链接相当的长特别是使用中文作为标题的时候,分享给别人的链接满是中文链...
扫描右侧二维码阅读全文
12
2019/01

Hexo博客进阶之文章链接—自定义永久链接

永久链接

我们在访问文章页面时,会发现默认的文章链接相当的长
特别是使用中文作为标题的时候,分享给别人的链接满是中文链接的转义字符,非常不好看,但在HEXO官方文档中也只提供了一些参数可供修改
您可以在 _config.yml 配置中调整网站的永久链接或者在每篇文章的 Front-matter 中指定。

变量
除了下列变量外,您还可使用 Front-matter 中的所有属性。

| 变量 | 描述 |

:year文章的发表年份(4 位数)
:month文章的发表月份(2 位数)
:i_month文章的发表月份(去掉开头的零)
:day文章的发表日期 (2 位数)
:i_day文章的发表日期(去掉开头的零)
:title文件名称
:post_title文章标题
:id文章 ID
:category分类。如果文章没有分类,则是 default_category 配置信息。

但你会发现除了使用 year,month,day之外就剩文章名称,文章ID,文章分类了,让文章按照年月日做链接比如 2018010101(2018年1月1日第一篇文章) 这种链接基本没有办法生成,用 title属性就会变得又臭又长,文章ID也没有规律可循,怎么办呢?

这时候翻到官方文档的下面,就会发现有个 多语种支持一栏,里面就提到一个参数 permalink:,当你在文章的头中加入这个参数,不得了,文章的链接就会变成你自定义的 permalink参数,但每次写文章都要自定义一下岂不是很麻烦?
我希望能够在我新建一个文章的时候 permalink:参数就可以帮我写好,或者我的文章链接能用文章创建的日期时间作为链接。

尝试

之后我尝试在新 建文章模板(scaddolds/post.md) 中加入 permalink参数,并定义参数为 year:month:day发现并没有什么作用,你会发现新建一篇文章之后,参数 year:month:day并没有被转换成你想要的,反而被当成字符串处理了。遂百度了一下如何解决看到很多的教程都提到了使用 hexo-addrlink插件来实现唯一链接
相关教程链接
hexo-addrlink插件可以给每一篇文章通过文章标题(hexo中文章标题是不能重复的)生成唯一的编码,来实现链接唯一化。但是还是觉得这个插件生成的唯一代码太长了,也没有逻辑,我还是希望能够用时间和日期作为唯一链接。百度找啊找都没找到相关的教程,遂打开了 hexo-addrlink插件看一下是怎么实现的,这一看之下代码并不多,哎,萌生了自己也写一个类似插件的想法。

编写插件

怎么编写插件呢?

关于 HEXO的插件编写教程,百度上能找到的太少了,还好,找到了一篇并且质量还不错的文章介绍了 HEXO插件的编写
相关文章链接
之后就大题明白了插件的写法,但是如何获取每一篇文章的创建日期呢?
最后在 HEXO官方API文档 中找到了相关信息,API文档链接,内容是这样的

您可以在资料中指定文章的属性,除了以下属性之外,其他属性也会被加到 front-matter 中。

| 属性 | 描述 |

title标题
slug网址
layout布局。默认为 default_layout 参数。
path路径。默认会根据 new_post_path 参数创建文章路径。
date日期。默认为当前时间。

获取了时间就好说了,现在就开始写,HEXO插件文档

编写代码

根据文档的说法,因为我要编写的插件并不大,遂可以直接写在 主题文件夹/scripts/文件夹下,名字随意,就命名为 datelink.js
依葫芦画瓢,看着 hexo-addrlink插件源码就这么抄了个大概下来,写完后代码是这样的

'use strict';
var hexo = hexo || {};
hexo.extend.filter.register('before_post_render',function(data)
{
    var log = this.log;
    if (data.layout == 'post') 
    {
        let datelink
        if (!datelink) 
        {
            var getdate = data.date;
            //log.i("get date [%s]", getdate.format('YYYYMMDDhhmmss'));
            data.datelink = getdate.format('YYYYMMDDhhmmss');
        }
    }
    return data
},15);

由于没有学过JS的关系,都不知道原来date型数据可以直接 format格式化输出,还跑去官方文档查辅助函数,去反查上次使用的 full_date函数在哪里,最后通过翻各种JS源码,才发现直接 format解决了...哎,果然是技术不精啊


由于我给 data数据定的是 datelink,所以也要在HEXO配置文件 _config.yml中添加相关的参数:

permalink: :datelink.html
permalink_defaults:
datelink:

permalink末尾加了 .html听说是可以有利于搜索引擎,就加上去了(注意:加.html后会导致文章页面和文章资源文件夹分离)

测试成果

运行 hexo server测试一波,很好,成功的使用了时间和日期作为文章的唯一链接啦!!!
网址
研究了一整天终究是没有白费,看来得去学一下 js/nodejs

进阶

format参数可以放在 _config.yml文件中,这样可以随时修改网址格式,只需要添加子参数

datelink:
  format:

只需访问 this.config.datelink.format变量即可获取到相应的参数,相信你已经知道怎么改了


所参考的文档和文章:

HEXO官方文档:https://hexo.io/zh-cn/docs/permalinks
hexo进阶文章:http://muyunyun.cn/posts/f55182c5/
插件编写教程文章:https://blog.csdn.net/melordljm/article/details/51985157
HEXO-API:https://hexo.io/zh-cn/api/posts

Last modification:January 24th, 2019 at 05:50 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment