【Blogger】URLを貼るだけで自動的にブログカード化する方法(コピペでOK)

2026年2月3日

【Blogger】URLを貼るだけで自動的にブログカード化する方法(コピペでOK)

Bloggerで記事を書いていると、「他サイトのリンクを貼るとき、もっと見栄え良くしたい」と思うことはありませんか? WordPressなどではURLを貼るだけで自動的に「ブログカード(サムネイル付きのリンクボックス)」が表示されますが、Bloggerの標準機能では単なるテキストリンクになってしまいます。ブログを運営して半年ほどずっと悩んでいました。

調べると手動で、カードを作成する方法はありました。

ですが、毎回手動でカードを作成するツールを使うのも手間なので、「URLを貼るだけで、勝手にブログカードに変換してくれる」カスタマイズを導入してみました。

今回はその方法をシェアします。JavaScript(スクリプト)をテーマに追加するだけで、過去の記事も含めて一括で適用できるので便利です。

※お使いのテーマによっては機能しない可能性もあります。

このカスタマイズでできること

記事の投稿画面で、以下のように「URLのリンクだけ」を1行に書き上部のリンク挿入をすると

       https://tetsu-miscellaneous.blogspot.com/

読者が見る画面では、自動的に以下のようなブログカードに変換されて表示されるようになります。

img_0c5b2201a24c

※2026/02/19 ブログカードデザインを変更したため、現在ブログで表示されるデザインは違います。

現在のブログカードデザイン

https://tetsu-blog.net/posts/antigravity-blog-customize/

導入手順

作業はBloggerのテーマ(HTML)にコードを追記するだけです。

※念のため、作業前にテーマのバックアップ(XMLのダウンロード)を取っておくことをおすすめします。

  1. Blogger管理画面のメニューから「テーマ」をクリック
  2. 「カスタマイズ」の右にある▼をクリックし、「HTMLを編集」を選択
  3. エディタ内をクリックし、Ctrl + F(MacはCmd + F)で </body> を検索
  4. </body> タグの直前に、以下のコードをコピーして貼り付けます

以下のコードをコピーして、Blogger管理画面の「テーマ」→「HTML編集」で、</body> タグの直前に貼り付けてください。


<!-- [START] 自動ブログカード化スクリプト -->
<script>
//<![CDATA[
document.addEventListener("DOMContentLoaded", function() {
  var postBodies = document.querySelectorAll(".post-body");
  postBodies.forEach(function(postBody) {
    var links = postBody.getElementsByTagName("a");
    for (var i = links.length - 1; i >= 0; i--) {
      var link = links[i];
      if (link.href === link.textContent.trim() && !link.querySelector('img')) {
        var iframe = document.createElement("iframe");
        iframe.setAttribute("src", "https://hatenablog-parts.com/embed?url=" + encodeURIComponent(link.href));
        iframe.setAttribute("style", "width:100%; height:190px; max-width:100%; margin: 10px 0; border:none; display:block;");
        iframe.setAttribute("scrolling", "no");
        iframe.setAttribute("frameborder", "0");
        iframe.setAttribute("loading", "lazy");
        var parent = link.parentNode;
        if (parent.textContent.trim() === link.href) {
            parent.insertBefore(iframe, link);
            link.style.display = "none";
        }
      }
    }
  });
});
//]]>
</script>
<!-- [END] 自動ブログカード化スクリプト -->
  • 右上の保存ボタン(フロッピーアイコン)を押して保存します。

使い方と注意点

