【AIログ解説】「SEO対策して」の一言で38記事が一括更新されるまで|AISO対策も同時適用
この記事でわかること
- ── STEP 1 ── プロンプト(依頼)
- ── STEP 2 ── Claudeの判断プロセス
- ── STEP 3 ── 実行したコード
- ① スクリプトに追加したSEO/AIOSスキーマ生成
- ② 過去記事への適用(Obsidianソースなし30記事)
- ── STEP 4 ── ターミナルログ(実際の出力)
「SEOやAI用のSEO(AISO)を意識して作っていきたい。今まで書いた全記事にそういう対策をしてもらうことってできますか」
この一言で、38本の記事が一括でSEO/AISO対応に更新された。その裏側を記録する。
── STEP 1 ── プロンプト(依頼)
SEOやAI用のSEOありますよねあれらを意識して作っていきたいな
今まで書いてもらった全記事にそういう対策をしてもらうことってできますか
対策後にGoogleアナリクスを開くようにもしてもらえますか
── STEP 2 ── Claudeの判断プロセス
まず現状の記事数と対策状況を確認した。
- 全記事数の確認 → WordPress APIで全記事を取得 → 38記事
- SEO対策の現状確認 → スキーマは「ArticleとFAQ」のみ、FAQの回答が「〇〇について解説します」という汎用テキストで不十分
- 対策の設計:
- FAQスキーマ強化 → 見出しを疑問形に変換+セクション本文を実際の回答として使用
- Speakableスキーマ追加 → 音声検索・AI検索向けにコンテンツを明示
- BreadcrumbListスキーマ追加 → サイト構造をGoogleに明示
- メタディスクリプション改善 → 見出し羅列→本文の核心段落から生成
- 記事を2種類に分類:
- Obsidianソースあり(8記事)→ Markdownから再生成
- Obsidianソースなし(30記事)→ WordPress HTMLから直接更新
── STEP 3 ── 実行したコード
① スクリプトに追加したSEO/AIOSスキーマ生成
FAQスキーマ(改善版)
def _heading_to_question(heading):
"""見出しを疑問形の質問に変換"""
if heading.endswith('?') or heading.endswith('?'):
return heading
if re.search(r'(方法|手順|やり方)', heading):
return f"{heading}を教えてください"
return f"{heading}とは何ですか?"
def _extract_section_text(content, heading):
"""見出し直後の段落テキストを実際の回答として抽出"""
pattern = rf'#{{{2,3}}}\s+{re.escape(heading)}\s*\n+(.*?)(?=\n#{1,3}\s|\Z)'
m = re.search(pattern, content, re.DOTALL)
if m:
return m.group(1).strip()[:200]
return None
Speakable・BreadcrumbListスキーマの追加
# Article スキーマに Speakable を追加
{
"@type": "Article",
"speakable": {
"@type": "SpeakableSpecification",
"cssSelector": [".sisan-summary", "h2", "h3"]
}
}
# BreadcrumbList を新規追加
{
"@type": "BreadcrumbList",
"itemListElement": [
{"position": 1, "name": "ホーム", "item": "https://casio-pgs.com"},
{"position": 2, "name": title, "item": f"https://casio-pgs.com/{slug}"}
]
}
② 過去記事への適用(Obsidianソースなし30記事)
def update_old_post(post):
raw_content = post['content']['rendered']
headings = re.findall(r'<h[23][^>]*>([^<]+)</h[23]>', raw_content)
# 既存のschema・styleを除去して再注入
clean = re.sub(r'<script type="application/ld\+json">.*?</script>', '', raw_content)
clean = re.sub(r'<style>.*?</style>', '', clean)
new_schemas = build_schemas(title, headings, "", slug)
new_content = f"{ARTICLE_STYLE}{new_schemas}{clean}"
requests.post(f'{WP_BASE}/posts/{pid}', auth=AUTH, json={
'content': new_content,
'meta': {'_oltana_description_display': seo}
})
── STEP 4 ── ターミナルログ(実際の出力)
=== Obsidianソース記事を更新 ===
ID:734 → 200 Claude Codeに「知り合いの情報」を...
ID:740 → 200 Claude Codeの「メモリ」はどこに...
(中略)
ID:773 → 200 【AIログ解説】「読みにくい」の一言が...
=== 過去記事 30件を更新 ===
ID: 285 → 200 Linuxで覚えておきたい!Ctrlキーのショートカット...
ID: 365 → 200 Raspberry PiでMariaDBを安全に...
(中略)
ID: 727 → 200 ClaudeはAIチャットじゃない。「デジタル製品を...
すべて200(成功)。38記事が数分で完了した。
── STEP 5 ── 何が起きたのかの解説
SEOとAISO(AI SEO)は何が違うのか
従来のSEO(Search Engine Optimization)は、GoogleなどのクローラーBotが記事を読んでインデックスするための最適化だ。
- メタディスクリプション
- 見出し構造(H1→H2→H3)
- 内部リンク
- ページ速度
AISO(AI Search Optimization)は、ChatGPTやPerplexityなどのAI検索エンジンが記事を読んで回答の素材として使うための最適化だ。
- FAQスキーマ → AI検索の質問に対する回答として認識されやすくなる
- Speakableスキーマ → 「この部分が重要なコンテンツ」とAIに明示
- 構造化データ全般 → AIが内容を正確に解釈できるようにする
なぜ「見出しを疑問形に変換」するのか
AI検索は「〇〇とは何ですか?」という形式で検索されることが多い。
FAQスキーマの質問を疑問形にしておくと、AI検索がその記事を「この質問への回答記事」として認識しやすくなる。
変換前:「チャットAIとClaude Codeの決定的な違い」
変換後:「チャットAIとClaude Codeの決定的な違いとは何ですか?」
なぜ「セクション本文を回答テキストとして使う」のか
以前のFAQスキーマはこうなっていた:
回答:「〇〇における△△について解説します。」(汎用テキスト)
これはGoogleやAI検索から見ると「実質的な情報がない」と判断される。
改善後は見出し直下の段落テキストを自動抽出して回答として使う:
回答:「Claude Codeはチャット型ではなく、AIエージェントとして動作する。
エージェントとは、AIが単に会話するだけでなく、ファイルの読み書き・コマンド実行…」
実際のコンテンツが回答になるため、AI検索の引用元として選ばれやすくなる。
Google Analyticsも同時に開いた理由
open "https://analytics.google.com"
対策後にアクセス状況を確認するため。変化が出るのは数日後だが、今のベースラインを確認しておくことが重要だ。
まとめ
- 「SEO対策して」の一言 → 38記事に3種類のスキーマが追加・更新
- FAQスキーマ → 見出しを疑問形に変換+実際の段落テキストを回答として設定
- Speakableスキーマ → AI検索・音声検索向けにキーコンテンツを明示
- BreadcrumbListスキーマ → サイト構造をGoogleに明示
- 過去30記事はWordPress HTMLから直接スキーマを注入・更新
SEOとAISOは別々の対策ではなく、「コンテンツを機械が正確に読めるようにする」という同じ方向性の延長線上にある。
関連記事
- AIログ解説_CSS修正と一括更新 — 全記事一括更新の仕組みの詳細
- ObsidianグラフとWordPressリンクの一致 — 内部リンクの自動化(SEOにも有効)
- エンジニア的思考を持つ非エンジニアが最強 — 今日の作業が自分の資産になる理由
- Claude活用ログ — 今日やったこと全体のまとめ
TAG
