こんにちは、さとさんです。
最近、ブログ記事を書くときに、ChatGPTに構成案や本文のたたき台を作ってもらうことが増えてきました。
ブログを書く方はご存じだと思いますが、投稿を公開するまでの作業はざっくりこんな感じです。
- 記事メモを整理する
- タイトルを考える
- 本文を書く
- メタディスクリプションを考える
- WordPressに貼り付ける
- スラッグを設定する
- カテゴリーやタグを考える
自分としては記事を書いて公開だけしたいのですが、それ以外にもやることがとっても多いです。
そこで今回は、n8n という自動化ツールを使って、ブログ執筆の一部を自動化してみました。
この記事の手順を最後まで進めると、n8n上で記事メモを入力するだけで、OpenAIが本文を生成し、WordPressに下書き投稿を作成できるようになります。
なお、この記事の段階では、カテゴリー、タグ、Cocoonのメタディスクリプション、アイキャッチ画像の自動設定までは行っていません。
まずは本文を下書き投稿するところまでをゴールにしています。
- n8nとは
- 今回作るもの
- 今回の前提
- 手順1:n8n用のフォルダを作る
- 手順2:n8nのデータ保存用フォルダを作る
- 手順3:docker-compose.ymlを作る
- 手順4:n8nを起動する
- 手順5:n8nコンテナからWordPressに届くか確認する
- 手順6:WordPressのアプリケーションパスワードを作る
- 手順7:n8nにWordPress認証情報を登録する
- 手順8:n8nにOpenAI APIキーを登録する
- 手順9:最初のワークフローを作る
- 手順10:Manual Triggerを追加する
- 手順11:Edit Fieldsノードで記事メモを入力する
- 手順12:OpenAIノードで本文を生成する
- 手順13:CodeノードでOpenAIの出力を整形する
- 手順14:WordPressノードで下書き投稿する
- 手順15:ワークフローを実行する
- 今回できたこと
- 完全自動公開はしない
- 次にやりたいこと
- 個人的に一番よさそうな運用
- まとめ
- トラブルシュート
n8nとは
n8nは、いろいろなサービスをつないで作業を自動化できるツールです。
たとえば、
記事テーマを入力する
↓
OpenAIで本文を作る
↓
WordPressに下書き投稿する
↓
自分で確認して公開する
という流れを、画面上でポチポチして作れます。
私のようにWordPressを自分で運用している場合は、n8nを自宅サーバーで動かせるのが便利です。
ちなみに、この記事ではDockerを使って動かしています。
今回作るもの
今回作るのは、以下のような仕組みです。
n8nの手動実行
↓
記事テーマ・メモを入力
↓
OpenAIでブログ本文を生成
↓
CodeノードでOpenAIの出力を整形
↓
WordPressに下書き投稿
最終的には画像生成やアイキャッチ設定まで自動化したいですが、まずは本文投稿までを動かしてみます。
今回できたワークフローは、最終的にこのような形になりました。
When clicking ‘Execute workflow’
↓
Edit Fields
↓
Message a model
↓
Code in JavaScript
↓
Create a post

