LoginSignup
0
1

More than 1 year has passed since last update.

Zendesk ヘルプセンターのサイドバーに、カテゴリ、セクション、記事一覧を表示する方法

Last updated at Posted at 2022-05-15

これは何?

Zendeskのヘルプセンターのカスタマイズに関する記事です。
以下2つを書いています。

  1. カテゴリページと検索結果ページで、カテゴリ一覧を表示する方法
  2. セクションページ、記事ページで、上位カテゴリのセクションと記事一覧を表示する方法

Zendesk Guideは簡単にサポートサイトを構築できるサービスですが、
良い意味で制約があり、これができないのか...というところがちょいちょいあったりします。

その中でも、わりと上位にあると考えられるのが今回の内容かと思いますので、qiitaに残します。
なお、本画面のスクショは、実際に提供しているSaaSのヘルプセンターの画像です。

前提知識

  • html、css、javascriptの知識が多少ある方

本記事に書いてあること

1:(上位カテゴリの)セクションと記事一覧を表示する

セクションページと記事ページで、上位カテゴリ内のセクションと記事一覧を表示します。
実際の表示イメージはこちらです。記事ページとセクションページで、同じ内容を表示しています。

イメージ.jpg

2:カテゴリページで、カテゴリ一覧を表示する

カテゴリページで、カテゴリカテゴリ一覧を表示しています。
カテゴリ一覧だけですが、ソースコード内のセクションも合わせて表示できるようにしています。
スクリーンショット_2022-05-16_0_46_12.jpg

参考にした記事(というか、流用に近い...

本記事に書いてある内容は、以下の記事を相当参考にさせていただいています。。感謝!!!!ありがとうございます!ありがとうございます!
本記事では、コードの詳細は詳しく記載しませんので、以下の記事を必ず併せてご覧ください。
表示を早くさせるために工夫したり、非公開の記事を表示させないようにするなどの制御が入っており、その説明の記載があります。

Zendesk Guideでカテゴリ内のArticle一覧を左メニューに出力するようにカスタマイズする
https://blog.torut.tokyo/entry/2018/03/04/012913

ざっくりとした仕組み

表示するデータ(カテゴリ/セクション/記事)は、Zendesk APIから取得します。
Javascriptを使いAPIから必要なデータを取得し、その内容を表示します。

対象のhbsファイルに下記コードを入れることで、下の階層にjavascriptでhtmlが挿入されます。

<div class="nav-category-contents"></div>

(上位カテゴリの)セクションと記事一覧を表示する方法

対象ファイル

記事ページ article_page.hbs
セクションページ section_page.hbs

javascript

$(document).ready(function() {
  if(document.URL.match(/\/sections\/|\/articles\//)) {
    var category_id = $(".breadcrumbs-wrapper li:nth-child(2) a").attr("href").match(/[0-9]+/);
    var locale = window.location.pathname.split('/')[2];

    $('.nav-category-contents').append('<div class="js-loading">loading...</div>');

    var Zendesk = {
      sections: function (category_id) {
        var defer = $.Deferred();
        $.ajax({
          url: "/api/v2/help_center/" + locale + "/categories/" + category_id + "/sections.json?sort_by=position&include=translations",
          type: "GET",
          localCache: true,
          cacheTTL: 24,
          cacheKey: locale + category_id,
          dataType: 'json',
          success: defer.resolve,
          error: defer.reject
        });
        return defer.promise();
      },
      articles: function (section_id) {
        var defer = $.Deferred();
        $.ajax({
          url: "/api/v2/help_center/" + locale + "/sections/" + section_id + "/articles.json",
          type: "GET",
          localCache: true,
          cacheTTL: 24,
          cacheKey: locale + section_id,
          dataType: 'json',
          success: defer.resolve,
          error: defer.reject
        });
        return defer.promise();
      }
    };

    Zendesk.sections(category_id).done(function (category) {
      $.each(category.sections, function (i, v) {
        // Section is hidden?
        var hidden = true;
        v.translations.filter(function (translation, index) {
          if (translation.locale == locale && translation.hidden == true) {
            hidden = true;
          } else if (translation.locale == locale && translation.hidden == false) {
            hidden = false;
          }
        });
        if (hidden) return true;

        $('.js-loading').remove();

        $('.nav-category-contents').append('<div class="nav-category-title" id=' + v.id + '><a  class="nav-category-title-link" href=' + v.html_url + '">' + v.name + '</a></div>');

        Zendesk.articles(v.id).done(function (section) {
          var nesting = $("<ul>");
          $.each(section.articles, function (j, x) {
            if (x.draft) {
              return true;
            }
            nesting.append('<li class="nav-section-item" id=' + x.id + '><a href=' + x.html_url + ' class="nav-section-link ' + (x.html_url == window.location ? "current-article" : "") + '">' + x.name + '</a></li>');
          });
          $('.nav-category-title#' + v.id).after(nesting);
        });
      });
    });
  }
});

カテゴリページと検索結果ページで、カテゴリ一覧を表示する

対象ファイル

カテゴリページ category_page.hbs
検索結果ページ search_results.hbs

javascript

$(document).ready(function() {
// For Articles in Category
  if(document.URL.match(/\/categories\/|\/search/)) {
    var locale = window.location.pathname.split('/')[2];

    $('.nav-category-contents').append('<div class="js-loading">loading...</div>');

    var Zendesk = {
      categories: function () {
        var defer = $.Deferred();
        $.ajax({
          url: "/api/v2/help_center/" + locale + "/categories.json",
          type: "GET",
          localCache: true,
          cacheTTL: 24,
          cacheKey: locale,
          dataType: 'json',
          success: defer.resolve,
          error: defer.reject
        });
        return defer.promise();
      },
      sections: function (category_id) {
        var defer = $.Deferred();
        $.ajax({
          url: "/api/v2/help_center/" + locale + "/categories/" + category_id + "/sections.json?sort_by=position",
          type: "GET",
          localCache: true,
          cacheTTL: 24,
          cacheKey: locale,
          dataType: 'json',
          success: defer.resolve,
          error: defer.reject
        });
        return defer.promise();
      }
    };

    Zendesk.categories().done(function (categories) {
      $.each(categories.categories, function (i, v) {

        $('.js-loading').remove();

        $('.nav-category-contents').append('<div class="nav-category-title" id=' + v.id + '><a  class="nav-category-title-link" href=' + v.html_url + '">' + v.name + '</a></div>');

        // セクションを表示する
        // Zendesk.sections(v.id).done(function (section) {
        //   var nesting = $("<ul>");
        //   $.each(section.sections, function (j, x) {
        //     nesting.append('<li class="nav-section-item" id=' + x.id + '><a href=' + x.html_url + ' class="nav-section-link ' + (x.html_url == window.location ? "current-article" : "") + '">' + x.name + '</a></li>');
        //   });
        //   $('.nav-category-title#' + v.id).after(nesting);
        // });
      });
    });
  }
});

補足事項

サイトによって調整が必要な部分は、javascriptでデータを取得した後のhtmlを挿入するところですね。
他はわりとそのまま使えるのではと思います。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1