Claude Code で WordPress ブログ記事投稿を自動化した

1. やったこと

Androidアプリ「Trade Tracker」の紹介記事を書くにあたり、記事生成から WordPress への投稿までを Claude Code と PowerShell で自動化しました。具体的には以下を実装しています。

  • GitHub リポジトリから DEVLOG.md・コミット履歴を取得して記事のネタを収集
  • PowerShell の System.Drawing で TOP 画像(PNG)を生成
  • 技術スタック・アーキテクチャ・画面フローなど 5 種類の図を SVG で生成
  • Qiita 風・教科書調の記事本文を Gutenberg ブロック形式で生成
  • WordPress REST API で画像アップロード・カテゴリ作成・記事投稿を実行
  • 一連の処理を /blog-app-post カスタムコマンドとしてスキル化

2. 全体の処理フロー

全体処理フロー ① GitHubからアプリ情報を取得 gh api でDEVLOG.md・コミット履歴・リポジトリ情報を収集 ② TOP画像を生成(PNG) System.Drawing で 1200×630px ③ SVG図を生成(5種類) 技術スタック/アーキテクチャ/画面/API/DB ④ 記事本文を生成(Gutenbergブロック形式) Qiita風・教科書調 / SVGをwp:htmlブロックとしてインライン埋め込み / UTF-8 BOMなし保存 ⑤ 画像をWordPressにアップロード REST API /wp/v2/media へPOST ⑥ カテゴリを確認・作成 REST API /wp/v2/categories ⑦ 記事を下書き投稿 JavaScriptSerializer + HttpWebRequest でUTF-8バイト直送 → /wp/v2/posts へPOST ✅ 管理画面URLを出力して完了 各ステップ実行前にAI運用5原則に従いy/n確認を取る

3. WordPress REST API 認証

3-1. アプリケーションパスワードの取得

WordPress REST API への書き込みには認証が必要です。プラグイン不要で使える「アプリケーションパスワード」を利用します。WordPress 5.6 以降は標準機能として搭載されています。

  1. WordPress 管理画面(/wp-admin)にログイン
  2. ユーザー → プロフィール → 「アプリケーションパスワード」セクションへ移動
  3. 任意の名前(例:Claude Code)を入力して「新しいアプリケーションパスワードを追加」をクリック
  4. 表示された xxxx xxxx xxxx xxxx xxxx xxxx 形式のパスワードをコピーして保存

3-2. Basic 認証の実装

ユーザー名とアプリケーションパスワードを username:password の形式で Base64 エンコードし、Authorization ヘッダーに付与します。

   = "your-username"
   = "xxxx xxxx xxxx xxxx xxxx xxxx"
 = [Convert]::ToBase64String(
    [Text.Encoding]::ASCII.GetBytes(":")
)
 = @{ Authorization = "Basic " }

# 認証テスト
 = Invoke-RestMethod -Uri "https://your-site.com/wp-json/wp/v2/users/me" -Headers 
Write-Host "認証OK: "

4. 画像・図の自動生成

4-1. TOP 画像(PNG)を PowerShell で生成

Python や Node.js がなくても、PowerShell には .NET の System.Drawing が利用できます。これを使って 1200×630px(OGP 推奨サイズ)の PNG 画像を生成します。

Add-Type -AssemblyName System.Drawing

 = 1200;  = 630
 = New-Object System.Drawing.Bitmap(, )
   = [System.Drawing.Graphics]::FromImage()
.SmoothingMode = [System.Drawing.Drawing2D.SmoothingMode]::AntiAlias

# 背景グラデーション
 = New-Object System.Drawing.Drawing2D.LinearGradientBrush(
    [System.Drawing.Point]::new(0,0),
    [System.Drawing.Point]::new(0,),
    [System.Drawing.Color]::FromArgb(255,10,15,40),
    [System.Drawing.Color]::FromArgb(255,5,5,20))
.FillRectangle(, 0, 0, , )
.Dispose()

# タイトルテキスト描画
  = New-Object System.Drawing.Font("Arial", 80, [System.Drawing.FontStyle]::Bold)
 = New-Object System.Drawing.SolidBrush([System.Drawing.Color]::White)
.DrawString("アプリ名", , , 80, 150)

.Dispose()
.Save("top.png", [System.Drawing.Imaging.ImageFormat]::Png)
.Dispose()

4-2. 技術図を SVG で生成

技術スタック図・アーキテクチャ図・画面フロー図・API シーケンス図・DB スキーマ図の 5 種類を SVG ファイルとして生成します。SVG はテキストファイルなので Claude Code の Write ツールで直接作成でき、WordPress の wp:html ブロックとして記事にインライン埋め込みできます。

SVG の共通デザイン仕様は以下の通りです。