今回の前提
この記事では、以下の前提で進めます。
- WordPressはすでに運用中
- WordPressもn8nもDockerコンテナで動かす
- Docker Composeを使える
- OpenAI APIキーを用意できる
- WordPressの管理者権限がある
- 最初はローカルまたは家庭内LANでn8nを使う
n8nをインターネットに公開する場合は、HTTPS、認証、アクセス制限をきちんと考える必要があるので、個人利用であれば家庭内LANだけで試すのがおすすめです。
手順1:n8n用のフォルダを作る
まず、サーバー上でn8n用のフォルダを作ります。
私の場合は、Docker Composeで管理したいので、以下のようなディレクトリを作ります。
mkdir -p ~/docker/n8n
cd ~/docker/n8n
手順2:n8nのデータ保存用フォルダを作る
次に、n8nの設定やワークフローを保存するためのフォルダを作ります。
mkdir -p ./n8n_data
ここで、フォルダの所有者をn8nコンテナが書き込めるように変更しておきます。
sudo chown -R 1000:1000 ./n8n_data
sudo chmod -R u+rwX ./n8n_data
手順3:docker-compose.ymlを作る
次に、docker-compose.yml を作成します。
まずはシンプルにSQLite構成で始めます。個人利用で、ブログ下書き作成程度ならこれで十分だと思います。
今回は、WordPressも同じサーバー上のDockerコンテナで動かしているため、n8nコンテナ内から wordpressのアドレス にアクセスしたときに、wordpressのコンテナの内部IPへ向くように extra_hosts も設定しておきます。
services:
n8n:
image: n8nio/n8n:latest
container_name: n8n
restart: unless-stopped
ports:
- "5678:5678"
environment:
- TZ=Asia/Tokyo
- GENERIC_TIMEZONE=Asia/Tokyo
- N8N_HOST=192.168.10.100
- N8N_PORT=5678
- N8N_PROTOCOL=http
- N8N_SECURE_COOKIE=false
volumes:
- ./n8n_data:/home/node/.n8n
extra_hosts:
- "wordpressのドメイン名:192.168.10.100"
wordpressのドメイン名や192.168.10.100 の部分は、自分のドメイン名やサーバーのIPアドレスに置き換えます。
extra_hostsについて
今回の環境では、WordPressもn8nも同じサーバー上のDockerコンテナで動いています。
この状態でn8nからWordPressに接続する場合、PCのブラウザから https://wordpressのドメイン名 にアクセスできていても、n8nコンテナの中から同じようにアクセスできるとは限りません。
そこで、n8nコンテナ内では、
wordpressのドメイン名 → 192.168.10.100
として扱うように、extra_hosts を追加しています。
extra_hosts:
- "wordpressのドメイン名:192.168.10.100"
これにより、n8nは、外部公開時と同じく、
https://wordpressのドメイン名
で接続できるようになります。
N8N_SECURE_COOKIE=falseについて
N8N_SECURE_COOKIE=false は、HTTPでローカル運用するための設定です。
今回は家庭内LANで使用する前提なのでfalseとしています。
もし、将来的にHTTPSで公開する場合は、この設定を見直すことを忘れないようにしましょう。
手順4:n8nを起動する
以下のコマンドでn8nを起動します。
docker compose up -d
起動確認します。
docker compose ps
ログも確認しておきます。
docker compose logs -f
問題なければ、ブラウザで以下にアクセスします。
http://サーバーのIPアドレス:5678
サーバーのIPアドレス の部分は、自分のサーバーのIPアドレスに置き換えてください。
初回アクセス時に、n8nの管理者アカウントを作成します。

手順5:n8nコンテナからWordPressに届くか確認する
n8nを起動したら、WordPressの設定に進む前に、n8nコンテナ内からWordPressに届くか確認しておきます。
docker compose exec n8n sh
n8nコンテナの中に入ったら、以下を実行します。
wget -S -O - https://wordpressのドメイン名/wp-json/ 2>&1 | head -50
こんな感じで200応答のWordPressのREST APIらしきJSONが返ってくればOKです。
Connecting to [wordpressのドメイン名] (wordpressの内部のIP:443)
HTTP/1.1 200 OK
Server: xxxxx
Date: Mon, 27 Apr 2026 14:54:20 GMT
Content-Type: application/json; charset=UTF-8
Transfer-Encoding: chunked
Connection: close
...略
ここでタイムアウトする場合は、n8nの認証情報ではなく、ネットワークや名前解決の問題です。
確認できたら、コンテナから抜けます。
exit
手順6:WordPressのアプリケーションパスワードを作る
n8nからWordPressに投稿するには、WordPress側でAPI用のパスワードを作る必要があります。
WordPressには アプリケーションパスワード という仕組みがあります。
これは、通常のログインパスワードとは別に、外部ツールやスクリプトがREST APIを使うための専用パスワードです。
WordPress管理画面で、以下の順に進みます。
ユーザー
↓
プロフィール
↓
アプリケーションパスワード
新しいアプリケーションパスワード名には、わかりやすく、
n8n-blog-draft
などを入れます。

