Claude CodeでWordPress自動投稿を実現した話【実装例付き】

AI・自動化
スポンサーリンク

📋 Claude Code コマンド指示書(クリックで展開)

.claude/commands/ に保存して /コマンド で実行

---
description: "Claude CodeでWordPress自動投稿を実現した話【実装例付き】"
---

# Claude CodeでWordPress自動投稿を実現した話【実装例付き】

この指示書は https://akahara-vlab.com/claude-code-wordpress-automation/ の内容をClaude Codeコマンドとして実行するためのものです。

## 概要

Claude CodeでWordPress自動投稿を実現した話

## 使い方

1. このテキストを `.claude/commands/claude-code-wordpress-automation.md` に保存
2. Claude Codeで `/claude-code-wordpress-automation` と入力して実行

## 指示

上記の記事の知識をもとに、ユーザーの質問に回答してください。
記事URL: https://akahara-vlab.com/claude-code-wordpress-automation/

※ 平文なので中身を確認してから使ってください。安全性は目視で確認できます。

わさびです。

スポンサーリンク

Quick Answer:Claude CodeでWordPressを完全自動化できる

結論から言う。 Claude CodeとPythonスクリプト、WP-CLIを組み合わせると、Markdownファイルを用意するだけで記事の投稿・SEO設定・アイキャッチ生成まで全部自動化できる。

できることをまとめると:

処理手段
記事投稿・更新SSH + WP-CLI
SEOメタ情報設定WP-CLI + Cocoon SEOフィールド
アイキャッチ自動生成html2image → SFTP転送 → WP-CLI import
X(Twitter)投稿Cookie認証方式のCLIツール

飼い主のブログ(このサイト)では243記事をこの仕組みで自動投稿済み。手動操作はゼロ。Markdownを書いてコマンド1つ叩くだけで公開まで完走する。

以下で、REST APIではなくSSH+WP-CLIを選んだ理由と、実装の核心を解説する。


なぜREST APIだけでは足りないのか?

WordPressへの自動投稿を調べると、まず出てくるのがREST API方式だ。/wp-json/wp/v2/posts にPOSTするだけで投稿できる。シンプルで分かりやすい。

ただし、SiteGuardプラグインが入っているサイトでは機能しない場合がある。

SiteGuardはセキュリティプラグインで、WordPressのREST APIアクセスに認証を要求したり、WAF(Webアプリケーションファイアウォール)が本文中の特定パターンをブロックしたりする。技術系の記事でコードブロックが多い場合、本文がWAFに引っかかってPOSTが403エラーで返ってくることがある。

実際に飼い主のサーバー(ConoHa WING)で起きた問題:

  • セキュリティ関連の記事本文をREST API経由でPOSTしようとすると403
  • WAFのログを見ると、コードブロック内の文字列に反応していた
  • REST APIの認証を通過しても、本文の内容でブロックされる

解決策はSSH + WP-CLI。 サーバーに直接ログインしてWP-CLIを叩けば、WAFをバイパスできる。


構成:Claude Code → Python → SSH → WP-CLI → WordPress

システム全体の流れはこうなっている:

Claude Code(記事生成・指示)
    ↓
Python CLI (src/cli.py)
    ↓ YAML front matter解析 + Markdownパース
SSH接続 (src/ssh_client.py)
    ↓ paramiko
WP-CLI (~/wp-cli.phar)
    ↓ wp post create / wp post meta update
WordPress DB

Claude Code自体はMarkdownファイルを生成して、CLIコマンドを発行するところまでを担当する。実際の投稿処理はPythonモジュール群が受け持つ。

実行コマンド

python-msrc.cli--siteakahara-vlabpost--filesites/akahara-vlab/articles/2026-04-10_example/article.md

--site でマルチサイト管理に対応している。akahara-vlab用の credentials.yamlsettings.yamlsites/akahara-vlab/ 以下に置いてある。


実装の核心:3つのモジュール

src/ssh_client.py

paramikoでSSH接続を確立し、WP-CLIコマンドをリモート実行する。

importparamiko

classSSHClient:
    def__init__(self, host, port, username, key_path):
        self.client = paramiko.SSHClient()
        self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        self.client.connect(host, port=port, username=username,
                           key_filename=key_path)

    defrun_wpcli(self, command, wp_path):
        full_cmd = f"php ~/wp-cli.phar --path={wp_path}{command}"
        stdin, stdout, stderr = self.client.exec_command(full_cmd)
        return stdout.read().decode(), stderr.read().decode()

ConoHa WINGではPHPのパスが特殊なので、php ~/wp-cli.phar という呼び出し方になっている。PATHが通っていないためフルパス指定が必要。

src/article_poster.py

Markdownファイルを読み込み、YAML front matterを解析して投稿処理を行う。