項目仕様
背景色#0f1923(濃紺)
UI層青系(#4a90d9
ViewModel層緑系(#4ac97a
Repository層オレンジ系(#d9a040
DB層紫系(#7a7ad9
API層ピンク系(#c94a7a

5. 記事本文の生成

5-1. Gutenberg ブロック形式が必須

WordPress REST API 経由で投稿する際、生の HTML をそのまま送っても Gutenberg エディターでは表示されません。Gutenberg はブロックコメント(<!-- wp:paragraph --> 等)がないと内容を認識できない仕様です。

要素Gutenbergブロック形式
段落<!-- wp:paragraph --><p>...</p><!-- /wp:paragraph -->
見出しH2<!-- wp:heading {"level":2} --><h2>...</h2><!-- /wp:heading -->
リスト<!-- wp:list --><ul>...</ul><!-- /wp:list -->
コード<!-- wp:code --><pre class="wp-block-code">...</pre><!-- /wp:code -->
テーブル<!-- wp:table --><figure>...</figure><!-- /wp:table -->
SVG・任意HTML<!-- wp:html -->...<!-- /wp:html -->

5-2. SVG のインライン埋め込み

SVG を画像としてアップロードするには WordPress 側でプラグインが必要ですが、wp:html ブロックとしてインライン埋め込みすればプラグインなしで表示できます。

<!-- wp:html -->
<svg xmlns="http://www.w3.org/2000/svg" width="760" height="420">
  ...
</svg>
<!-- /wp:html -->

6. 詰まったポイントと解決策

6-1. PowerShell の ConvertTo-Json でコンテンツが消える

PowerShell 5.1 の ConvertTo-Json は SVG や大きな HTML 文字列を含むオブジェクトを正しくシリアライズできない場合があります。JSON として送信したデータが WordPress 側で空になっていました。

解決策: System.Web.ExtensionsJavaScriptSerializerHttpWebRequest を組み合わせ、UTF-8 バイトを直接ストリームに書き込む方式に変更しました。

Add-Type -AssemblyName System.Web.Extensions
 = New-Object System.Web.Script.Serialization.JavaScriptSerializer
.MaxJsonLength = 200000000

   = .Serialize()
 = [System.Text.Encoding]::UTF8.GetBytes()

 = [System.Net.HttpWebRequest]::Create("https://your-site.com/wp-json/wp/v2/posts")
.Method = "POST"
.Headers.Add("Authorization", "Basic ")
.ContentType = "application/json; charset=utf-8"
.ContentLength = .Length
 = .GetRequestStream()
.Write(, 0, .Length)
.Close()

6-2. ファイルの文字化け(Shift-JIS 問題)

PowerShell 5.1 は Get-Content のデフォルトエンコードがシステム依存(日本語環境では Shift-JIS)です。UTF-8 で書かれた SVG や HTML を読み込むと日本語が文字化けします。

解決策: ファイルの読み書きをすべて StreamReader / StreamWriter で行い、エンコードを明示的に UTF-8 BOMなし に統一しました。

# 読み込み(UTF-8 BOMなし)
 = New-Object System.IO.StreamReader(, [System.Text.Encoding]::UTF8)
 = .ReadToEnd(); .Close()

# 書き込み(UTF-8 BOMなし)
 = New-Object System.IO.StreamWriter(, False,
    (New-Object System.Text.UTF8Encoding(False)))
.Write(); .Close()

6-3. カテゴリ名の文字化け

Invoke-RestMethodConvertTo-Json で変換した日本語 JSON を渡すと、WordPress 側でカテゴリ名が「?????」になりました。これも同じエンコード問題です。

解決策: カテゴリ作成・更新も HttpWebRequest + UTF-8 バイト直送に統一しました。既に文字化けしたカテゴリは DELETE ではなく PATCH(X-HTTP-Method-Override ヘッダー使用)で名前を上書き修正しました。

7. スキル化(/blog-app-post)

今回の手順を Claude Code のカスタムスラッシュコマンドとして保存しました。~/.claude/commands/blog-app-post.md にコマンドの処理手順を記述することで、次回以降は以下のコマンド一発で同じ処理が実行できます。

# 別のアプリの記事を投稿する場合
/blog-app-post WifiDrop
/blog-app-post FamiLog

スキルは以下の処理を順番に実行します。

  1. メモリから WordPress 認証情報を読み込み、確認表示して y/n を取得
  2. GitHub から DEVLOG.md・コミット履歴を取得
  3. TOP 画像(PNG)と SVG 図 5 種類を自動生成
  4. Qiita 風・10 セクション構成の記事本文を生成
  5. WordPress へ画像アップロード・カテゴリ確認・記事投稿(下書き)
  6. 管理画面 URL を出力

8. まとめ

課題解決策
ConvertTo-Json でコンテンツが消えるJavaScriptSerializer + HttpWebRequest に変更
日本語の文字化けStreamReader / StreamWriter で UTF-8 BOMなし統一
Gutenberg に表示されないすべての要素をブロックマーカーで囲む
SVG を WordPress に埋め込むwp:html ブロックとしてインライン埋め込み
毎回同じ手順を繰り返す/blog-app-post スキルとして保存・再利用

Claude Code を使えば、アイデアを伝えるだけで画像生成・記事執筆・API 投稿まで一貫して自動化できます。同じパターンのアプリが複数ある場合はスキル化しておくと、次回以降のコストをほぼゼロにできます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA