未分類
完全なOGP設定の必要性と実装方法
本プロジェクトでの実装方針
このプロジェクト(log.eurekapu.com)では、以下の方針で完全なOGP設定を実装しています:
実装内容
- 全ページで完全なOGP設定を実装
[...slug].vue: 動的記事ページ(Markdown)index.vue: トップページ- その他の個別Vueページ
- 設定しているOGPフィールド
- 基本OGP:
ogTitle,ogDescription,ogType,ogUrl,ogImage,ogSiteName,ogLocale - 記事固有:
articlePublishedTime,articleModifiedTime,articleAuthor,articleTag - Twitter Card:
twitterCard,twitterTitle,twitterDescription,twitterImage
- 基本OGP:
- 実装済み
- すべてのOGPフィールドが設定済み
- フロントマターから動的に生成(Markdown記事)
- 絶対URLで画像とURLを指定
実装理由
- SNSシェア時の見栄え最適化:クリック率(CTR)向上
- ブランディング:プロフェッショナルな印象
- AI検索対応:ChatGPT SearchやPerplexityでの認識向上
- メッセージアプリ対応:Slack、Discord、LINEでのカード表示
なぜ完全なOGP設定が必要なのか
1. SNSでのシェア時の見栄えを最適化
TwitterやFacebook、LinkedIn、Slackなどでリンクをシェアした際、リンクプレビューカード が表示されます。OGP(Open Graph Protocol)を設定することで、このカードの表示内容を制御できます。
OGP未設定の場合:
- タイトルが不適切(ページタイトルそのまま)
- 説明文が自動抽出された意味不明な文章
- 画像が表示されない、または意図しない画像
- サイト名が表示されない
OGP設定済みの場合:
- 魅力的なタイトル
- 簡潔でわかりやすい説明文
- 視覚的に訴求する画像
- ブランド名(サイト名)が明示
→ クリック率(CTR)が大幅に向上します。
2. ブランディングとトラフィック増加
適切なOGP設定により:
- SNSでシェアされやすくなる
- プロフェッショナルな印象を与える
- サイトへの流入が増加
- ブランド認知度が向上
3. AI検索エンジンへの対応
ChatGPT Search、Perplexity、Google SGEなどのAI検索エンジンも、OGPメタデータを参照してコンテンツを理解します。
4. メッセージアプリでの表示最適化
Slack、Discord、LINE、iMessageなどでも、OGPが正しく設定されていると、リンクが魅力的なカードとして展開されます。
どのように実装するか
OGPの基本メタタグ
以下のメタタグを<head>内に記述します:
<!-- 基本的なOGPタグ -->
<meta property="og:title" content="ページのタイトル" />
<meta property="og:description" content="ページの説明文" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://log.eurekapu.com/page-path" />
<meta property="og:image" content="https://log.eurekapu.com/images/og-image.jpg" />
<meta property="og:site_name" content="log.eurekapu.com" />
<meta property="og:locale" content="ja_JP" />
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="ページのタイトル" />
<meta name="twitter:description" content="ページの説明文" />
<meta name="twitter:image" content="https://log.eurekapu.com/images/og-image.jpg" />
必須フィールド
| プロパティ | 説明 | 例 |
|---|---|---|
og:title | ページのタイトル(55文字以内推奨) | Nvidiaの堀:競合他社が直面する「無理ゲー」な9つの壁 |
og:description | ページの説明(155文字以内推奨) | Nvidiaには何重もの「防御壁」があり、正面から戦って勝つのは実質不可能である理由を解説 |
og:type | コンテンツタイプ | website(トップページ)、article(記事) |
og:url | 絶対URL(必須) | https://log.eurekapu.com/blog/nvidia-moat |
og:image | 絶対URLの画像 | https://log.eurekapu.com/images/og-image.jpg |
og:site_name | サイト名 | log.eurekapu.com |
推奨フィールド(記事の場合)
<!-- 記事固有のメタデータ -->
<meta property="article:published_time" content="2025-11-27T00:00:00+09:00" />
<meta property="article:modified_time" content="2025-11-27T00:00:00+09:00" />
<meta property="article:author" content="log.eurekapu.com" />
<meta property="article:tag" content="Nvidia" />
<meta property="article:tag" content="AI" />
OGP画像の推奨仕様
- 推奨サイズ: 1200×630px(アスペクト比 1.91:1)
- 最小サイズ: 600×315px
- 最大ファイルサイズ: 8MB以内
- フォーマット: JPG、PNG(PNGは透過非対応)
- 絶対URLで指定(相対パスは不可)
実装コード
トップページ(index.vue)の実装(実装済み)
<script setup>
useSeoMeta({
title: 'log.eurekapu.com - 日々の学びを記録する',
description: '日々の学びや発見を記録していく個人ログサイト。技術メモ、学習記録、気づきなどを綴っています。',
ogTitle: 'log.eurekapu.com - 日々の学びを記録する',
ogDescription: '日々の学びや発見を記録していく個人ログサイト。技術メモ、学習記録、気づきなどを綴っています。',
ogType: 'website',
ogUrl: 'https://log.eurekapu.com/',
ogImage: 'https://log.eurekapu.com/favicon.svg',
ogSiteName: 'log.eurekapu.com',
ogLocale: 'ja_JP',
twitterCard: 'summary',
twitterTitle: 'log.eurekapu.com - 日々の学びを記録する',
twitterDescription: '日々の学びや発見を記録していく個人ログサイト。技術メモ、学習記録、気づきなどを綴っています。',
twitterImage: 'https://log.eurekapu.com/favicon.svg',
})
</script>
動的記事ページ(...slug.vue)の実装(実装済み)
<script setup lang="ts">
import { computed } from "vue"
import { queryCollection } from "#imports"
const route = useRoute()
const docPath = computed(() => {
const normalized = route.path.replace(/\/$/, "")
return normalized === "" ? "/" : normalized
})
const { data: doc } = await useAsyncData(
`content-${docPath.value}`,
() => queryCollection("pages").path(docPath.value).first(),
{ watch: [docPath] }
)
useSeoMeta({
title: () => doc.value?.title || 'ページが見つかりません',
description: () => doc.value?.description || '',
ogTitle: () => doc.value?.title || 'ページが見つかりません',
ogDescription: () => doc.value?.description || '',
ogType: 'article',
ogUrl: () => `https://log.eurekapu.com${docPath.value}`,
ogImage: 'https://log.eurekapu.com/favicon.svg',
ogSiteName: 'log.eurekapu.com',
ogLocale: 'ja_JP',
twitterCard: 'summary',
twitterTitle: () => doc.value?.title || 'ページが見つかりません',
twitterDescription: () => doc.value?.description || '',
twitterImage: 'https://log.eurekapu.com/favicon.svg',
articleAuthor: 'log.eurekapu.com',
articlePublishedTime: () => doc.value?.publishedAt || '',
articleModifiedTime: () => doc.value?.publishedAt || '',
articleTag: () => doc.value?.tags || [],
})
</script>
個別ブログページ(Vue)での実装例
<script setup lang="ts">
useSeoMeta({
title: '記事タイトル',
description: '記事の説明...',
ogTitle: '記事タイトル',
ogDescription: '記事の説明...',
ogType: 'article',
ogUrl: 'https://log.eurekapu.com/blog/example',
ogImage: 'https://log.eurekapu.com/favicon.svg',
ogSiteName: 'log.eurekapu.com',
ogLocale: 'ja_JP',
twitterCard: 'summary_large_image',
twitterTitle: '記事タイトル',
twitterDescription: '記事の説明...',
twitterImage: 'https://log.eurekapu.com/favicon.svg',
articlePublishedTime: '2025-11-27',
articleModifiedTime: '2025-11-27',
articleAuthor: 'log.eurekapu.com',
articleTag: ['タグ1', 'タグ2'],
})
</script>
検証方法
1. Facebook Sharing Debugger
- https://developers.facebook.com/tools/debug/
- URLを入力してプレビュー確認
- キャッシュクリア機能あり
2. Twitter Card Validator
- https://cards-dev.twitter.com/validator
- URLを入力してプレビュー確認
3. LinkedIn Post Inspector
- https://www.linkedin.com/post-inspector/
- URLを入力してキャッシュクリア
4. OGP確認ツール
- https://www.opengraph.xyz/
- URLを入力して各SNSでの表示をまとめて確認
5. ブラウザDevTools
// ページのOGPタグを確認
document.querySelectorAll('meta[property^="og:"]')
よくある間違い
❌ 相対URLを使用
// NG
ogImage: '/images/og-image.jpg'
ogUrl: '/blog/article'
✅ 絶対URLを使用
// OK
ogImage: 'https://log.eurekapu.com/images/og-image.jpg'
ogUrl: 'https://log.eurekapu.com/blog/article'
❌ og:imageが欠落
// NG - 画像がないとカードが貧弱
useSeoMeta({
ogTitle: 'タイトル',
ogDescription: '説明',
})
✅ og:imageを必ず設定
// OK
useSeoMeta({
ogTitle: 'タイトル',
ogDescription: '説明',
ogImage: 'https://log.eurekapu.com/favicon.svg',
})
まとめ
完全なOGP設定は:
- SNSでのシェア時の見栄えを劇的に改善
- クリック率(CTR)を向上させる
- ブランディングとトラフィック増加に貢献
- 絶対URLで画像とURLを指定することが必須
本プロジェクトでは:
- すべてのページに完全なOGP設定が実装済み
- フロントマターから動的に生成(Markdown記事)
- OGP、Twitter Card、記事固有メタデータをすべて設定
- 絶対URLで画像とURLを指定