qooqのサイトマップの作成

2020/11/03

ブログの設定

X f B! R L
サイトマップを固定ページのhtml編集画面にてコピペするだけで作成する方法を覚え下記として残しておきます。リストタイプで全記事が表示されて読み込みも早いです。2022年1月からは旧型のサイトマップが機能しませんので、ぜひ新たなコードを貼り付けて更新されてください。

<div id="bp_toc">読込中...</div>
<script type="text/javascript">
// ---------------------------------------------------
// BLOGTOC
// ---------------------------------------------------
// BlogToc creates a clickable Table Of Contents for
// Blogger Blogs.
// It uses the JSON post feed, and create a ToC of it.
// The ToC can be sorted by title or by date, both
// ascending and descending, and can be filtered by
// label.
// ---------------------------------------------------
// Author: Syed Faizan Ali
// Url: https://www.mybloggerlab.com
// Version: 2
// Date: 2007-04-12
// ---------------------------------------------------
// Japanese Localization by Fujiyan.
// Url: https://fujilogic.blogspot.com/2019/05/sitemap.html
// ---------------------------------------------------
// global arrays
 
   var postTitle = new Array();   // array of posttitles
   var postUrl = new Array();     // array of posturls
   var postDate = new Array();  // array of post publish dates
   var postSum = new Array();  // array of post summaries
   var postLabels = new Array();// array of post labels
 
// global variables
   var sortBy = "datenewest"; // default value for sorting ToC
   var tocLoaded = false;        // true if feed is read and ToC can be displayed
   var numChars = 250;         // マウスオン時にツールチップ表示する概要文字数
   var postFilter = '';              // デフォルトで表示するラベル名
   var tocdiv = document.getElementById("bp_toc"); //the toc container
   var totalEntires =0; //Entries grabbed till now
   var totalPosts =0; //Total number of posts in the blog.
 
// main callback function
 
function loadtoc(json) {
 
   function getPostData() {
   // this functions reads all postdata from the json-feed and stores it in arrays
      if ("entry" in json.feed) {
         var numEntries = json.feed.entry.length;
         totalEntires = totalEntires + numEntries;
         totalPosts=json.feed.openSearch$totalResults.$t
         if(totalPosts>totalEntires)
         {
         var nextjsoncall = document.createElement('script');
         nextjsoncall.type = 'text/javascript';
         startindex=totalEntires+1;
         nextjsoncall.setAttribute("src", "/feeds/posts/summary?start-index=" + startindex + "&max-results=50&alt=json-in-script&callback=loadtoc");
         tocdiv.appendChild(nextjsoncall);
         }
      // main loop gets all the entries from the feed
         for (var i = 0; i < numEntries; i++) {
         // get the entry from the feed
            var entry = json.feed.entry[i];
 
         // get the posttitle from the entry
            var posttitle = entry.title.$t;
 
         // get the post date from the entry
            var postdate = entry.published.$t.substring(0,10).replace(/-/g,"/");
 
         // get the post url from the entry
            var posturl;
            for (var k = 0; k < entry.link.length; k++) {
               if (entry.link[k].rel == 'alternate') {
               posturl = entry.link[k].href;
               break;
               }
            }
 
         // get the post contents from the entry
         // strip all html-characters, and reduce it to a summary
            if ("content" in entry) {
               var postcontent = entry.content.$t;}
            else
               if ("summary" in entry) {
                  var postcontent = entry.summary.$t;}
               else var postcontent = "";
         // strip off all html-tags
            var re = /<\S[^>]*>/g;
            postcontent = postcontent.replace(re, "");
         // reduce postcontent to numchar characters, and then cut it off at the last whole word
            if (postcontent.length > numChars) {
               postcontent = postcontent.substring(0,numChars);
               var quoteEnd = postcontent.lastIndexOf(" ");
               postcontent = postcontent.substring(0,quoteEnd) + '...';
            }
 
         // get the post labels from the entry
            var pll = '';
            if ("category" in entry) {
               for (var k = 0; k < entry.category.length; k++) {
                  pll += '<a href="javascript:filterPosts(\'' + entry.category[k].term + '\');" title="ラベル 「' + entry.category[k].term + '」 の記事を表示">' + entry.category[k].term + '</a>,  ';
               }
            var l = pll.lastIndexOf(',');
            if (l != -1) { pll = pll.substring(0,l); }
            }
 
         // add the post data to the arrays
            postTitle.push(posttitle);
            postDate.push(postdate);
            postUrl.push(posturl);
            postSum.push(postcontent);
            postLabels.push(pll);
         }
      }
      if(totalEntires==totalPosts) {tocLoaded=true;showToc();}
   } // end of getPostData
 
// start of showtoc function body
// get the number of entries that are in the feed
//   numEntries = json.feed.entry.length;
 
// get the postdata from the feed
   getPostData();
 
// sort the arrays
   sortPosts(sortBy);
   tocLoaded = true;
}
 
 
 
