はじめに
Claude Code・Gemini CLI などの AI CLI ツールには MCP(Model Context Protocol) という外部サービス連携の仕組みがあります。wordpress-mcp を使えば、AI CLI から直接 WordPress に記事を投稿できます。
ただし、デフォルトの wordpress-mcp が送れるデータは title と content だけ。実際の記事公開には カテゴリ・スラッグ・SEO メタデータ・SNS シェア設定も必要で、毎回手動設定が残ってしまいます。
この記事では以下をすべて自動化する方法を解説します:
- カテゴリ・スラッグの設定
- Yoast SEO のメタデータ(description・canonical)
- JIN テーマのハッシュタグ(Twitter シェアボタン連動)
完成後の構成
AI CLI(Claude Code など)
└── wordpress-mcp(カスタム版)
└── WordPress REST API
├── 記事投稿(title, content, categories, slug)
├── Yoast SEO meta(mu-plugins 経由)
│ ├── _yoast_wpseo_metadesc
│ └── _yoast_wpseo_canonical
└── JIN テーマ meta(mu-plugins 経由)
├── jin_hashtag ← Twitter シェアに反映
└── post_keyword
Step 1: mu-plugins で REST API からメタフィールドを書き込み可能にする
WordPress はデフォルトでカスタムフィールドを REST API から書けません。register_post_meta() に show_in_rest: true を指定することで解除できます。
mu-plugins を使う理由
/wp-content/mu-plugins/ に置いたファイルは WordPress が自動で読み込む(プラグイン有効化不要)。ただし <?php タグが必須です。ここを忘れると PHP が実行されず、REST API レスポンスの先頭にソースコードが文字列として出力される地獄を見ます(実話)。
register-yoast-rest.php
/wp-content/mu-plugins/register-yoast-rest.php を作成:
<?php
// MCP自動投稿用: Yoast SEO + JINテーマ + 汎用メタフィールドをREST APIから書き込み可能にする
add_action('rest_api_init', function() {
$keys = [
// Yoast SEO
'_yoast_wpseo_title',
'_yoast_wpseo_metadesc',
'_yoast_wpseo_canonical',
'_yoast_wpseo_meta-robots-noindex',
// 汎用(Yoastなし環境向けフォールバック)
'_meta_title',
'_meta_description',
'_meta_canonical',
'_meta_noindex',
// JINテーマ SEO設定
'post_desc',
'post_keyword',
'jin_hashtag',
'post_canonical',
'noindex',
];
foreach ($keys as $key) {
register_post_meta('post', $key, [
'show_in_rest' => true,
'single' => true,
'type' => 'string',
'auth_callback' => function() {
return current_user_can('edit_posts');
},
]);
}
});
動作確認
curl -s "https://your-site.com/wp-json/wp/v2/posts/YOUR_ID?context=edit" \
-u "username:app_password" | jq '.meta | keys'
以下が返れば成功:
["_yoast_wpseo_metadesc", "_yoast_wpseo_canonical", "jin_hashtag", "post_keyword", ...]
Step 2: wordpress-mcp をローカルにコピーして拡張する
パッケージをコピー
cp -r ~/.npm/_npx/$(ls ~/.npm/_npx)/node_modules/wordpress-mcp \
~/your-workspace/wordpress-mcp-custom
create-post.js を拡張
build/tools/create-post.js の paramsSchema にパラメータを追加:
export const paramsSchema = {
title: z.string().nonempty().max(70),
content: z.string().nonempty(),
// --- 追加 ---
categories: z.array(z.number()).optional(),
slug: z.string().optional(),
seo_title: z.string().optional(),
seo_description: z.string().optional(),
seo_canonical: z.string().optional(),
seo_noindex: z.boolean().optional(),
};
createPost 関数のペイロード構築:
// Yoast SEO キーに直接書き込む
const meta = {};
if (seo_title) meta['_yoast_wpseo_title'] = seo_title;
if (seo_description) meta['_yoast_wpseo_metadesc'] = seo_description;
if (seo_canonical) meta['_yoast_wpseo_canonical'] = seo_canonical;
if (seo_noindex !== undefined)
meta['_yoast_wpseo_meta-robots-noindex'] = seo_noindex ? '1' : '0';
const payload = {
title, content,
author: wordpressPostAuthorId,
status: 'publish',
...(categories?.length > 0 && { categories }),
...(slug && { slug }),
...(Object.keys(meta).length > 0 && { meta }),
};
汎用キー(
_meta_*)か Yoast キーか?
Yoast SEO を使っているなら_yoast_wpseo_metadescに直接書くのが確実。
_meta_descriptionはプラグインなし環境向けのフォールバックとして残しておくと安心。
Step 3: JIN テーマのハッシュタグを設定する
JIN テーマには記事ごとのハッシュタグ設定フィールドがあり、Twitter(X)シェアボタンのURLに &hashtags=tag1,tag2 として自動で追加されます。
メタキー名の発見の過程
最初の罠: post_hashtag という名前を試したが、Twitterシェアに反映されない。
原因特定: デバッグ用エンドポイントを mu-plugins に一時追加して全 postmeta を確認。
// 一時デバッグ用(確認後に削除する)
add_action('rest_api_init', function() {
register_rest_route('debug/v1', '/postmeta/(?P<id>\d+)', [
'methods' => 'GET',
'callback' => function($req) { return get_post_meta($req['id']); },
'permission_callback' => function() { return current_user_can('manage_options'); },
]);
});
curl "https://your-site.com/wp-json/debug/v1/postmeta/POST_ID" \
-u "username:app_password"
wp-admin で手動保存した値が jin_hashtag に入っていることを確認 → 正解は jin_hashtag でした。
JIN ハッシュタグの仕様
| 項目 | 内容 |
|---|---|
| メタキー | jin_hashtag |
| 書き込み形式 |
#tag1 #tag2 #tag3(# 付きスペース区切り) |
| Twitter URL への変換 | JIN が自動で # 除去・カンマ区切りに変換 → &hashtags=tag1,tag2,tag3
|
設定方法(投稿後に curl で追加)
curl -X POST "https://your-site.com/wp-json/wp/v2/posts/{POST_ID}" \
-u "username:app_password" \
-H "Content-Type: application/json" \
-d '{
"meta": {
"jin_hashtag": "#放射線技師 #AAPM #放射線治療",
"post_keyword": "AAPM TGレポート, TG-51, 放射線技師"
}
}'
Step 4: 各 CLI の設定をローカル版に切り替える
Claude Code(~/.claude.json):
"wordpress": {
"command": "node",
"args": ["/path/to/wordpress-mcp-custom/build/index.js"],
"env": {
"WORDPRESS_HOST_URL": "https://your-site.com",
"WORDPRESS_API_USERNAME": "your_username",
"WORDPRESS_API_PASSWORD": "xxxx xxxx xxxx xxxx xxxx xxxx",
"WORDPRESS_POST_AUTHOR_ID": "1"
}
}
使い方
投稿ワークフローは2段階:
① MCP ツールで記事本文とYoast SEOを投稿(数秒)
article/my-post.html をWordPressに投稿して:
- categories: [183]
- slug: my-post-slug
- seo_description: 120〜155字のメタディスクリプション
- seo_canonical: https://your-site.com/my-post/
② curl で JIN 固有メタを追加(+5秒)
curl -X POST "https://your-site.com/wp-json/wp/v2/posts/{ID}" \
-u "user:pass" -H "Content-Type: application/json" \
-d '{"meta": {"jin_hashtag": "#tag1 #tag2", "post_keyword": "kw1, kw2"}}'
まとめ
| 設定項目 | デフォルト版 | カスタム版 |
|---|---|---|
| title | ✅ | ✅ |
| content | ✅ | ✅ |
| categories | ❌ | ✅ |
| slug | ❌ | ✅ |
| Yoast seo_description | ❌ | ✅ |
| Yoast seo_canonical | ❌ | ✅ |
| JIN jin_hashtag | ❌ | ✅(curl) |
| JIN post_keyword | ❌ | ✅(curl) |
ハマりポイントまとめ
-
mu-plugins ファイルの先頭に
<?phpを忘れると、PHP が実行されずソースコードが REST レスポンスに混入。MCP ツールのJSON.parse()がすべてコケる。 -
JIN のハッシュタグキー名は
jin_hashtag。post_hashtagやhashtagでは動かない。メタキー名の確認にはデバッグエンドポイント方式が有効。 -
Yoast SEO がある環境では
_yoast_wpseo_metadescに直接書く。_meta_descriptionは Yoast があると無視される(Yoast が後から上書きするため)。