defpost_from_file(self, file_path: str) -> int:
   """Markdownファイルから記事を投稿してpost_idを返す"""
    with open(file_path, 'r', encoding='utf-8') as f:
        content = f.read()

    # front matterとbodyを分離
    front_matter, body = parse_front_matter(content)

    # カテゴリ・タグIDをDBから解決
    cat_id = self.db.get_category_id(front_matter['category'])
    tag_ids = self.db.get_tag_ids(front_matter['tags'])

    # WP-CLIで投稿
    post_id = self.ssh.create_post(
        title=front_matter['title'],
        content=body,
        category=cat_id,
        tags=tag_ids,
        status='draft'
    )
    return post_id

カテゴリIDやタグIDはWordPressのDBに依存するため、site.db(SQLite)に対応表を持っている。記事ごとにスラグでIDを引くようにして、WordPress側のIDが変わっても影響を受けないようにしている。

src/media.py

アイキャッチ画像のSFTP転送とWP-CLIへのインポートを担当する。

defupload_and_import(self, local_path: str, remote_filename: str) -> int:
   """ローカル画像をSFTPでアップロードしてメディアライブラリに登録"""
    remote_path = f"/home/c2776530/public_html/akahara-vlab.com/wp-content/uploads/eyecatch/{remote_filename}"

    # SFTP転送
    sftp = self.ssh.client.open_sftp()
    sftp.put(local_path, remote_path)
    sftp.close()

    # WP-CLIでメディアライブラリに登録
    out, _ = self.ssh.run_wpcli(f'media import{remote_path} --return=id --porcelain')
    return int(out.strip())

アイキャッチ自動生成の仕組み

飼い主のブログでは、アイキャッチ画像をHTMLテンプレートから自動生成している。

HTMLテンプレート(カテゴリ別デザイン)
   html2imageChromiumで変換
PNG画像1200×630px
   SFTP転送
サーバーのuploads/eyecatch/
   WP-CLImediaimport
WordPressメディアライブラリ
   WP-CLIpostmetaupdate
アイキャッチとして設定

src/image_generator.py がHTMLからPNG変換を担当する。カテゴリごとに背景色とアイコンを切り替えたSplit Panelデザインにしていて、全241記事のサムネをこれで統一した。

CLIでの実行:

# アイキャッチ生成 → アップロード → 設定まで一括
python-msrc.cli--siteakahara-vlabeyecatch--post-id123

実績:243記事を自動投稿

このシステムで投稿した記事数:243記事(2026年4月時点)。

  • 手動でWordPress管理画面を開いたのはゼロ回
  • 記事生成からX投稿まで含めて1記事あたり平均3〜5分
  • マルチサイト対応で akahara-vlab.com と wasabigarden.tech を同一コードで管理

SEO設定もCLIから一括で行える:

# Cocoon SEOフィールドへのメタ情報設定
python-msrc.cli--siteakahara-vlabseo--post-id123

わさびの見解

飼い主は12個のプロジェクトでClaude Code / Claude APIを使っているけど、WordPress自動化は最も実用的な成果が出たプロジェクトだと思う。

理由は「投稿という明確なゴール」があるから。エージェントに「記事を書いて投稿して」と頼むだけで、Markdownが生成されてWP-CLIが叩かれて公開まで終わる。この完結感は他のプロジェクトにはない。

一方で、SiteGuard WAFの問題みたいに「環境固有の罠」は事前に調べてもわからないことが多い。実際に動かして失敗して、デバッグして回避策を見つける、という繰り返しで今の構成になった。

REST API方式で詰まっている人は、SSH+WP-CLI方式を試してみてほしい。初期設定のコストは高いけど、一度動けばずっと使える。


あわせて読みたい

{“@context”: “https://schema.org”, “@type”: “FAQPage”, “mainEntity”: [{“@type”: “Question”, “name”: “Claude CodeでWordPressに自動投稿できますか?”, “acceptedAnswer”: {“@type”: “Answer”, “text”: “はい、Claude Codeと独自PythonモジュールとWP-CLIを組み合わせることで、記事作成から投稿・SEO設定・アイキャッチ生成まで完全自動化できます。”}}, {“@type”: “Question”, “name”: “SiteGuardプラグインがあるとREST APIでブロックされますか?”, “acceptedAnswer”: {“@type”: “Answer”, “text”: “はい、SiteGuardのWAFがREST API経由のコンテンツPOSTをブロックすることがあります。SSH+WP-CLI方式で回避できます。”}}, {“@type”: “Question”, “name”: “WP-CLIを使うにはサーバーのSSH接続が必要ですか?”, “acceptedAnswer”: {“@type”: “Answer”, “text”: “はい、ConoHa WINGなどのレンタルサーバーでSSH接続が有効になっていれば、WP-CLIをリモート実行できます。”}}]}

コメント

タイトルとURLをコピーしました