// filter and sort functions
 
 
function filterPosts(filter) {
// This function changes the filter
// and displays the filtered list of posts
  // document.getElementById("bp_toc").scrollTop = document.getElementById("bp_toc").offsetTop;;
   postFilter = filter;
   displayToc(postFilter);
} // end filterPosts
 
function allPosts() {
// This function resets the filter
// and displays all posts
 
   postFilter = '';
   displayToc(postFilter);
} // end allPosts
 
function sortPosts(sortBy) {
// This function is a simple bubble-sort routine
// that sorts the posts
 
   function swapPosts(x,y) {
   // Swaps 2 ToC-entries by swapping all array-elements
      var temp = postTitle[x];
      postTitle[x] = postTitle[y];
      postTitle[y] = temp;
      var temp = postDate[x];
      postDate[x] = postDate[y];
      postDate[y] = temp;
      var temp = postUrl[x];
      postUrl[x] = postUrl[y];
      postUrl[y] = temp;
      var temp = postSum[x];
      postSum[x] = postSum[y];
      postSum[y] = temp;
      var temp = postLabels[x];
      postLabels[x] = postLabels[y];
      postLabels[y] = temp;
   } // end swapPosts
 
   for (var i=0; i < postTitle.length-1; i++) {
      for (var j=i+1; j<postTitle.length; j++) {
         if (sortBy == "titleasc") { if (postTitle[i] > postTitle[j]) { swapPosts(i,j); } }
         if (sortBy == "titledesc") { if (postTitle[i] < postTitle[j]) { swapPosts(i,j); } }
         if (sortBy == "dateoldest") { if (postDate[i] > postDate[j]) { swapPosts(i,j); } }
         if (sortBy == "datenewest") { if (postDate[i] < postDate[j]) { swapPosts(i,j); } }
      }
   }
} // end sortPosts
 
// displaying the toc
 