生成されたパスワードは一度しか表示されないので、必ずコピーして保存します。
なお、アプリケーションパスワードは秘密情報です。スクリーンショットをブログに載せる場合は、パスワード部分が表示されないように注意します。
ここで必要な情報
n8nに登録するために、以下を控えておきます。
WordPress URL:
WordPressサイトのURL
ユーザー名:
WordPressにログインする際のユーザー名
アプリケーションパスワード:
手順6で生成したもの
手順7:n8nにWordPress認証情報を登録する
n8nの画面で、左側のメニューから認証情報を追加します。
Credentials
↓
Add credential
↓
WordPress API
入力する内容は以下です。
Username:
WordPressのログインユーザー名
Password:
アプリケーションパスワード
WordPress URL:
WordPressのURL

保存して、接続テストが通ればOKです。
補足になりますが、今回のDocker環境では、extra_hosts を入れる前はWordPressへの接続テストでタイムアウトしましたが、extra_hosts を入れたあとに接続できるようになりました。
手順8:n8nにOpenAI APIキーを登録する
次に、OpenAIの認証情報を登録します。
OpenAI APIキーは、OpenAIのDeveloper Platformで作成します。
APIキーの作成方法、料金上限、セキュリティ設定については別記事で詳しくまとめる予定です。
ここでは、すでにOpenAI APIキーを取得済みという前提で進めます。
n8nでは以下のように進みます。
Credentials
↓
Add credential
↓
OpenAI
OpenAI APIキーを入力して保存します。

注意点として、ChatGPT Plusに加入していても、OpenAI APIの利用料金は別です。
n8nからOpenAIノードを使う場合は、OpenAI Platform側の課金設定や利用上限も確認しておきましょう。

補足として、本検証ではGPT-5.4-MINIを5回呼び出し、約2,000トークンを使用しました。Usage画面上では、この時点の費用は $0.00 と表示されていました。
ただし、OpenAI APIは原則として利用量に応じて料金が発生するため、実際に使う場合はUsageやLimitsを確認しながら進めるのが安心です。

手順9:最初のワークフローを作る
ここから、実際にワークフローを作ります。
最終的には、次の流れにします。
Manual Trigger
↓
Edit Fields
↓
OpenAI
↓
Code
↓
WordPress
まずは新しいWorkflowを作成します。

手順10:Manual Triggerを追加する
最初に Manual Trigger を置きます。
これは、手動で実行するための開始ボタンです。
最初から自動実行にすると事故が怖いので、まずは手動実行にします。
手順11:Edit Fieldsノードで記事メモを入力する
次に、Edit Fields ノードを追加します。
ここで、記事の材料になる情報を入れます。
今回の例では、以下のフィールドを作りました。
title_seed
memo
target_reader
tone

入力例は以下です。
title_seed:
n8nでAIブログ下書きを自動作成してみた
memo:
WordPressでブログを書いている。毎回、記事構成、本文、SEO情報、入稿作業が面倒なので、n8nを使って下書き作成を自動化したい。完全自動公開ではなく、まずは下書きまでにする。
target_reader:
WordPressブログ初心者。AIや自動化に興味はあるが、n8nは初めて。
tone:
[WordPressのURL]らしく、実体験ベースで、やさしく、少し本音も入れる。
ここを変えれば、別の記事テーマでも下書きを作れます。
手順12:OpenAIノードで本文を生成する
次に、OpenAIノードを追加します。
今回は、以下のような設定にしました。
Resource:
Text
Operation:
Message a Model
Model:
GPT-5.4-MINI

最初は GPT-5.4 を選んでエラーになりましたが、GPT-5.4-MINI に変更したら動きました。
テスト段階では、いきなり高性能なモデルを使わず、まずはMINIのように軽いモデルで試すのがよいと思います。
プロンプトには、Edit Fieldsで入力した値を差し込むようにします。
あなたは、[WordPressのURL]のブログ執筆アシスタントです。以下の情報をもとに、日本語のWordPressブログ記事をMarkdown形式で作成してください。
条件:
- こんにちは、さとさんです。から始める
- 実体験ベースの自然な文体にする
- 読者はWordPressブログ初心者
- 句読点は「、」「。」を使う
- 見出しはMarkdownの##、###を使う
- 最後にまとめを入れる
- 誇張しすぎない
- 完全自動公開はすすめず、下書きまでの自動化をすすめる
出力形式:
以下のJSONだけを返してください。説明文は不要です。
{
"post_title": "記事タイトル",
"post_slug": "英数字のスラッグ",
"meta_description": "120文字前後のメタディスクリプション",
"post_content": "Markdown形式の本文",
"tags": ["タグ1", "タグ2", "タグ3"],
"category_suggestion": "カテゴリー案"
}
記事タイトルの種:{{ $json.title_seed }}
記事メモ:
{{ $json.memo }}
想定読者:{{ $json.target_reader }}
文体:{{ $json.tone }}
OpenAIノードを実行すると、AIが記事本文やタイトル、スラッグなどをJSON形式で返してくれます。

