前提
AIもでてきたし、時代は個人サイトだよね(自分にしか需要がなかったり、あまりにニッチなことをやろうとすると結局手作りしかないよね。その手間が一瞬で終わるならなおさらの意味)。ということで、あらためてデジタル盆栽(趣味、好きな技術で実装するお遊びサイトの意味)をやっていたサイトをちゃんと各種サイトにBlogとして認識させるところまで持っていってみた

よくわからん文言はAIが勝手につけており、面白いのでそのままにしてある。
ソースはこちら
技術スタック
- Astro 5.16.4
- Tailwind CSS
バックエンド / データベース
- Firebase 12.6.0 - クライアントSDK
- Firebase Admin 13.6.0 - サーバーサイドSDK
- Firestore - NoSQLデータベース
- Firebase Storage - ファイルストレージ
- Firebase Hosting - ホスティング
SEO / アナリティクス
- @astrojs/sitemap 3.6.0 - サイトマップ生成
- @astrojs/rss 4.0.14 - RSSフィード生成
- @astrojs/partytown 2.1.4 - サードパーティスクリプト最適化(Google Analytics用)
モニタリング / エラートラッキング
- @sentry/astro 10.29.0 - エラートラッキング
- Sentry - プロジェクト: muzigen-net
テスト / 自動化
- Playwright 1.57.0 - E2Eテスト
- @astrojs/check 0.9.6 - TypeScript & Astroチェック
パッケージマネージャー
- pnpm - バージョン10
デプロイ / CI/CD
- GitHub Actions - 自動デプロイワークフロー
- Firebase Hosting - 本番環境
やってること
- firestorに記事データを保存、それをAstroで記事にしてhtml化というわけで、html直表示であるのでそれなりに軽快に動作してくれる
課題
ところで、最近転職活動をしているにあたって https://lapras.com/ というサイトを使っているんだけど、ここで自分の作ったサイトの記事がBlogとして認識してくれないという問題があった(以下が自分のProfileページ、現在は認識してくれている)
となればやることは、AIに「クローラーや各種WebサイトにBlogとして認識してもらうために必要な施策を各種実装してください」とお願いすることであり、改善施策を一通りやってもらった。というわけでやってもらった施策が以下。
↓以下AIによる解説
クローラーがブログとして認識するために必須の施策
1. 構造化データ (JSON-LD / Schema.org) ⭐最重要
該当コミット: d66b48d, 6f3fa0f, 5386231
必要なスキーマ:
- BlogPosting - 「これはブログ記事です」と明示的に宣言
- Blog - サイト全体やブログセクションがブログであることを宣言
- WebSite - サイト全体の構造を示す
- Organization / Person - 著者・運営者情報
なぜ重要か:
- Googleなどの検索エンジンに「これはブログである」と明示的に伝える唯一の方法
- 記事の構造(タイトル、本文、著者、公開日、カテゴリ)を機械可読形式で提供
- リッチスニペット(検索結果での拡張表示)の条件
2. RSS/Atomフィード
該当コミット: 384aa73, 61e6e35
重要な要素:
- /rss.xml エンドポイント
- タグ
- 各記事の公開日(pubDate)と更新日
なぜ重要か:
- RSS/Atomフィードはブログの伝統的な標識
- 時系列で更新されるコンテンツであることを示す
- 多くのクローラーがRSSの存在で「ブログ」と判断
3. サイトマップ
該当コミット: 72d44d2
重要な要素:
- sitemap.xml の自動生成
- 各URLの最終更新日(lastmod)
- 優先度(priority)と更新頻度(changefreq)
なぜ重要か:
- サイト全体の構造とすべての記事をクローラーに伝える
- 記事の更新頻度を示すことで「定期的に更新されるブログ」と認識される
4. 記事の時系列情報(日付メタデータ)
該当コミット: 310441c, ed40130
必要な要素:
- 公開日(datePublished)
- 更新日(dateModified)
- OGPのarticle:published_timeとarticle:modified_time
なぜ重要か:
- ブログの定義は「時系列で更新されるコンテンツ」
- 日付情報がないとニュースサイトや静的なコンテンツと区別できない
5. 著者情報
該当コミット: 29828d1, 310441c, d66b48d
必要な要素:
- 構造化データのauthorフィールド(PersonまたはOrganization)
- OGPのarticle:author
- 著者プロフィールページへのリンク
なぜ重要か:
- ブログは「誰かが書いたもの」という前提
- GoogleのE-E-A-T評価(専門性・権威性・信頼性)に影響
- 著者情報がないと自動生成コンテンツと見なされる可能性
6. タグ/カテゴリー構造
該当コミット: 1d5e5f1, 90c6dba
必要な要素:
- タグ/カテゴリーページ
- 構造化データのkeywordsまたはarticleSection
- OGPのarticle:tag
なぜ重要か:
- ブログは通常、トピック別に分類されている
- トピッククラスタ構造により「専門性のあるブログ」と認識される
優先順位付き実装リスト
クローラーにブログとして認識されるための優先度順:
🔴 必須(これがないとブログとして認識されない)
- BlogPosting構造化データ - 各記事ページに実装
- 記事の公開日・更新日 - datePublished, dateModified
- 著者情報 - author フィールド
🟡 非常に重要(ブログの標準機能)
- RSSフィード - /rss.xml + フィード検出タグ
- サイトマップ - sitemap.xml
- Blog/WebSite構造化データ - サイト全体の宣言
🟢 推奨(ブログとしての品質を高める)
- タグ/カテゴリー構造 - トピック分類
- 著者プロフィールページ - 著者の信頼性確立
確認方法
これらが正しく実装されているかは以下のツールで確認できます:
- 構造化データ: https://search.google.com/test/rich-results
- RSSフィード: フィードバリデーター、または直接 /rss.xml にアクセス
- サイトマップ: /sitemap.xml にアクセス、またはGoogle Search Consoleで確認
最も重要なのは構造化データ(BlogPosting + 日付 + 著者)とRSSフィードの2つです。これがあれば、クローラーは確実にブログとして認識します。
ここまでがAIによる解説
まとめ
と、体裁を整えたところで、Laprasにも無事記事として認識されるようになり、個人ブログに記事を書くモチベーションになったなーというお話でした。RSSとかメタデータがあればいいのかなと思っていたら、著作者データとかいろいろフォーマットがきまっているのね。と学びがありました。