function displayToc(filter) {
// this function creates a three-column table and adds it to the screen
   var numDisplayed = 0;
   var tocTable = '';
   var tocHead1 = 'タイトル';
   var tocTool1 = 'タイトル順に並べ替え';
   var tocHead2 = '投稿日';
   var tocTool2 = '投稿日順に並べ替え';
   var tocHead3 = 'ラベル';
   var tocTool3 = '';
   if (sortBy == "titleasc") {
      tocTool1 += ' (降順)';
      tocTool2 += ' (昇順)';
   }
   if (sortBy == "titledesc") {
      tocTool1 += ' (昇順)';
      tocTool2 += ' (昇順)';
   }
   if (sortBy == "dateoldest") {
      tocTool1 += ' (昇順)';
      tocTool2 += ' (昇順)';
   }
   if (sortBy == "datenewest") {
      tocTool1 += ' (昇順)';
      tocTool2 += ' (降順)';
   }
   if (postFilter != '') {
      tocTool3 = '全ての記事を表示';
   }
   tocTable += '<table>';
   tocTable += '<tr>';
   tocTable += '<td class="toc-header-col1">';
   tocTable += '<a href="javascript:toggleTitleSort();" title="' + tocTool1 + '">' + tocHead1 + '</a>';
   tocTable += '</td>';
   tocTable += '<td class="toc-header-col2">';
   tocTable += '<a href="javascript:toggleDateSort();" title="' + tocTool2 + '">' + tocHead2 + '</a>';
   tocTable += '</td>';
   tocTable += '<td class="toc-header-col3">';
   tocTable += '<a href="javascript:allPosts();" title="' + tocTool3 + '">' + tocHead3 + '</a>';
   tocTable += '</td>';
   tocTable += '</tr>';
   for (var i = 0; i < postTitle.length; i++) {
      if (filter == '') {
         tocTable += '<tr><td class="toc-entry-col1"><a href="' + postUrl[i] + '" title="' + postSum[i] + '">' + postTitle[i] + '</a></td><td class="toc-entry-col2">' + postDate[i] + '</td><td class="toc-entry-col3">' + postLabels[i] + '</td></tr>';
         numDisplayed++;
      } else {
          z = postLabels[i].lastIndexOf(filter);
          if ( z!= -1) {
             tocTable += '<tr><td class="toc-entry-col1"><a href="' + postUrl[i] + '" title="' + postSum[i] + '">' + postTitle[i] + '</a></td><td class="toc-entry-col2">' + postDate[i] + '</td><td class="toc-entry-col3">' + postLabels[i] + '</td></tr>';
             numDisplayed++;
          }
        }
   }
   tocTable += '</table>';
   if (numDisplayed == postTitle.length) {
      var tocNote = '<span class="toc-note">全 ' + postTitle.length + ' 件の記事を表示中<br/></span>';
   }
   else {
      var tocNote = '<span class="toc-note">全 '+ postTitle.length + ' 件中 ラベル「<b>';
      tocNote += postFilter + '</b>」の ' + numDisplayed + ' 件の記事を表示中<br/></span>';
   }
   tocdiv.innerHTML = tocNote + tocTable;
} // end of displayToc
 
function toggleTitleSort() {
   if (sortBy == "titleasc") { sortBy = "titledesc"; }
   else { sortBy = "titleasc"; }
   sortPosts(sortBy);
   displayToc(postFilter);
} // end toggleTitleSort
 
function toggleDateSort() {
   if (sortBy == "datenewest") { sortBy = "dateoldest"; }
   else { sortBy = "datenewest"; }
   sortPosts(sortBy);
   displayToc(postFilter);
} // end toggleTitleSort
 
 
function showToc() {
  if (tocLoaded) {
     displayToc(postFilter);
     var toclink = document.getElementById("toclink");
 
  }
}
 
</script>
<script src="/feeds/posts/default?alt=json-in-script&amp;max-results=50&amp;callback=loadtoc" type="text/javascript"></script>
 
<style>
#bp_toc {
    margin: 0 auto 2em;
    padding: 0;
    width: 100%;
}
#bp_toc tbody {
    border-bottom: 1px solid #ddd;
}
#bp_toc table {
    width: 100%;
    margin: 0 auto;
    counter-reset: rowNumber;
    border-collapse: collapse;
    border-left: 1px solid #ddd;
}
#bp_toc td:not(.toc-entry-col3),
#bp_toc tr  {
  border-right: 1px solid #ddd;
}
.toc-note {
    line-height: 1.5em;
    margin-bottom: 1em;
    display: block;
    text-align: center;
}
#bp_toc tr:nth-child(2n) {
    background: rgba(0,80,200,.1);/*奇数行の背景色*/
}
.toc-entry-col1 a:hover {
    background: rgba(0,80,200,.2);/*タイトルホバー時の背景色*/
    text-decoration: none!important;
}
#bp_toc table tr:first-child a {/*ナビゲーション*/
    background: #bbb;
    color: #fff!important;
    font-weight: bold;
    text-align: center;
    padding: 5px 0;
    display: block;
    width: 100%;
    border-top: 1px solid #ddd;
}
#bp_toc table tr:first-child a:hover {
    opacity: .8;
    text-decoration: none;
}
.toc-header-col1 {
    width: 55%;/*タイトル(番号含む)枠の幅*/
}
.toc-header-col2 {
    width: 22%;/*投稿日枠の幅*/
}
.toc-header-col3 {
    width: 33%;/*ラベル枠の幅*/
}
#bp_toc table tr td.toc-entry-col1:first-child::before {
    content: counter(rowNumber);
    width: 2.6em;/*記事番号枠の幅*/
    text-align: center;
    padding: 12px 3px 0;
    border-right: 1px solid #ddd;
}
.toc-entry-col1 {/*記事番号*/
    display: flex;
    counter-increment: rowNumber;
    font-size: 12px;
    line-height: 1.5em;
}
.toc-entry-col1 a {/*タイトル*/
    display: block;
    height: 100%;
    width: 100%;
    font-size: 14px;
    font-weight: bold;
    padding: 10px .5em 10px;
    line-height: 1.3em;
    color: inherit!important;
}
.toc-entry-col2 {/*投稿日*/
    font-size: 13px;
    text-align: center;
}
.toc-entry-col3 {/*ラベル*/
    font-size: 13px;
    padding: 5px;
    line-height: 1.5em;
}
</style>

