さて、今回は「WordPress REST API + Google Apps Script (GAS) + Gemini API 」によるAIを利用した記事自動生成(完全無料 / プラグインなし)の方法を備忘録として残しておきます。
この方法は以下のメリットがあります。
- AIによる記事自動生成
- プラグイン不要
- 完全無料(有料外部サービス不要)
!! 注意事項 !!
AIを導入する際の鍵は、「AIに100%まかせないこと」です。2026年の検索エンジンは、AIが書いた「それっぽい文章」を見抜くアルゴリズムを強化しています。AIに骨組みを作らせ、人間が独自の体験談や一次情報を肉付けする「AI7:人間3」の比率が、最も高いパフォーマンスを発揮します。
1. なぜこの方法が「お金をかけない自動化」に最適なのか?
Gemini API (Google)
2026年現在も、開発者向けの「Free Tier(無料枠)」が非常に強力です。一定の回数制限内であれば、3 Flashなどの高性能モデルが無料で使えます。
Google Apps Script (GAS)
Googleドキュメントやスプレッドシート上で動くプログラムです。サーバー代はGoogle持ちで、完全無料です。
WordPress REST API
WordPressに標準搭載されている機能です。プラグインなしで外部から記事を投稿できます。

2. 構築の全体像(3ステップ)
【STEP1】WordPress側の準備(パスワード発行)
プラグインを使わずに外部からアクセスするために、専用のパスワードを作ります。
-
WordPress管理画面の「ユーザー」→「プロフィール」へ。
-
一番下の「アプリケーションパスワード」で、新しい名前(例: AI_Post)を入力して追加。
-
表示された24文字のパスワードをメモします。
【STEP2】Gemini APIキーの取得
Google AI Studioから、APIキー(無料枠)を取得します。
【STEP3】Google Apps Script (GAS) の設定
■ 1. スプレッドシートの準備
-
を新しく開きます。Googleスプレッドシート -
1行目のA列に「キーワード」、B列に「ステータス」と入力しておきます。
-
A2セルに、テストとして何か書きたい記事のキーワード(例:WordPress A 活用法)を入力してください。
■ 2. スクリプトエディタを開く
-
上部メニューの「拡張機能」→「Apps Script」をクリックします。
-
開いた画面に最初からある function myFunction() {…} をすべて消去し、下記のコードを丸ごと貼り付けてください。
// ==========================================
// 設定エリア(ここを書き換えてください)
// ==========================================
const GEMINI_API_KEY = 'あなたのGEMINI_API_キー';
const WP_SITE_URL = 'https://あなたのドメイン.com'; // 末尾に / は入れない
const WP_USERNAME = 'あなたのWordPressのログインユーザー名';
const WP_APP_PASS = 'ステップ1で取得した24文字のパスワード';
// ==========================================
// 実行関数
// ==========================================
function generateAndPostToWordPress() {
const sheet = SpreadsheetApp.getActiveSheet();
const keyword = sheet.getRange("A2").getValue(); // A2セルのキーワードを取得
if (!keyword) {
Browser.msgBox("A2セルにキーワードを入力してください。");
return;
}
// 1. Geminiで記事生成)
const prompt = `あなたはWordPress専門家です。キーワード「${keyword}」でSEO記事を書いて。
構成:H2, H3見出し。
内容:客観的事実中心。体験談を入れる場所に【体験談を追記】と記載。
形式:HTML形式(p,h2,h3,ulのみ)。
出力:記事タイトル、本文の順。`;
const aiContent = callGemini(prompt);
const title = keyword + "についての完全ガイド"; // 簡易的なタイトル設定
// 2. WordPressに下書き投稿
const response = postToWordPress(title, aiContent);
if (response.id) {
sheet.getRange("B2").setValue("成功:下書き保存完了 (ID: " + response.id + ")");
Browser.msgBox("WordPressに下書きを送信しました!管理画面を確認してください。");
} else {
sheet.getRange("B2").setValue("エラー:" + JSON.stringify(response));
}
}
// Gemini
function callGemini(prompt) {
// 2026年3月現在の最新モデル:gemini-3.1-flash-lite-preview または gemini-3-flash
// 無料枠で安定して動く最新のプレビュー版を指定
const modelName = "gemini-3.1-flash-lite-preview";
const url = `https://generativelanguage.googleapis.com/v1beta/models/${modelName}:generateContent?key=${GEMINI_API_KEY}`;
const payload = {
"contents": [{
"parts": [{
"text": prompt
}]
}]
};
const options = {
"method": "post",
"contentType": "application/json",
"payload": JSON.stringify(payload),
"muteHttpExceptions": true
};
const res = UrlFetchApp.fetch(url, options);
const responseText = res.getContentText();
const json = JSON.parse(responseText);
// エラー詳細のチェック
if (json.error) {
// もしモデルが見つからない場合は別の候補を試すようログを出す
console.error("Error Details:", responseText);
throw new Error(`Gemini API Error: ${json.error.message} (モデル名 ${modelName} が正しいか確認してください)`);
}
if (!json.candidates || json.candidates.length === 0) {
throw new Error("APIからの応答が空です。");
}
return json.candidates[0].content.parts[0].text;
}
// WordPress REST APIを呼び出す関数(修正版)
function postToWordPress(title, content) {
// 末尾の / を念のため除去し、正しいエンドポイントへ
const cleanUrl = WP_SITE_URL.replace(/\/$/, "");
const url = `${cleanUrl}/wp-json/wp/v2/posts`;
// 認証情報の作成(ユーザー名とパスワードを確実に結合)
const authString = WP_USERNAME.trim() + ":" + WP_APP_PASS.trim();
const headers = {
"Authorization": "Basic " + Utilities.base64Encode(authString)
};
const payload = {
"title": title,
"content": content,
"status": "draft"
};
const options = {
"method": "post",
"contentType": "application/json",
"headers": headers,
"payload": JSON.stringify(payload),
"muteHttpExceptions": true
};
const res = UrlFetchApp.fetch(url, options);
const code = res.getResponseCode();
const resText = res.getContentText();
// 404や403が出た場合にエラーを特定する
if (code !== 201) {
if (resText.includes("
■ 3. 設定の書き換え
コード内の上部にある4つの項目を、ご自身の環境に合わせて書き換えてください。
-
GEMINI_API_KEY:ステップ2で取得したキー
-
WP_SITE_URL:あなたのブログのURL(例: https://example.com)
-
WP_USERNAME:WordPressのログインID
-
WP_APP_PASS:ステップ1で取得した24文字(スペース含む)のパスワード
■ 4. 保存と実行
-
エディタ上の「フロッピーディスク型のアイコン(保存)」をクリックし、プロジェクト名を「WP自動投稿」などにして保存します。
-
上部の実行ボタンの横が generateAndPostToWordPress になっていることを確認し、**「実行」**をクリックします。
-
初回実行時のみ、**「承認が必要」**というポップアップが出ます。
-
「権限を確認」→「自分のGoogleアカウントを選択」→「詳細」→「WP自動投稿(安全ではないページ)に移動」→「許可」の順にクリックしてください。
-
■ 5. 確認
Googleスプレッドシートの「B2」を確認してみてください。「成功:下書き保存完了 (ID: xxxxxx)」の表示が書き込まれているのであれば、記事が下書きで投稿されているハズです。
※Google Apps Scriptで実行後、画面をそのままにするとローディングアイコン後に「Exceeded maximum execution time」が表示されますが、そのままスプレッドシートに切り替えてください。
あとはWordPressにログインし、実際に投稿記事一覧から確認しみてください。
!! エラーが出る場合 !!
エックスサーバー・さくらインターネット・ロリポップなどを使用している場合、サーバー側でREST API アクセス制限が設定されている場合があります。サーバー側で設定を解除しないと、「Unexpected token ‘<‘」や「サーバーがHTMLを返しました。エックスサーバーのWAF設定か、REST API制限を確認してください。」のエラーが実行ログに発生する可能性があります。
その場合、お使いの公式レンタルサーバーを確認してみてください。
※設定項目が見当たらない場合は、他の原因が考えられます。
【要確認の項目】
正しく設定されていますか?以下の項目を見直してください。
- GEMINI_API_KEY(GEMINI_API_キー)
- WP_SITE_URL(WPサイトのドメイン)※末尾に / は入れない
- WP_USERNAME(WPのログインユーザー名)
- WP_APP_PASS(ステップ1で取得した24文字のパスワード)
サーバーの「REST API制限」を確認
エックスサーバーには標準で「WordPress REST API アクセス制限」という機能があります。
※別サーバーをお使いの場合はそれぞれの公式サイトをご確認ください。
-
エックスサーバーのサーバーパネルにログイン。
-
「WordPress」カテゴリの中にある「WordPressセキュリティ設定」をクリック。
-
対象ドメインを選択し、「REST API アクセス制限」タブをクリック。
-
設定が「ON」になっている場合は 「OFF」 に変更して保存してください。
今後の展望とあとがき
さて、上手く出来たでしょうか?
今回はGoogle スプレッドシートを利用した方法でしたが、もちろん、WordPressの各種AIプラグイン「Jetpack AI Assistant(執筆・翻訳)」「AI Engine(カスタマイズ・自動化)」「Rank Math AI(SEO最適化)」などを利用してもいいと思います。
しかし、プラグインは便利な反面、常にトラブルと隣り合わせの関係にあるため、運用には注意が必要です。
※場合によっては有料プランになる可能性もあります。
その点、今回の方法は無償かつプラグイン不要なので、(やや手順は難しいですが)設定さえ出来てしまえば後は簡単な操作で記事を生成できるため、格段に作業効率がアップします。
最終的には全ての作業を自動化して、1日に2記事ぐらいをこちらが指定したテーマに沿って自動生成できるような仕組みを考えていきたいと思います。
それではまた。