Hexoのカテゴリーページで親カテゴリーを配列で取得する

Hexoにはpage.categoryという変数が用意されていて、カテゴリーページでカテゴリーの名前を出せるのですが、カテゴリーを階層化させているときに、そのカテゴリーが属する親カテゴリーの名前やURLを出す変数がありません。

なので、何とかして親カテゴリーを取得してみようという企画です。

ソース

親カテゴリーが存在する場合は、parentというキーで親のidが入ってるので、それを頼りにフィルターで親カテゴリーを探します。

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
<%
function get_category(){
let arr = {};
arr[page.category] = url_for(page.path);
get_parent(page.category);

function get_parent(current){
const current_cat = site.categories.data.filter(x => x.name === current );
const parent_id = current_cat[0].parent;

if(parent_id) {
const parent_name = site.categories.data.filter(x => x._id === parent_id);
arr[parent_name[0].name] = url_for(parent_name[0].path);
get_parent(parent_name[0].name);
}
}
return reverse_array(arr);
}

function reverse_array(a) {
var key = [];
for (var i in a) {
key.push(i);
}
key.reverse();
var ret = [];
for (var i in key) {
ret[key[i]] = a[key[i]];
}
return ret;
}


const cat = get_category();
console.log(cat);
%>

get_category()を実行すれば、カテゴリー名とURLのセットが連想配列で返ってきます。

これをこのブログのhttps://pixelog.net/category/web/hexo/で実行すると、下のような配列が得られます。

1
[ Web: '/category/web/', Hexo: '/category/web/hexo/' ]

応用

この関数を使えばパンくずリストや構造化マークアップもできます。