Claude CodeとWP-CLIを組み合わせれば、WordPress記事の公開・SEOメタ・アイキャッチをコマンド1つで自動化できます。
- 要点1: SSH経由のWP-CLIで記事作成・カテゴリ設定・SEOメタ設定をすべて自動化できる
- 要点2: JSON-LDのscriptタグを含むHTMLはwpdb->updateで保存しないと除去される
- 要点3: カテゴリ設定はterm_idのハードコードを避け、スラッグで動的検索するのが安全
対象: Claude Codeを使った業務自動化に取り組んでいるDX推進担当者・Web担当者
今日やること: ~/.ssh/configにSSH接続先を設定し、WP-CLIの動作確認コマンドを実行する
この記事の目次
Claude CodeとWP-CLIを組み合わせることで、WordPressへの記事公開に関わる全操作をコマンドラインから自動化できます。
「記事を書いたあと、毎回管理画面でカテゴリを選んで、SEOメタを入力して、アイキャッチを設定して……」こうした定型的な作業に時間を取られているケースは少なくありません。
この記事では、あるメディアサイトで実際に構築したClaude Code×WP-CLI連携の自動化フローをもとに、記事公開の全ステップを解説します。遭遇したトラブルと解決策も含め、再現性の高い形でまとめました。
Claude Code × WP-CLIで実現できること
まず、何が自動化されるのかの全体像を確認しておきます。
記事公開ラインとして自動化できる5つの操作
| # | 操作 | 管理画面での作業 | 自動化後 |
|---|---|---|---|
| 1 | 記事の作成・公開 | エディターで入力・公開ボタンをクリック | wp post create コマンド1行 |
| 2 | カテゴリ設定 | プルダウンから選択 | wp post term set コマンド |
| 3 | SEOメタ設定 | SEOプラグインの入力欄に手入力 | wp post meta update コマンド |
| 4 | アイキャッチ画像設定 | 画像をアップロードして選択 | scp + wp media import コマンド |
| 5 | 構造化データ注入 | 手動でHTMLに追記 | inject_jsonld.pyで自動生成・注入 |
これらをClaude Codeのスキルとして定義しておくと、「このMarkdownファイルをWordPressに公開して」と指示するだけで一連の操作が完了します。
管理画面操作との比較
あるメディアサイトの運用チームでは、この自動化を導入する前後で以下の変化がありました。
| 指標 | 導入前 | 導入後 |
|---|---|---|
| 記事1本の公開作業時間 | 約30〜45分 | 約5分(確認含む) |
| SEOメタの設定漏れ | 月に数件発生 | ゼロ(必ず自動設定) |
| カテゴリ設定ミス | 月に1〜2件 | ゼロ(スラッグで動的設定) |
| アイキャッチ未設定 | 月に2〜3件 | ゼロ(ファイル存在を自動検知) |
特に効果が大きかったのは「設定漏れがなくなった」点です。人が手作業で行う場合は確認コストもかかりますが、自動化によってチェックリスト不要で正確な公開が可能になりました。
前提条件と環境セットアップ
必要な前提条件
この自動化フローを実行するために、以下が必要です。
- WordPressがインストールされたサーバーへのSSHアクセス
- サーバー上にWP-CLIがインストール済みであること
- Claude Codeがインストール済みであること(
npm install -g @anthropic-ai/claude-code) - Pythonスクリプト(md2html.py、inject_jsonld.py)の準備
WP-CLIがサーバーにない場合は、以下のコマンドでインストールできます。
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.pharchmod +x wp-cli.pharmv wp-cli.phar ~/wp-cli.phar
SSH設定ファイルの書き方
~/.ssh/config に接続先の設定を記述しておくと、コマンドが簡潔になります。
Host conoha HostName xxx.xxx.xxx.xxx User username IdentityFile ~/.ssh/id_rsa
この設定があると、ssh conoha だけで接続でき、Claude Codeスキル内のコマンドも短く書けます。
WP-CLIの動作確認
SSH接続後、以下のコマンドでWP-CLIが正常に動作しているかを確認します。
ssh conoha 'php ~/wp-cli.phar --path=$HOME/public_html/example.com cli info'
WP-CLIのバージョン情報が出力されれば、準備完了です。なお、サーバー環境によってはphpコマンドのパスが異なる場合があります。which php でパスを確認してください。
ポイントWP-CLIの実行には
--pathオプションでWordPressのルートディレクトリを指定する必要があります。パスが間違っていると「WordPress could not be found」エラーが出ます。
STEP 1 — 記事本文のMarkdown → HTML変換
frontmatterの書き方と必要なフィールド
記事はMarkdown形式で管理します。先頭にfrontmatterを記述し、メタ情報をまとめておきます。
---title: 記事タイトルdescription: メタディスクリプション(120文字以内)category: カテゴリ名target_kw: ターゲットキーワードslug: パーマリンク用スラッグ(英語)---
このfrontmatterをWP-CLIのコマンド内で参照することで、設定値をすべてMarkdownファイルから取得できます。設定値の散在を防ぎ、管理が一元化されます。
md2html.pyでHTML変換+付加価値を自動注入する
PythonスクリプトでMarkdownをHTMLに変換する際、以下の処理も同時に行います。
- AIOサマリーボックスの変換: Markdownのblockquote形式で書いたサマリーを、スタイル付きのdiv要素に変換
- テーブルCSSの注入: WordPressデフォルトではテーブルの罫線が出ないため、インラインスタイルを自動挿入
- 目次(TOC)の自動生成: h2見出しからアンカー付きの目次を生成し、記事冒頭に挿入
python3 ~/.claude/skills/shared-scripts/wp-publish/md2html.py \ "/path/to/記事.md" "/tmp/article.html" \ --config ~/.claude/skills/shared-scripts/wp-publish/site-configs/nexa.json
変換したHTMLはサーバーにscpで転送し、次のSTEPで投稿内容として使用します。
STEP 2 — WP-CLIで記事を作成・公開する
wp post createで空記事を作成しIDを取得する
まず空の投稿を作成し、投稿IDを取得します。--porcelain オプションを指定すると、IDのみが返ってきます。
POST_ID=$(ssh conoha "php ~/wp-cli.phar --path=\$HOME/public_html/example.com \ post create \ --post_title='記事タイトル' \ --post_name='記事スラッグ' \ --post_status=publish \ --porcelain")echo "投稿ID: $POST_ID"
JSON-LDのscriptタグはwpdb->updateで保存する
ここで重要なトラブルシューティングを共有します。
wp post create --post_content='<HTML全文>' でそのままHTMLを渡すと、JSON-LDの<script>タグが自動的に除去されるという問題があります。これはWordPressのコンテンツサニタイズ処理によるものです。
この問題を回避するには、HTMLファイルをサーバーに転送した上で、wpdb->update() を使ってデータベースを直接更新します。
# HTMLをサーバーに転送scp /tmp/article.html conoha:~/tmp/# wpdb->updateで安全にHTMLを保存ssh conoha "php ~/wp-cli.phar --path=\$HOME/public_html/example.com \ eval '\$html = file_get_contents(\$_SERVER[\"HOME\"] . \"/tmp/article.html\"); \ global \$wpdb; \ \$wpdb->update(\$wpdb->posts, array(\"post_content\" => \$html), array(\"ID\" => $POST_ID));'"
この方法であれば、構造化データ(JSON-LD)のscriptタグを含むHTMLも正確に保存できます。
ポイント構造化データはGoogleのAI Overview(AIO)対策として重要です。Article、FAQPage、SpeakableSpecificationなどのスキーマを注入しておくことで、検索結果での引用率向上が期待できます。
STEP 3 — カテゴリ・タグの動的設定
term_idをハードコードしてはいけない理由
カテゴリの設定でよく見かける間違いが、term_idを直接数値でハードコードすることです。
# NG: term_idを直接指定するのは危険ssh conoha "wp post term set $POST_ID category 5"
この方法は「ID=5のカテゴリ」として設定されますが、「Claude Code」カテゴリのterm_idが本当に5であることは環境によって異なります。
あるメディアサイトで実際に発生したトラブルとして、term_idの固定値指定を使った結果、「2」「14」「5」といった数値そのものがカテゴリ名として登録されてしまい、記事が誤ったカテゴリに分類されるという問題が起きました。修正のために15本以上の記事のカテゴリを一括で直すことになりました。
Claude Codeの導入や活用方法について、個別にご相談いただけます。「どの機能から使えばいいか」「自社業務への適用方法を知りたい」といった段階から対応しています。
スラッグで動的にカテゴリを設定するコマンド
安全な方法は、カテゴリ名でterm検索し、見つからなければ新規作成するパターンです。
WP="php ~/wp-cli.phar --path=\$HOME/public_html/example.com"# カテゴリ名でterm_idを動的取得TERM_ID=$(ssh conoha "$WP term list category --name='Claude Code' --field=term_id" 2>/dev/null)# 見つからなければ新規作成if [ -z "$TERM_ID" ]; then TERM_ID=$(ssh conoha "$WP term create category 'Claude Code' --slug='claude-code' --porcelain")fi# 投稿にカテゴリを設定(--by=slugオプションも有効)ssh conoha "$WP post term set $POST_ID category $TERM_ID"
この方法であれば、カテゴリが存在する環境でも存在しない環境でも同じスクリプトが動作します。
STEP 4 — SEOメタ情報の設定
SEOプラグインのメタ情報は、wp post meta update コマンドで設定できます。SEO SIMPLE PACKの場合、以下のメタキーを使用します。
WP="php ~/wp-cli.phar --path=\$HOME/public_html/example.com"# SEOタイトルssh conoha "$WP post meta update $POST_ID _ssp_meta_title '記事タイトル|サイト名'"# メタディスクリプションssh conoha "$WP post meta update $POST_ID _ssp_meta_description 'メタディスクリプション(120文字以内)'"
SEO SIMPLE PACK以外のプラグインでは、以下のメタキーが一般的です。
| プラグイン | SEOタイトル | メタディスクリプション |
|---|---|---|
| SEO SIMPLE PACK | _ssp_meta_title |
_ssp_meta_description |
| Yoast SEO | _yoast_wpseo_title |
_yoast_wpseo_metadesc |
| All in One SEO Pack | _aioseop_title |
_aioseop_description |
| Rank Math | rank_math_title |
rank_math_description |
設定後は wp post meta get $POST_ID _ssp_meta_title で確認できます。
STEP 5 — アイキャッチ画像のアップロードと設定
media importコマンドとporcelainオプション
アイキャッチ画像は、ローカルからscpで転送後、wp media import でメディアライブラリに追加します。
# 画像をサーバーに転送scp "/path/to/thumbnail.png" conoha:~/tmp/nexa-thumb-article.png# メディアライブラリにインポートし、Attachment IDを取得ATTACHMENT_ID=$(ssh conoha "php ~/wp-cli.phar --path=\$HOME/public_html/example.com \ media import ~/tmp/nexa-thumb-article.png \ --title='記事タイトル アイキャッチ' \ --alt='ターゲットKWのイメージ画像' \ --porcelain")# アイキャッチ画像として設定ssh conoha "php ~/wp-cli.phar --path=\$HOME/public_html/example.com \ post meta update $POST_ID _thumbnail_id $ATTACHMENT_ID"# 一時ファイルを削除ssh conoha "rm ~/tmp/nexa-thumb-article.png"
--porcelain オプションはID(数値)だけを返すので、変数への代入が簡単になります。
画像ファイルの有無を自動判定する
Claude Codeのスキルとして自動化する場合は、thumbnail.pngが存在するかどうかを判定し、存在する場合のみアップロードする処理を入れると安全です。
THUMBNAIL="/path/to/thumbnail.png"if [ -f "$THUMBNAIL" ]; then # アップロード処理を実行 echo "アイキャッチ画像をアップロードします"else echo "thumbnail.pngが存在しません。アイキャッチはスキップします"fi
自動化フロー全体をスキルとして組み込む方法
スキルとして定義するメリット
Claude Codeでは、繰り返し実行するフローを「スキル」(SKILL.md)として定義できます。スキルとして定義しておくと、以下のメリットがあります。
- 再現性の向上: コマンドの順序や引数が固定されるため、実行ミスが減る
- チーム展開: スキルファイルを共有するだけで、他のメンバーも同じ自動化フローを使える
- エラー対応の標準化: エラーが発生した場合の対処手順もスキルに含めておける
SKILL.mdには、このSTEP 1〜STEP 5の手順と、frontmatterから値を取得する方法を記述しておきます。
cronジョブとの組み合わせ
スキルとして定義したフローをcronジョブに組み込むことで、「毎日決まった時間に未公開の記事を自動公開する」という運用も実現できます。
あるメディアサイトでは、以下のようなスケジュールで記事を自動公開しています。
- 平日 10:00: 前日までに準備完了した記事を1本自動公開
- 平日 13:00: キーワードリストから次の記事のリサーチ〜執筆を自動開始
- 平日 22:00: 当日公開した記事のインデックス申請を自動実行
このフローにより、週5本のペースでの記事公開を、担当者の直接操作なしで継続できています。
よくある質問
Q. wp post createで–post_contentに直接HTMLを渡せないの?
短いHTMLであれば渡せます。ただし、JSON-LDのような<script>タグを含む場合は、WordPressのサニタイズ処理によってタグが除去されます。構造化データを正確に保存するには、HTMLファイルをサーバーに転送して wpdb->update() で保存する方法を使ってください。
Q. カテゴリが「2」「14」という名前になってしまう問題の原因は?
wp post term set コマンドに第3引数としてterm_id(数値)を渡した場合、そのtermが存在しないとその数値がカテゴリ名として新規作成されることがあります。安全な方法は、--name オプションでカテゴリ名を指定し、term_idを動的に取得する方法です。
Q. JSON-LDのscriptタグがWP-CLIで除去されてしまうのはなぜ?
wp post create や wp post update --post_content でHTMLを直接渡す場合、WordPressのKSESフィルター(kses_remove_filters)が<script>タグを削除します。wpdb->update() を使う方法ではこのフィルターを経由しないため、scriptタグが保持されます。
Q. SSH接続先でWP-CLIが見つからないというエラーが出る場合は?
which wp または which wp-cli でパスを確認してください。php ~/wp-cli.phar のように直接パスを指定する方法が最も確実です。サーバーによってはphpのバイナリパスが /usr/local/bin/php など異なる場合があるため、which php で確認してから使用してください。
Q. SEO SIMPLE PACK以外のSEOプラグインにも同じ方法が使える?
はい。メタキーの名前が異なりますが、wp post meta update コマンドで設定できる点は同じです。Yoast SEO、All in One SEO Pack、Rank Mathいずれも対応しています。各プラグインのメタキー名はSTEP 4の表を参照してください。
まとめ
Claude Code × WP-CLIを組み合わせた記事公開自動化のポイントをまとめます。
- STEP 1: md2html.pyでMarkdownをHTMLに変換。テーブルCSS・TOC・AIOサマリーボックスを自動注入
- STEP 2: wp post createで投稿IDを取得後、wpdb->updateでJSON-LDを含むHTMLを安全に保存
- STEP 3: カテゴリ設定はterm_idのハードコードを避け、カテゴリ名で動的検索する
- STEP 4: SEO SIMPLE PACKのメタキーを使い、SEOタイトル・ディスクリプションを自動設定
- STEP 5: scp+media importでアイキャッチ画像をアップロード・設定
この自動化フローをClaude Codeのスキルとして定義しておくことで、記事1本の公開作業を「指示1つ」で完結できるようになります。さらにcronジョブと組み合わせることで、定期自動公開のラインとして稼働させることも可能です。
管理画面での手作業に時間を取られているチームほど、導入効果を感じやすいでしょう。まずは小規模なテスト環境で一連のSTEPを試してみることをおすすめします。
Claude Codeの導入・活用をサポートします
株式会社Nexaでは、Claude Codeを活用した業務自動化の個別指導・企業研修を提供しています。非エンジニアの方でも3ヶ月で業務自動化を実現できるプログラムです。「何から始めればいいかわからない」という段階からご支援いたします。




