【Blogger】最新コメントの一覧表示ウィジェット

2021/03/18
40
サムネ画像
画像:Business vector created by rawpixel.com - www.freepik.com

フィードを利用して、最新コメントを表示するウィジェットを作成しました。ブログ内のコメントが一覧で確認できるようになる便利なウィジェットです。

特徴

document.write()不使用

PSIに怒られがちなdocument.write()を使用していません。

軽量&高速

コードと内部処理の最適化にこだわりました。

確認しやすい

投稿者アイコンと時刻が付いており、パッと見て確認しやすいです。

導入が簡単

単体で機能するウィジェットなので、導入がとても簡単です。

導入方法

ソースコード

まず、以下のコードをコピーしてください。

<div id='recent-cmt'></div>
<script type='text/javascript'>
  const maxnum = 50; // コメント数
  const maxstr = 200; // コメント文字数
  const c_link = true; // コメントへのリンク
  let a_names = [];
  let a_imgs = [];
  let a_times = [];
  let csums = [];
  let curls = [];
 
  function loadcmt(json) {
    if (typeof (json) == 'undefined' || !('entry' in json.feed)) {
      document.getElementById('recent-cmt').innerHTML = '表示できるコメントがありません。';
      return;
    }    
    
    function getData() {
      let entry, a_name, a_img, a_time, csum, curl, curl2;
      for (let i = 0; i < json.feed.entry.length; i++) {
        entry = json.feed.entry[i];
        a_name = entry.author[0].name.$t;
        if (a_name == 'Anonymous') {
          a_name = a_name.replace('Anonymous', '匿名');
        }
        a_img = entry.author[0].gd$image.src;
        if (a_img.match(/blank.gif/)) {
          a_img = "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1WLXoit5wbywP-medekmQAuu7RVv-k6Tl9qZq8ni4c-XH06K60I7cYmOQ1zvy07b6II4pEv4-k5HTvz6cAgpA43y3Sw9WF_oBH6HCLAx-0dxL0xNeYFuS6g0jkWxQUrjn35Y3a8t2O6BU/s35/user.png"; //匿名画像
        }
        a_time = new Date(entry.published.$t);
        a_time = a_time.getFullYear() + '/' + ('0' + (a_time.getMonth() + 1)).slice(-2) + '/' + ('0' + a_time.getDate()).slice(-2) + ' ' + ('0' + a_time.getHours()).slice(-2) + ':' + ('0' + a_time.getMinutes()).slice(-2);
        csum = entry.summary.$t;
        csum = csum.replace(/<\S[^>]*[>]?/g, ' ');
        if (csum.length > maxstr) {
          csum = csum.substring(0, maxstr).replace(/<\S[^>]*$/, '') + ' ...';
        }
        if (entry.link.length < 3) {
          continue;
        }
        for (let j = 0; j < entry.link.length; j++) {
          if (entry.link[j].rel == 'alternate') {
            curl = entry.link[j].href;
            if (!c_link) {
              curl = curl.replace(/\?showComment.*$/, '');
            }
          } else if (entry.link[j].rel == 'self') {
            curl2 = entry.link[j].href; 
          }
        }
        if (curl.indexOf('#') == -1 && c_link) {
          curl2 = curl2.split('/');
          curl2 = curl2[curl2.length - 1];
          curl += ('#c' + curl2);
        }
        a_names.push(a_name);
        a_imgs.push(a_img);
        a_times.push(a_time);
        csums.push(csum);
        curls.push(curl);
      }
    }
    getData();
    displaycmt();
  }
 
  function displaycmt() {
    let html = '<div class="rc-note">最新' + maxnum + '件を表示しています。</div>';
    let i = 0;
    while (i < maxnum && i < curls.length) {
      html += '<a class="rc-block" href="' + curls[i] + '"><div class="rc-head"><img loading="lazy" alt="" width="38" height="38" src="' + a_imgs[i] + '"/><div class="rc-author">' + a_names[i] + '</div><div class="rc-time">' + a_times[i] + '</div></div><div class="rc-body">' + csums[i] + '</div></a>';
      i++;
    }
    document.getElementById('recent-cmt').innerHTML = html;
  }
 
  const scr_rc = document.createElement('script');
  scr_rc.src = '/feeds/comments/summary?alt=json-in-script&max-results=' + maxnum + '&callback=loadcmt';
  document.getElementById('recent-cmt').after(scr_rc);
