Astro + microCMSでOGPタグを設定する(トップ・記事詳細)
2024/11/08 (金) - 09:00 JavaScriptPHP&CMS
フロントサイドのフレームワークのAstroとヘッドレスCMSのmicroCMSでブログを作った時の話。トップページと記事詳細ページにそれぞれOGPを実装したときのメモです。もっと完結でシンプルないい方法があればいいなァ…などと。
環境は以下の通りで、microcms-js-sdkを利用。実装方法は公式ドキュメントに準じました。
- microcms-js-sdk 3.1.x
- Astro 4.16.x
やりたいこと
- トップページと記事詳細で
og:type
を分ける(トップページ:website
、記事詳細ページ:article
) - トップページと記事詳細で
og:image
を分ける(トップページ:決められた看板画像、記事詳細ページ:記事のアイキャッチ画像) - トップページと記事詳細で
og:description
を分ける(トップページ:決められた文字、記事詳細ページ:記事の抜粋) - canonical(カノニカル)も指定する
microCMSで取得するフィールド
- 記事ID(id)<記事詳細のURLのスラッグとする>
- ページタイトル(title)
- 記事本文(content)
- 記事の抜粋(excerpt)
- アイキャッチ画像URL(eyecatch)
- 公開日(publishedAt)
.envファイル
サイト名やディスクリプション、APIのエンドポイントを指定します。
SiteTitle=ずんずんブログ
SiteDescription=カワイイずんだもんのブログをみるのだ
MICROCMS_SERVICE_DOMAIN=*****
MICROCMS_API_KEY=*****
astro.config.mjsファイル
公開するドメインを指定します。
import { defineConfig } from 'astro/config';
export default defineConfig({
site: 'https://example.com'
})
Layout.astroファイル
head要素内のSEO関連タグなどをPropsから取得し指定します。さらに、Astro.url.pathname
でトップページか否かをを判定し、og:type
の分岐をしています。
---
const SiteTitle = import.meta.env.SiteTitle;
const Url = new URL(Astro.url.pathname, Astro.site);
const {Meta} = Astro.props;
const IsHome = Astro.url.pathname === '/';
const OgType = IsHome ? 'website' : 'article';
const PageTitle = IsHome ? SiteTitle : `${Meta.title} - ${SiteTitle}`;
---
<!DOCTYPE html>
<html lang="ja">
<head prefix="og: https://ogp.me/ns#">
<meta charset="UTF-8" />
<meta content="width=device-width" name="viewport" />
<meta content={Astro.generator} name="generator" />
<meta content={Meta.description} name="description" />
<meta content="max-image-preview:large" name="robots" />
<meta property="og:title" content={Meta.title} />
<meta property="og:type" content={OgType} name="og_type" />
<meta property="og:site_name" content={SiteTitle} name="og_site_name" />
<meta property="og:url" content={Url} name="og_url" />
<meta property="og:image" content={Meta.image} name="og_image" />
<meta property="og:description" content={Meta.description} name="og_description" />
<meta content="summary_large_image" name="twitter:card" />
<meta content={Meta.title} name="twitter:title" />
<meta content={Meta.description} name="twitter:description" />
<meta content={Meta.image} name="twitter:image" />
<link rel="canonical" href={Url} />
<title>{PageTitle}</title>
</head>
<body>
<header>
<h1>{SiteTitle}</h1>
</header>
<slot />
</body>
</html>
CSSの読み込みやtouch-icon、faviconなどの指定は省略しています。
index.astroファイル(トップページ)
metaのOGPに指定するディスクリプションとOGP画像を指定した値に設定します。
---
import Layout from '../layouts/Layout.astro';
import { getBlogs } from '../library/microcms';
import { format } from 'date-fns';
const Meta = {
title: 'トップページ',
description: import.meta.env.SiteDescription,
image: new URL('/asset/images/ogp.png', Astro.site)
}
const res = await getBlogs({ fields: ['id','title','excerpt','publishedAt'] });
---
<Layout Meta={Meta}>
<main>
<ul>
{
res.contents.map((content) => (
<li><a href={content.id}>
<h2>{content.title}</h2>
<p><time>{format(new Date(content.publishedAt), 'yyyy年MM月dd日')}</time></p>
<p>{content.excerpt}</p>
</a></li>
))
}
</ul>
</main>
</Layout>
[id].astroファイル(記事詳細ページ)
SSGのためのgetStaticPaths
を記述するほか、APIから取得した記事データを表示し、metaのOGPに指定する情報を格納します。
---
import Layout from '../layouts/Layout.astro';
import { getBlogs, getBlogDetail } from '../library/microcms';
import { format } from 'date-fns';
export async function getStaticPaths() {
const response = await getBlogs({ fields: ['id'] });
return response.contents.map((content) => ({
params: {
id: content.id,
}
}));
}
const { id } = Astro.params;
const res = await getBlogDetail(id);
const Meta = {
title: res.title,
description: res.excerpt,
image: res.eyecatch.url
}
---
<Layout Meta={Meta}>
<main>
<h1>{res.title}</h1>
<p><time>{format(new Date(res.publishedAt), 'yyyy年MM月dd日')}</time></p>
<div set:html={res.content}></div>
</main>
</Layout>
あとは巡回して正常にOGPが指定されているか確認すればOKです。
おしまい♥
おすすめ記事
- HTML dialog要素の使い方
- 戻るボタンで広告が表示されるギミックを簡易的に実装する
- Web Speech APIを使ってブラウザでテキストを読み上げる
- さくらのレンタルサーバーのPHPとSQLiteを使ってみた
- Next.js(App Router)で、Fetch APIを使った静的ファイル生成(SSG)でヘマした
トラックバック & ピンバック
- この記事へのトラックバックURI:
- https://weblog.walk-life.me/astro_microcms_ogp/trackback/