Home
Menu
Side
Twitter
Top

Blogger でラベルを階層表示させたい

2020/05/20

Blogger Blogger/カスタマイズ ブログ

こんにちは HARU( @HARU )です。

Blogger ブログでは難しいと思っていた、ラベル別に自動で階層表示させる方法が見つかりました!

これにより、ラベル機能でカテゴリーとタグを区別させることができます。

今回、QooQ のテンプレートをベースに実装したため、他のテンプレートではうまく表示するかわかりません。

うまく実装できなかった場合、参考元の記事を読んで頂くか、コメント頂ければわかる範囲で調べようと思いますので、お気軽にコメントください。

注意

テンプレートの編集( ソースコード改変 )するときは、必ずバックアップを取ってから編集しましょう。

不安な方は以下の関連記事を参照してください。

最初に

本記事の内容 は id="Label1" にのみ対応しています。

現在、ラベルガジェット( リスト、クラウド表示を含む )を使用している方は、以下の手順を実施する前に、ラベルガジェットを削除してから実装することをオススメします。

削除しなくてもわかるよって方は、そのまま進んで大丈夫です。

実装イメージ

ラベル別に羅列されるだけの表示から、トグルボタンにて開閉も行え、カテゴリーとタグを区別して表示させることができるようになります。

Blogger ラベル階層表示イメージ

JQuery の導入

JQuery を導入していない場合、以下の script を <head> の直下に記述します。


  <!-- JQuery -->
  <script src='https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js'/>

ラベルガジェットの追加

以下の手順でラベルガジェットを追加します。

(1)Blogger の管理画面から [ レイアウト ] をクリック

(2)ラベルを階層表示したい場所で [ ガジェットを追加 ] をクリック

(3)ラベルのガジェットを追加

Blogger ラベルガジェットの追加ステップ1イメージ

(4)[ 保存 ] をクリック

※ 設定は後で変更可能

Blogger ラベルガジェットの追加ステップ2イメージ

(5)ラベルガジェットが実装されたことを確認

※ [ 配置を保存 ] を忘れずにクリック

Blogger ラベルガジェットの追加ステップ3イメージ

ラベル階層表示 Script

以下の Script を </body> の直上に記述します。


  <!-- ラベル階層化 -->
  <script type='text/javascript'>
  $(function(){
  $("#Label1").addClass('widget2');
    // 選択中のラベルを取得
      var selLabel = "";
      if($('.status-msg-body').length > 0)
      {
        selLabel = $('.status-msg-body').children('b').text();
      }
      var list = $('div#Label1 div ul > li');
      var dest = $("<ul style='display: none;'/>");
      var nodes = new Array();
      $(list).each(function(){
          var work;
          var selected = false;
          var targetText = "";
          if($(this).children('a').length>0){
              targetText = $(this).children('a').text();
              work = targetText.split("/");
              $(this).children('a').text(work[work.length-1]);
          }else{
              targetText = $(this).children('span:first').text();
              work = targetText.split("/");
              $(this).children('span:first').text(work[work.length-1]);
          }
          if(selLabel==targetText)
          {
              selected = true;
          }

          var key="";
          $(this).addClass("categoryLabel");
          var target=$(this);
          $(work).each(function(i){
              if (i == work.length-1){
                   if (key == ""){
                        dest.append($(target).clone(true));
                   }else{
                        nodes[key].append($(target).clone(true));
                   }
                   $(target).remove();
              }else{
                   var parent = null;
                   if (i>0){
                       parent = nodes[key];
                       key = key + "/";
                   }
                   key = key + work[i];
                   if (nodes[key] == null){
                        var item = $("<li class='categoryLabel'>" + work[i] + "</li>");
                        var temp = $("<ul style='display: none;'/>");
                        item.append(temp);
                        nodes[key] = temp;
                        if (parent == null){
                            dest.append(item);
                        }else{
                            parent.append(item);
                        }
                   }
              }
          });
          // ラベルを選択中の場合、該当ノードを表示する
          if(selected)
          {
              work = selLabel.split("/");
              key = "";
              $(work).each(function(i){
                  if (i>0){
                      parent = nodes[key];
                      key = key + "/";
                  }
                  key = key + work[i];
                  $(nodes[key]).css('display','block');
              });
          }
      });
      $('div#Label1 div ul').html($(dest).html());
  });
  //トグル処理
  $(function(){
      var open = 'data:image/gif;base64,'+
          'R0lGODlhCQAJAJEAAP7+/oKCggICAgAAACwAAAAACQAJAAACEYyPoAvG614LQFg7ZZbxoR8UADs=';
      var close = 'data:image/gif;base64,'+
          'R0lGODlhCQAJAJEAAP7+/oKCggICAgAAACwAAAAACQAJAAACFIyPoAu2spyCyol7W3hxz850CFIA'+
          'ADs=';
      $('.categoryLabel:has(ul)')
        .click(function(event){
          if (this == event.target) {
            $(this).children().toggle();
            $(this).css('list-style-image',
              ($(this).children().is(':hidden')) ?
                'url(' + close + ')' : 'url(' + open + ')');
          }
        })
        .css('cursor','pointer');
      $('.categoryLabel:has(ul)').css('cursor','pointer');
      // 子ノードの表示状態で初期表示アイコンを変更する
      var list = $('.categoryLabel:has(ul)');
      $(list).each(function(){
          if($(this).children().css('display') == 'none')
          {
              $(this).css('list-style-image','url(' + close + ')');
          }else{
              $(this).css('list-style-image','url(' + open + ')');
          }
      });
      $('.categoryLabel:not(:has(ul))').css({
        cursor: 'pointer',
        'list-style-image':'url(' + open + ')'
      });
      $('#Label1Cover').show();
  });
  // フッタの表示ラベルをサブカテゴリのみにする
  $('.post-labels').children("a").each(function(){
      var work = $(this).text().split("/");
      $(this).text(work[work.length -1]);
  });
  </script>