</script>
<style>
  .rc-note {
    margin-bottom: 2em;
  }
  .rc-block {
    display: block;
    font-size: 0.9em;
    color: #444 !important;
    padding: 1em 0.5em;
    border-top: 1px dashed #bbb;
    word-break: break-all;
    transition: 0.3s;
  }
  .rc-block:hover {
    text-decoration: none;
    background: #fafafa;
  }
  .rc-head {
    display: flex;
    height: 40px;
    line-height: 40px;
    margin-bottom: 10px;
  }
  .rc-head img {
    display: block;
    width: 38px;
    height: 38px;
    border: solid 1px #ccc;
    border-radius: 50%;
    margin: 0;
  }
  .rc-author {
    font-weight: bold;
    margin: 0 10px;
  }
  .rc-time {
    color: #777;
  }
</style>

maxnumは表示コメント数、maxstrは最大表示文字数で、お好きな値に設定して頂くことができます。

追加機能(2022/6/22)

ご要望を頂き、コメントリンクを対象コメント自体へのリンクと(対象コメントがある)ページへのリンク両方に設定できるようにしました。

デフォルトは対象コメント自体へのリンクとなっており、c_linkの部分をfalseに設定すればページへのリンクに切り替えることができます。

HTML/JavaScriptガジェットを利用する場合

HTML/JavaScriptガジェットのコンテンツにコードを貼り付け、保存をクリックすれば導入完了です。サイドバーなどお好きな場所に設置してください。

ガジェット画像

削除する際は「編集」→「削除」で簡単に削除できます。

ページを利用する場合

ページを利用する場合は、同じく本体にコードを貼り付けて保存すればOKです。

ページ画像

こちらも削除の際はページごと削除するか、本体をクリアしてください。

解説

実際に使用するとこのような感じになります。

コメント一覧画像

今回のウィジェットはフィードからコメント情報を取得し、maxnumに指定した数までコメントを表示する仕組みになっています。

各コメントは全体がリンクとなっており、対象コメント部分にすぐ移動できるようになっています。また、コメント部分はHTMLタグを全て除去しているため、本体部分の表示が崩れる心配もありません。

補足

HTMLタグを除去しているため改行がなく、少し読みにくいかもしれません。気になる方は、32行目csum部分のコードを以下のように置き換えてください。違うタグの箇所は表示に違和感が出てしまうかもしれませんが、読みやすくはなると思います。