手順13:CodeノードでOpenAIの出力を整形する
OpenAIノードの出力は、そのままWordPressノードに渡せる形ではありませんでした。
実際には、
$json.output[0].content[0].text
の中に、JSON文字列として入っていました。
そのため、OpenAIノードとWordPressノードの間に Codeノード を追加します。

Codeノードには、以下を入れました。
const text = $json.output[0].content[0].text;
// 念のため、前後の余計な空白を削る
const parsed = JSON.parse(text.trim());
return [
{
json: parsed
}
];
これで、Codeノードの出力として、
post_title
post_slug
meta_description
post_content
tags
category_suggestion
が並ぶようになります。
このCodeノードを挟まないと、WordPressノードで、
{{ $json.post_title }}
と書いても undefined になってしまいました。
手順14:WordPressノードで下書き投稿する
最後に、WordPressノードを追加します。
今回は以下のように設定しました。
Resource:
Post
Operation:
Create
Title:
{{ $json.post_title }}
Content:
{{ $json.post_content }}
Slug:
{{ $json.post_slug }}
Status:
Draft

ここで、StatusがDraftになっていることを確認しましょう。
テスト記事がいきなりPublishされないようにします。
最初は必ず下書きです。
手順15:ワークフローを実行する
ここまでできたら、ワークフロー全体を実行します。
Execute workflow
実行後、各ノードにチェックマークが付けば成功です。

WordPress管理画面を開きます。
投稿
↓
投稿一覧
↓
下書き
AIが作成したタイトルで、下書き記事が作成されていれば成功です。

実際に投稿を開くと、タイトル、本文、スラッグが入っていました。