2026年版のサイトマップ

<div id="bp_toc">読み込み中...</div>

<script type="text/javascript">
  // ---------------------------------------------------
  // BLOGTOC Final Eye-Friendly (Japanese & Dark Green BG Optimized)
  // ---------------------------------------------------
  var postTitle = [];
  var postUrl = [];
  var postDate = [];
  var postSum = [];
  var postLabels = [];
  var postFilter = '';

  var tocdiv = document.getElementById("bp_toc");
  var totalEntires = 0;
  var totalPosts = 0;

  function loadtoc(json) {
    if ("entry" in json.feed) {
      var numEntries = json.feed.entry.length;
      totalEntires += numEntries;
      totalPosts = parseInt(json.feed.openSearch$totalResults.$t);

      if (totalPosts > totalEntires) {
        var nextjsoncall = document.createElement('script');
        nextjsoncall.type = 'text/javascript';
        var startindex = totalEntires + 1;
        nextjsoncall.setAttribute("src", "/feeds/posts/summary?start-index=" + startindex + "&max-results=50&alt=json-in-script&callback=loadtoc");
        document.body.appendChild(nextjsoncall);
      }

      for (var i = 0; i < numEntries; i++) {
        var entry = json.feed.entry[i];
        var posttitle = entry.title.$t;
        var postdate = entry.published.$t.substring(0, 10).replace(/-/g, "/");
        var posturl;
        for (var k = 0; k < entry.link.length; k++) {
          if (entry.link[k].rel == 'alternate') { posturl = entry.link[k].href; break; }
        }
        var postcontent = ("summary" in entry) ? entry.summary.$t : (entry.content ? entry.content.$t : "");
        postcontent = postcontent.replace(/<[^>]*>/g, "").substring(0, 100) + "...";

        var rawLabels = [];
        if ("category" in entry) {
          for (var k = 0; k < entry.category.length; k++) {
            rawLabels.push(entry.category[k].term);
          }
        }
        postTitle.push(posttitle);
        postDate.push(postdate);
        postUrl.push(posturl);
        postSum.push(postcontent);
        postLabels.push(rawLabels);
      }
    }
    if (totalEntires >= totalPosts) { displayToc(''); }
  }

  function filterPosts(filter) {
    postFilter = filter;
    displayToc(filter);
    window.scrollTo(0, tocdiv.offsetTop - 20);
  }

  function displayToc(filter) {
    var numDisplayed = 0;
    var noteContent = (filter === '') 
      ? '全 ' + postTitle.length + ' 件の記事を表示中' 
      : 'ラベル「' + filter + '」を表示中 <span class="toc-reset-btn" onclick="filterPosts(\'\')">× 全表示に戻る</span>';
    
    var html = '<div class="toc-note">' + noteContent + '</div>';
    html += '<table class="toc-table"><thead><tr><th class="h-title">タイトル</th><th class="h-date">投稿日</th><th class="h-label">ラベル</th></tr></thead><tbody>';

    for (var i = 0; i < postTitle.length; i++) {
      if (filter === '' || postLabels[i].indexOf(filter) !== -1) {
        var labelHtml = '';
        for (var j = 0; j < postLabels[i].length; j++) {
          labelHtml += '<span class="toc-tag-text" onclick="filterPosts(\'' + postLabels[i][j] + '\')">' + postLabels[i][j] + '</span>';
          if (j < postLabels[i].length - 1) labelHtml += ', ';
        }
        html += '<tr>';
        html += '<td class="toc-entry-title"><a href="' + postUrl[i] + '" title="' + postSum[i] + '">' + postTitle[i] + '</a></td>';
        html += '<td class="toc-entry-date">' + postDate[i] + '</td>';
        html += '<td class="toc-entry-labels">' + labelHtml + '</td>';
        html += '</tr>';
        numDisplayed++;
      }
    }
    html += '</tbody></table>';
    tocdiv.innerHTML = html;
  }
