liuyib/hexo-theme-stun

新增关键字Keywords功能

Closed this issue · 1 comments

新增关键字Keywords功能

预期行为

在文章配置中支持keywords字段,在生成页面后能够存在keywords元标签,方便SEO。

环境版本

Node@18.15.0
Stun@2.8.0
Hexo@6.3。0

实际行为

只是在站点配置文件中指定了Keywords字段内容后,在生成时并没有生效。
在文章中配置了keywords字段没有生成元标签。

尝试开发

我考虑后觉得自行开发也能做到,甚至为此读了源码。
修改了主题文件/stun/layout/_partials/head/head.pug,内容如下。

  var keywords = config.author + ',' + config.title;
  var title_suffix = ' | ' + title;

  if (is_home()) {
    title = title + ((theme.index_subtitle && subtitle) ? (' | ' + subtitle) : '');
    keywords = keywords + ','  + config.keywords;
  } else if (is_archive()) {
    title = __('title.archive') + title_suffix;
    keywords = keywords + ','  + config.keywords + ',归档';
  } else if (is_category()) {
    // 分类下的某个子分类页面
    title = __('title.category') + ': ' + page.category + title_suffix;
    keywords = keywords + ','  + page.category;
  } else if (is_tag()) {
    // 标签页下的某个子标签页面
    title = __('title.tag') + ': ' + page.tag + title_suffix;
    keywords = keywords + ','  + page.tag;
  } else if (is_post()) {
    // 普通单篇博客title
    title = (page.title || __('post.untitled')) + title_suffix;
    // 普通单篇博客keywords
    if (typeof page.keywords === 'undefined') {
      // 没有在文章内指明keywords字段的文章,那就用tag标签和分类标签

      // 判断page.tags.constructor之后是class _Query extends Query {}
      // 一个后端程序猿不会处理这个类型,所以附上伪代码如下
      //- if (page.tags && page.tags.length > 0) {
      //-   each tag in page.tags
      //-     keywords = keywords + ',' + tag
      //- }
    }else{
      keywords = keywords + ',' + page.keywords;
    }
  } else {
    if (page.type === 'tags') {
      // 标签页
      title = __('title.tag') + title_suffix;
      keywords = keywords + ',标签';
    } else if (page.type === 'categories') {
      // 分类页
      title = __('title.category') + title_suffix;
      keywords = keywords + ',分类';
    } else {
      // 类似‘关于页’,‘图像页’等其他单独生成的网页
      title = page.title + title_suffix;
      if (typeof page.keywords !== 'undefined') {
          keywords = keywords + ',' + page.keywords;
      }
    }
  }


meta(name="keywords" content=keywords)

但是在开发和调试的过程中发现,当我想要实现没有在文章内指明keywords字段的文章,那就用tag标签和分类标签的功能时,一直没办法处理 page.tags 字段,核对后确定了是class _Query extends Query {}类型。

涉及了知识盲区,所以请求大佬开发这个功能,核心点就在于如何遍历读取这个对象。逻辑已经实现了。

另外,感激大佬开发的这个好用的主题,再多问一句有没有pug开发的推荐学习资料?视频或者文档都好,主要是想学习如何调试整个项目而不是一遍又一遍地去清理、生成、重启Hexo服务的琐碎行为。


翻看了Pug的官方文档:https://www.pugjs.cn/api/getting-started.html

但是也没找到如何debug调试pug文件,捂脸哭泣。

我是一个一个字段尝试出来的,因为在修改的过程中,我都不知道获得的是什么对象,更别说拿到一个神秘对象的属性值了。

更多的是巧合,最终成功的代码内容如下。

  var keywords = config.author + ',' + config.title;
  var title_suffix = ' | ' + title;
  
  if (is_home()) {
    title = title + ((theme.index_subtitle && subtitle) ? (' | ' + subtitle) : '');
    keywords = keywords + ','  + config.keywords;
  } else if (is_archive()) {
    title = __('title.archive') + title_suffix;
    keywords = keywords + ','  + config.keywords + ',归档';
  } else if (is_category()) {
    //- 分类下的某个子分类页面
    title = __('title.category') + ': ' + page.category + title_suffix;
    keywords = keywords + ','  + page.category;
  } else if (is_tag()) {
    //- 标签页下的某个子标签页面
    title = __('title.tag') + ': ' + page.tag + title_suffix;
    keywords = keywords + ','  + page.tag;
  } else if (is_post()) {
    //- 普通单篇博客title
    title = (page.title || __('post.untitled')) + title_suffix;
    //- 普通单篇博客keywords
    if (typeof page.keywords === 'undefined') {
      //- 普通单篇博客没设置keywords,修改为标签和分类
      if (page.tags && page.tags.length > 0){
        page.tags.forEach(function (tag) {
          keywords+=',';
          keywords+=tag.name;
        });
      }
      if (page.categories && page.categories.length > 0){
        page.categories.forEach(function (category) {
          keywords+=',';
          keywords+=category.name;
        });
      }
    }else{
      //- 普通单篇博客已经设置keywords,替换中文逗号
      page.keywords.split(',').forEach(function (keyword_item) {
        keywords+=',';
        keywords+=keyword_item;
      });
    }
  } else {
    if (page.type === 'tags') {
      //- 标签页
      title = __('title.tag') + title_suffix;
      keywords = keywords + ',标签';
    } else if (page.type === 'categories') {
      //- 分类页
      title = __('title.category') + title_suffix;
      keywords = keywords + ',分类';
    } else {
      //- 类似‘关于页’,‘图像页’等其他单独生成的网页
      title = page.title + title_suffix;
      if (typeof page.keywords !== 'undefined') {
          keywords = keywords + ',' + page.keywords;
      }
    }
  }
meta(name="keywords" content=keywords)