これで、n8nでAIが作った記事をWordPressに下書き投稿するところまでできました。
今回できたこと
今回できるようになったのは、以下の流れです。
n8nを開く
↓
記事テーマやメモを入力する
↓
OpenAIが本文とSEO情報を作る
↓
Codeノードで出力を整形する
↓
WordPressに下書き投稿される
↓
自分で確認して公開する
これだけでも、ブログを書くときの負担はかなり軽くなります。
特に、毎回面倒な、
- 本文のたたき台作成
- 見出し作成
- メタディスクリプション作成
- WordPressへの貼り付け
あたりを自動化できるのは大きいです。
完全自動公開はしない
今回の仕組みは、あくまで 下書き作成まで にしています。
理由は、AIが作った文章は便利ですが、そのまま公開するのは、AI量産記事を生み出すだけなのでやめたほうがいいです。
たとえば、
- 事実関係が合っているか
- 自分の体験とズレていないか
- 表現が自分のブログらしいか
- 読者に誤解を与えないか
- SEOタイトルやメタディスクリプションが自然か
こういった部分は、まだ人間が確認した方がよいと思います。
特に私のブログでは、節約、投資、子育て、暮らしなど、実体験ベースの記事を書いています。
AIに全部任せるというより、面倒な下書きやもろもろの作業を手伝ってもらうくらいがちょうどよいと考えています。
次にやりたいこと
今回は、決まったプロンプトを使い、本文の下書き投稿まで実現できました。
今後は、以下を追加していきたいです。
カテゴリーとタグの自動設定
OpenAIの出力には、
tags
category_suggestion
も含めています。
今回はまだWordPress投稿には反映していませんが、次はタグやカテゴリーも自動で設定したいです。
メタディスクリプションの反映
OpenAIには meta_description も作らせています。
ただし、私が使っているWordPressのテーマ「Cocoon」のメタディスクリプション欄にどう反映するかは、もう少し調べる必要があります。
WordPressの標準投稿本文とは別のメタ情報になるので、ここは次の課題です。
アイキャッチ画像の自動生成
最終的には、記事内容に合わせたアイキャッチ画像も自動生成したいです。
ただし、画像はブログの印象にかなり影響します。
まずは画像を自動生成するところまでにして、最終的に使うかどうかは自分で確認する運用がよさそうです。
WordPressメディアライブラリへの画像アップロード
画像が生成できたら、WordPressのメディアライブラリにアップロードします。
さらに、アイキャッチ画像として設定できれば、かなり実用的になります。
個人的に一番よさそうな運用
実際に使うなら、完全自動公開ではなく、以下の形がよさそうです。
自分:
体験、写真、数字、最終判断を用意する
↓
n8n:
AIにコンテンツの下書きを書いてもらう
SEO情報を作る
WordPressに下書き投稿する
↓
自分:
内容を確認して公開する
ブログの強みは、やはり実体験です。
AIに全部任せると、どこかで見たような記事になってしまいます。
なので、AIとn8nには、記事を書く前後の面倒な作業を減らしてもらうくらいがちょうどいいと思います。
まとめ
今回は、n8nを使って、AIブログ執筆をWordPressの下書き投稿まで自動化してみました。
一言で言うと、記事メモを入れたら、WordPressに下書きができる、というものです。
このためにn8nで作ったフローは以下の通りです。
Manual Trigger
↓
Edit Fields
↓
OpenAI
↓
Code
↓
WordPress Draft
現時点では、手動実行であることや、固定のプロンプトしか使っていないことなど、まだ改善点はあります。今後カスタマイズして、実用性を高めていきたいです。
というわけで、今後は、プロンプトのインターフェース改善、カテゴリー、タグ、メタディスクリプション、アイキャッチ画像、撮影した画像のアップロードなど、少しずつ自動化していきます。
トラブルシュート
docker compose up -dでpermission deniedが出た
最初の起動時に、以下のエラーが出ました。
n8n | Error: EACCES: permission denied, open '/home/node/.n8n/config'
原因
原因は、Dockerでマウントしたホスト側の ./n8n_data フォルダに、n8nコンテナ内のユーザーが書き込めないことでした。
今回の docker-compose.yml では、以下のようにホスト側のフォルダをn8nの設定保存先にマウントしています。
volumes:
- ./n8n_data:/home/node/.n8n
しかし、この n8n_data フォルダの所有者や権限が合っていないと、n8nが設定ファイルを作れません。
対処方法
いったんn8nを停止します。
docker compose down
次に、ホスト側の n8n_data フォルダの所有者を変更します。
sudo chown -R 1000:1000 ./n8n_data
念のため、書き込み権限も整えます。
sudo chmod -R u+rwX ./n8n_data
その後、もう一度起動します。
docker compose up -d
今回は、この方法で無事にn8nが起動しました。
WordPress認証情報の接続テストでタイムアウトした
n8nでWordPressの認証情報を登録し、接続テストをしたところ、以下のエラーが出ました。
The connection timed out, consider setting the 'Retry on Fail' option in the node settings
原因
今回の環境では、WordPressもn8nも同じQNAP上のDockerコンテナで動いています。
この状態でn8nのWordPress URLに、
https://[WordPressのURL]
を指定すると、n8nコンテナ内からインターネットを経由して WordPressのURL へアクセスすることになります。
PCのブラウザからはDNSの設定等している場合、 https://[WordPressのURL] にアクセスできていても、n8nコンテナ内から同じように到達できるとは限りません。
対処方法
今回は、n8n側の docker-compose.yml に extra_hosts を追加して解消しました。
extra_hosts:
- "satolabo.net:192.168.10.100"
これにより、n8nコンテナ内では、
satolabo.net → 192.168.10.100
として扱われます。
設定を反映するために、n8nを再作成しました。
docker compose down
docker compose up -d
その後、再度WordPressの接続テストを行うと、正常に接続できました。
OpenAIノードで「You exceeded your current quota」が出た
n8nでOpenAIノードを実行したところ、以下のエラーが出ました。
The service is receiving too many requests from you
You exceeded your current quota, please check your plan and billing details.
原因
最初はOpenAIノードのモデルに GPT-5.4 を指定していました。
この状態で実行すると、OpenAI API側の利用枠や制限に引っかかっているようで、上記のエラーが出ました。
ChatGPT Plusに加入していても、OpenAI APIの利用料金や利用制限は別管理です。
対処方法
OpenAIノードのモデルを、テスト用に軽いモデルへ変更しました。
GPT-5.4
↓
GPT-5.4-MINI
変更後に再実行したところ、OpenAIノードが正常に動作しました。
ブログ記事の下書き生成を試す段階では、いきなり高性能なモデルを使わなくても、まずはmini系モデルで十分だと思います。
ただし、mini系モデルだから無料という意味ではありません。OpenAI APIは原則として利用量に応じて料金が発生します。実際に使う場合は、OpenAI PlatformのUsageやLimitsを確認しながら進めるのが安心です。
WordPressノードで「投稿を編集する権限がありません」と出た
n8nのWordPressノードで下書き投稿を作成しようとしたところ、以下のエラーが出ました。
Authorization failed - please check your credentials
このユーザーとして投稿を編集する権限がありません。
原因確認
最初はWordPressユーザーの権限を疑いました。
ただ、自分のWordPressアカウントは管理者です。
そこで、n8nコンテナ内からWordPress REST APIを直接叩いて確認しました。
AUTH=$(printf 'ユーザー名:アプリケーションパスワード' | base64)
wget -S -O - \
--header "Authorization: Basic $AUTH" \
https://[WordPressのURL]/wp-json/wp/v2/users/me 2>&1 | head -100
この方法でユーザー情報が返ってきたため、アプリケーションパスワード認証自体は通っていました。
次に、REST APIから直接テスト投稿を作成しました。
wget -S -O - \
--header "Authorization: Basic $AUTH" \
--header "Content-Type: application/json" \
--post-data '{"title":"APIテスト投稿","content":"これはREST APIから作成したテスト下書きです。","status":"draft"}' \
https://[WordPressのURL]/wp-json/wp/v2/posts 2>&1 | head -120
この方法では、WordPressに下書き投稿を作成できました。
つまり、WordPress側のREST API、ユーザー権限、アプリケーションパスワード自体は問題なさそうでした。
実際の原因
最終的には、WordPressノードに渡していた値が undefined になっていたことが原因でした。
最初はWordPressノードに、
{{ $json.post_title }}
{{ $json.post_content }}
{{ $json.post_slug }}
を設定していました。
しかし、OpenAIノードの出力はその形では入っていなかったため、WordPressノード側では undefined になっていました。
対処方法
まず、WordPressノードを固定値で試しました。
Title:
test
この状態では投稿が通りました。
次に、ContentやStatusを追加しても通りました。
これで、WordPress Credentialや投稿権限そのものは問題ないと確認できました。
そのうえで、OpenAIノードとWordPressノードの間にCodeノードを挟み、OpenAIの返答をJSONとしてパースするようにしました。
OpenAI出力をWordPressノードで指定するとundefinedになる
OpenAIノードの出力をWordPressノードに渡そうとして、
{{ $json.post_title }}
{{ $json.post_content }}
{{ $json.post_slug }}
を指定したところ、最初はWordPressノード側で undefined と表示されました。
原因
OpenAIノードの出力では、AIが返したJSONがそのまま直下に入っているわけではありませんでした。
実際には、以下のような構造でした。
$json.output[0].content[0].text
この text の中に、JSON文字列として、
{
"post_title": "...",
"post_slug": "...",
"post_content": "..."
}
が入っていました。
そのため、WordPressノードで直接、
{{ $json.post_title }}
としても値を取得できず、undefined になっていました。
対処方法
OpenAIノードとWordPressノードの間にCodeノードを追加し、OpenAIの返答をJSONとしてパースしました。
const text = $json.output[0].content[0].text;
// 念のため、前後の余計な空白を削る
const parsed = JSON.parse(text.trim());
return [
{
json: parsed
}
];
これで、Codeノードの出力として、
post_title
post_slug
post_content
meta_description
tags
category_suggestion
などが直下に並ぶようになりました。
その後、WordPressノードでは以下のように指定しました。
Title:
{{ $json.post_title }}
Content:
{{ $json.post_content }}
Slug:
{{ $json.post_slug }}
Status:
Draft
これで、OpenAIが生成した本文をWordPressの下書き投稿に渡せるようになりました。

コメント