0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AI CLI から WordPress に自動投稿する:Yoast SEO・JINテーマのメタデータも一括設定する

0
Posted at

はじめに

Claude Code・Gemini CLI などの AI CLI ツールには MCP(Model Context Protocol) という外部サービス連携の仕組みがあります。wordpress-mcp を使えば、AI CLI から直接 WordPress に記事を投稿できます。

ただし、デフォルトの wordpress-mcp が送れるデータは titlecontent だけ。実際の記事公開には カテゴリ・スラッグ・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.jsparamsSchema にパラメータを追加:

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)

ハマりポイントまとめ

  1. mu-plugins ファイルの先頭に <?php を忘れると、PHP が実行されずソースコードが REST レスポンスに混入。MCP ツールの JSON.parse() がすべてコケる。
  2. JIN のハッシュタグキー名は jin_hashtagpost_hashtaghashtag では動かない。メタキー名の確認にはデバッグエンドポイント方式が有効。
  3. Yoast SEO がある環境では _yoast_wpseo_metadesc に直接書く_meta_description は Yoast があると無視される(Yoast が後から上書きするため)。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?