</script>

<script src="/feeds/posts/summary?alt=json-in-script&max-results=50&callback=loadtoc" type="text/javascript"></script>

<style>
  /* 全体設定:深緑背景に馴染むダークグレー */
  #bp_toc { font-family: "Helvetica Neue", "Arial", "Hiragino Kaku Gothic ProN", "Hiragino Sans", sans-serif; color: #bbb; max-width: 1000px; margin: 20px auto; background-color: #2b2b2b; padding: 15px; border-radius: 8px; }
  .toc-note { text-align: center; margin-bottom: 15px; color: #888; font-size: 14px; }
  
  /* 解除ボタン:シンプルに点線アンダーライン */
  .toc-reset-btn {
    display: inline-block;
    margin-left: 10px;
    padding: 0 10px;
    color: #ccc;
    border-bottom: 1px dashed #555;
    font-size: 12px;
    cursor: pointer;
  }
  .toc-reset-btn:hover { color: #fff; border-bottom: 1px solid #fff; }

  /* テーブル */
  .toc-table { width: 100%; border-collapse: collapse; border: 1px solid #333; table-layout: fixed; background-color: #262626; }
  .toc-table th { background: #1a1a1a; color: #666; padding: 10px; font-size: 13px; border: 1px solid #333; text-align: center; font-weight: normal; }
  .toc-table td { border: 1px solid #333; padding: 12px 8px; vertical-align: middle; word-wrap: break-word; overflow-wrap: break-word; }
  .toc-table tr:nth-child(even) { background: #2d2d2d; }

  /* タイトル:明るいグレー */
  .toc-entry-title a { font-weight: bold; color: #ccc !important; text-decoration: none; font-size: 15px; transition: 0.2s; }
  .toc-entry-title a:hover { color: #fff !important; text-decoration: underline; }

  .toc-entry-date { text-align: center; font-size: 12px; width: 100px; color: #777; }

  /* ラベル:文字だけ・明るいグレー */
  .toc-entry-labels { font-size: 12px; width: 180px; color: #888; }
  .toc-tag-text { color: #aaa; cursor: pointer; text-decoration: none; }
  .toc-tag-text:hover { color: #fff; text-decoration: underline; }

  .h-title { width: 55%; } .h-date { width: 15%; } .h-label { width: 30%; }
  @media screen and (max-width: 640px) {
    .h-date, .toc-entry-date { display: none; }
    .h-title { width: 60%; } .h-label { width: 40%; }
  }
</style>

プロフィール

Jと申します。皆さんご自身で参考程度にされてください。 googleに2026年8月29日の時点でindexにしましたが、検索エンジンに暫くヒットはしないかと思います。コメントを各自個人情報に留意されながら書き込みください。グーグルアカウントにログインした状態で書きこむと自分で後々削除できるので推奨します。そうでない場合に削除したいと感じられた際に言って下されば仰せの通りに致します👍

最新コメント

読み込み中...

10記事毎ログ

読み込み中...

QooQ