cmtsum = cmtsum.replace(/<\S[^>]*>/g, ' ');
↓↓
cmtsum = cmtsum.replace(/<\S[^>]*>/g, '<br/>');
40件のコメント
コード56行にエラーがあります。 widht-> width突然目に登場しますね^^
ところで、このブログでは、最新のコメントウィジェットを使用していないのですか?
ああ、fujiさんのようなリンクを使用しているんですね。
BINUBALLさん、コード間違いのご指摘ありがとうございます。早速修正しました(^^;

最新のコメントウィジェットは今回自作したものが初めてですね。ちゃんとナビゲーションバーにも表示しておきました。
すばらしい!
実は自力で改良しようと試みてみたものの、案の定挫折orz...
早速当ブログのウィジェットもこちらのものと入れ替えて、記事にも追記させていただきました。
https://fujilogic.blogspot.com/2019/05/recent-comment-widget.html#ps1

デザインも何気に元々使ってたものと近かったのでカスタマイズも楽でした(´▽`)
ちなみにですが…「名前/URL」での投稿者のアバターが空白になっているのですが。匿名のような画像を表示させることって可能ですかね?
ふじやんさん、コメントありがとうございます。お役に立てたようで何よりです(^^)

記事も紹介していただきありがとうございますm(_ _)m
なんと、名前/URLだと表示されてないんですね。確認不足でした…

とりあえず、.rc-head imgに匿名用の壁紙を設定しておけば表示自体はできると思います。根本的な対処についてはまた改めて考えておきます。
なるほどその手がありましたか。
早速 background-image を付けて対処しました。
ご不便おかけしました。コードのほう修正したので「名前/URL」の場合も正しく表示されるようになっていると思います。

調べたら匿名と「名前/URL」の場合はどちらにもblank.gifが適用されるようだったので、matchで判定してそれらに該当すれば匿名画像URLに差し替えるようにしました。
早速のご対応ありがとうございますm(_ _)m
スクリプトの部分を入れ替えてみた所、アバターが表示されているのを確認しました(^^)
ご確認ありがとうございます。安心しました(^^)
こんばんは。ひとつ気づいた点がありますので一応ご報告を。
固定ページのコメント(うちのふじ庵とか)の場合はリンク先がコメントパーマリンクでなくてページへのリンクになってしまいますね。
もし可能であれば対応して頂ければ幸いです(^^;
こんばんは。固定ページへのコメント…思わぬ落とし穴でした(^^;

ご報告ありがとうございます。対応策を考えておきます。
>ふじやんさん
固定ページのコメントパーマリンクの件、修正しました。お手数ですが再度スクリプトを入れ替えていただくようお願いいたします。
ありがとうございます。それにしても相変わらず仕事が早い!
修正後のコード、固定ページのコメントもちゃんとパーマリンクになっているのを確認しました。
もうこれで完璧なんじゃないですかね(^^)
ありがとうございます。問題解決できて何よりです(^^)
すいません、たまたひとつバグがありましたので一応ご報告を…
表示文字数を跨いだaタグがある場合は表示が崩れてしまうようです。
とりあえず表示文字数を減らしてaタグの前で切れるようにすれば問題ないようで、今はそれで凌いでます(^^;
何度もすいません…更にバグが判明しました(^^;
削除済みコメントがあるとウィジェット自体が表示されなくなってしまうようです。
うちではいつも完全に削除してしまうので影響はないですけど、一応修正されたほうがよいかと。
補足です。影響が出るのは最新コメントが削除されたときだけで、それ以外は問題ないようです。
ふじやんさん、ご報告ありがとうございます。aタグによる表示崩れの件と削除済みコメントの件、承知しました。

事情により原因の究明・修正に時間がかかってしまうかもしれませんが、できる限り早めに対処させていただきます。
>ふじやんさん
コードのほう、修正しました。削除済みコメントの問題は解消できましたが、aタグの問題に関しては確認しきれておらず少し不安があります…

ご確認のほどよろしくお願いしますm(_ _)m
お忙しい中ご対応いただきありがとうございますm(_ _)m
削除済み、及び aタグ問題に関しても修正されているのを確認しました。
今度こそ安心して使わせて頂けそうです(^^)
こちらこそ、何度もご確認いただきありがとうございます。作成したウィジェットに関してはしっかり責任をもちたいので、今後も不具合等ありましたらご連絡のほどよろしくお願いいたします。
ありがとうございます。
おかげさまで出来ました。
ずっとコメント一覧表示を欲しいと思っていたのでとても助かりました。
心より感謝いたします。
>匿名さん
コメントありがとうございます。お役に立てたなら何よりです(^^)
こんばんは。
テストブログでこのコメントウィジェットを設置して、改行を有効にしようとして気づいたのですが、最後の「補足」の所で cmtsum の部分と書かれていますが、実際のコードでは csum になってますね(^^;
>ふじやんさん
ご指摘ありがとうございます。記述がコード修正前のままになっていたみたいですね。直しておきます(^^;
申し訳ございません。
お礼を書き込んでおりませんでした。
利用させていただいてます。
ありがとうございました。
>問わず語りさん
ご丁寧にありがとうございます。
お役に立てて嬉しいです。
Fumaさん、こちらのコメント一覧を当ブログにも導入させて頂きました。
ありがとうございます。
>あトんさん
コメントありがとうございます。
利用して頂けて嬉しいです。
とても素晴らしいですね。すみませんが、コメントリンクをコメント自体へのurlではなくコメントされたページのurlにすることはできますか?
>匿名さん
コメントありがとうございます。
ご要望を受け、コードと記事の内容をアップデートしました。
リンクの切り替え機能を追加しているので、ご確認の程よろしくお願いします。
わあ、凄いです。こちらのサイトはインターネットの希望のようなところですね。こんなに早く望み通りのものを頂けるとは思ってもみませんでした。大変ありがとうございました。
コードを利用させて戴きました。
こんなに簡単にスマートに表示できるようになるとは思いませんでした。
ありがとうございました。
>あまにゃんさん
コメントありがとうございます。
お役に立てて嬉しいです。
 私のブログでもこちらのコメント一覧表示コードを使わせてもらいました。これまでも色々なコードを使ってきましたがFumaさんのコードが最も具合がよく、これ以上ないくらいの出来で大変ありがたかったです。使いやすいものを作っていただき、誠にありがとうございました。
>花園祐さん
嬉しいお言葉ありがとうございます。
お役に立てて何よりです。
お世話になります。当方もBloggerを利用しており、コメントの一覧表示をしたいと思っていたところ、こちらの記事を見つけました!試してるのですが、表示がされず、困っております。限定公開の設定では動作しないなどありますでしょうか。
>Swickさん
コメントありがとうございます。
本記事のウィジェットはフィードを利用している都合上、限定公開では正しく動作しません。
ウィジェットを有効にするには、設定を一般公開にしていただく必要があります。
ご不便をおかけしますが、よろしくお願いいたします。