カスタマイズ後の記事の書き方には、簡単なルールがあります。

  • URLを貼り付けてリンク化する
    (BloggerのエディタでURLを貼り付け、リンクボタンを押して青文字の状態にします)
  • その行にはURL以外書かない
    (「おすすめ→ https://…」のように文字が混ざっていると、テキストリンクのままになります)

この仕組みは「はてなブログ」が提供している無料のブログカード機能を利用して表示させています。

とても簡単に見栄えが良くなるので、Bloggerユーザーの方はぜひ試してみてください。


上記のはてなブログカード版は手軽ですが、「デザインのカスタマイズができない」という欠点がありました。
そこで、より高速で、かつCSSで自由にデザインを変更できる「Microlink API版」にアップデートしました。

新しいコードは以下の通りです。基本的にはJavascriptを差し替え、CSSを追加するだけです。

1. CSSの追加

<head> 内の <b:skin>...</b:skin> 内、または <style>...</style> 内に以下を追加してください。


/* ブログカードのデザイン */
.blog-card {
  display: flex !important;
  background-color: #ffffff;
  border: 1px solid #e0e0e0;
  border-radius: 4px;
  box-shadow: 0 1px 3px rgba(0,0,0,0.08); /* 影を調整 */
  margin: 1.5em 0;
  text-decoration: none !important;
  color: #333 !important;
  overflow: hidden;
  height: 140px; /* 固定高さ */
  transition: all 0.3s ease;
}
.blog-card:hover {
  box-shadow: 0 4px 10px rgba(0,0,0,0.15); /* ホバー時の影 */
  transform: translateY(-2px);
  opacity: 1 !important;
}
.blog-card-thumbnail {
  width: 35%; /* 画像の幅 */
  min-width: 120px;
  max-width: 200px;
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  flex-shrink: 0;
  border-right: 1px solid #f0f0f0;
}
.blog-card-content {
  flex: 1;
  padding: 15px 20px;
  display: flex;
  flex-direction: column;
  justify-content: center;
}
.blog-card-meta {
  display: flex;
  align-items: center;
  font-size: 0.85em;
  color: #999;
  margin-bottom: 8px;
}
.blog-card-icon {
  width: 14px;
  height: 14px;
  margin-right: 6px;
  fill: #999;
}
.blog-card-title {
  font-size: 1.1em;
  font-weight: bold;
  line-height: 1.4;
  color: #333;
  margin: 0;
  max-height: 2.8em; /* 2行制限 */
  overflow: hidden;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
}

2. JavaScriptの差し替え

先ほどの </body> 直前のスクリプトを、以下の新しいスクリプトに書き換えてください。


<script>
//<![CDATA[
document.addEventListener("DOMContentLoaded", function() {
  var postBodies = document.querySelectorAll(".post-body");
  postBodies.forEach(function(postBody) {
    var links = postBody.getElementsByTagName("a");
    // 配列に変換して処理
    for (var i = links.length - 1; i >= 0; i--) {
      var link = links[i];
      var text = link.textContent.trim();
      var href = link.href;

      // URLのみのリンクかつ画像を含まない場合
      if ((href === text || href === text + "/") && !link.querySelector('img')) {
        // 重複処理防止
        if (link.getAttribute('data-processed')) continue;
        link.setAttribute('data-processed', 'true');

        var parent = link.parentNode;
        // 親要素のテキストがリンクのテキストと一致(=行全体がURLのみ)
        if (parent.textContent.trim() === text) {
           createBlogCard(link, parent);
        }
      }
    }
  });

  function createBlogCard(link, parent) {
      var url = link.href;
      
      // Microlink APIを使用してメタデータを取得 (JSON形式で高速)
      var apiUrl = 'https://api.microlink.io/?url=' + encodeURIComponent(url);
      
      fetch(apiUrl)
        .then(response => {
            if (!response.ok) throw new Error('Network response was not ok');
            return response.json();
        })
        .then(json => {
            var data = json.data;
            if (!data || !data.title) throw new Error('No metadata found');

            var title = data.title;
            var image = data.image ? data.image.url : null;
            var dateStr = '';

            // 日付の取得
            if (data.date) {
                var date = new Date(data.date);
                if(!isNaN(date.getTime())) {
                    dateStr = date.getFullYear() + '年' + (date.getMonth()+1) + '月' + date.getDate() + '日';
                }
            }
            // 日付がなければドメインを表示
            if (!dateStr) {
                 dateStr = data.publisher || new URL(url).hostname;
            }

            // 画像がある場合のみカスタムカードを表示
            if (image) {
                var card = document.createElement('a');
                card.className = 'blog-card';
                card.href = url;
                card.target = '_blank';
                card.rel = 'noopener noreferrer';
                
                card.innerHTML = `
                  <div class="blog-card-thumbnail" style="background-image: url('${image}')"></div>
                  <div class="blog-card-content">
                    <div class="blog-card-meta">
                      <svg class="blog-card-icon" viewBox="0 0 24 24"><path d="M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z"/></svg>
                      <span>${dateStr}</span>
                    </div>
                    <div class="blog-card-title">${title}</div>
                  </div>
                `;
                
                parent.insertBefore(card, link);
                link.style.display = 'none';
            } else {
                throw new Error('No image found');
            }
        })
        .catch(error => {
            // エラー時はHatenaブログカードにフォールバック
            var iframe = document.createElement("iframe");
            iframe.setAttribute("src", "https://hatenablog-parts.com/embed?url=" + encodeURIComponent(url));
            iframe.setAttribute("style", "width:100%; height:190px; max-width:100%; margin: 10px 0; border:none; display:block;");
            iframe.setAttribute("scrolling", "no");
            iframe.setAttribute("frameborder", "0");
            
            parent.insertBefore(iframe, link);
            link.style.display = "none";
        });
  }
});
//]]>
</script>

これで、よりリッチで高速なブログカードが表示されるようになります。万が一APIが動かない場合でも、自動的に旧来のはてなブログカードが表示される安全設計になっています。

あわせて読みたい