途中経過確認

JQuery と script を追加することで、各ラベルの右側にトグルボタンが表示されるようになります。

トグルボタンが追加されたことを確認

CSS 追記

以下の CSS を Blogger テンプレートの CSS 欄に記述します。

私は個別アイテム欄の一番下に記述しました。


  /* 階層ラベルデザイン */
  .section:first-child .widget2:first-child {
    margin-top: 0;
  }
  .widget2 ul {
    padding-left: 1em;
  }

使い方

カテゴリー/タグ のように記事のラベルを設定することで、カテゴリー内のタグとしてラベルが階層分けされるようになります。

カテゴリーラベルにリンクが無い

カテゴリー/タグ のラベル設定をした場合、当たり前ですがカテゴリーに指定したラベル単独でリンクは作成されません。

例えば「 ブログ/カスタマイズ 」というラベルを作成した場合、「 ブログ 」カテゴリーでのリンクは作成されないということです。

カテゴリーラベルへの単独リンクが必要な場合、別途、カテゴリーラベルを記事に設定することでリンクを作成することができます。

方法としては以下の2通りがあります。

「 カテゴリー 」ラベルを追加する

「 カテゴリー/タグ 」というラベルの他に、「 カテゴリー 」というラベルを追加設定する方法です。

この場合、例えば「 ブログ/カスタマイズ 」と「 ブログ 」というラベルを記事に設定します。

この方法のデメリットとしては、ラベルを階層表示したときにカテゴリーラベルが複数になってしまうことです。

カテゴリーラベルが複数表示されるイメージ

「 カテゴリー/カテゴリー 」ラベルを追加する

「 カテゴリー/タグ 」というラベルの他に、「 カテゴリー/カテゴリー 」というラベルを追加することでも、カテゴリーのリンクが作成できます。

この場合、例えば「 ブログ/カスタマイズ 」と「 ブログ/ブログ 」というラベルを記事に設定します。

この方法のデメリットとしては、ラベルを階層表示したときにカテゴリー内にカテゴリーへのリンクが格納されてしまうことです。

カテゴリー内にカテゴリーリンクが格納されるイメージ

参考元からの変更点

widet2 クラス追加

参考元と違う点は widget2 というクラスを追加しているところです。デザインの調整のためですね。

参考元( Bloggerのラベルを階層化を導入したのに階層化されない時の対応 )では、widget というクラスを削除することも追加してありますが QooQ の場合、デザインが崩れしてしまったのでそれは無くしました。

ラベルのクラウド表示の変更

階層表示とは別にラベルをクラウド表示したとき、タグ( サブカテゴリ )のみ表示するようになっていましたが、すべて表示するようにしました。

タグ( サブカテゴリ )のみ表示したい場合は、参考元の記事を参照してください。

デフォルト カスタム

デフォルトのラベルクラウド表示イメージ

カスタムのラベルクラウド表示イメージ

QooQ