Codex Cloudで記事作成からWordPress投稿まで自動化する|準備編
記事作成からレビュー、WordPressへの登録まで同じ手順で進められると、ブログ運用が安定します。一方、記事形式や認証情報の扱いを決めないまま自動化すると、入力漏れや重複投稿につながりかねません。
このシリーズでは、Codex Cloudで記事を作成し、GitHubのPull Requestでレビューして、GitHub ActionsからWordPressへ下書き投稿する仕組みを紹介します。準備編では、リポジトリ側の記事ルールとWordPress連携に必要な初期設定を確認します。
自動投稿の全体像
今回の仕組みは、次のように役割を分けています。
1. Codex CloudがMarkdownの記事を作成する
2. GitHubのPull Requestで差分をレビューする
3. mainブランチへのマージをGitHub Actionsが検知する
4. GitHub Actionsが記事を検証してWordPressへ送信する
5. WordPressへ下書きとして登録する
Codex CloudからWordPressへ直接アクセスしないことがポイントです。記事の変更履歴はGitHubに残し、WordPressの認証情報を使う処理はGitHub Actionsに限定します。
AGENTS.mdに記事作成ルールをまとめる
Codex Cloudへの依頼は、「このテーマで新規記事を書いて」のように短くできます。保存場所やFront Matterなどの共通条件は、リポジトリのAGENTS.mdに記載しているためです。
このリポジトリでは、例えば次の項目をルールとして管理しています。
- 記事ファイルの保存場所と命名規則
- 下書きと予約投稿の扱い
- カテゴリとタグの選び方
- 本文の長さとシリーズへの分割基準
- アイキャッチの設定方法
- 完了前に実行するテスト
プロジェクト固有の判断基準もコードと一緒に管理することで、記事ごとのばらつきを抑えられます。
記事はMarkdownとFront Matterで管理する
記事はarticles/年/slug/article.mdという構成で保存します。ファイルの先頭には、WordPress投稿に必要な情報をYAML Front Matterとして記述します。
---
id: codex-cloud-wordpress-publishing-workflow
title: Codex Cloudで記事作成からWordPress投稿まで自動化する|準備編
slug: codex-cloud-wordpress-publishing-workflow
status: draft
categories:
- WordPress
tags:
- Codex Cloud
- GitHub Actions
---
idは記事を継続的に識別する値で、一度決めたら変更しません。slugは記事のURLに使う値です。投稿処理は、同じidの投稿がWordPressに存在する場合、新しい投稿を増やさずに既存の投稿を更新します。
Front MatterはJSON Schemaに沿って検証し、必須項目の不足や許可されていない値を投稿前に検出します。
本文は投稿時に、Gutenbergのブロックコメント付きHTMLへ変換されます。見出し、段落、リスト、コードブロックといったMarkdownの構造を、WordPressのブロックエディターでも扱える形で送信します。
WordPressでやること
GitHub Actionsから投稿できるように、WordPress側では連携プラグインの導入とアプリケーションパスワードの発行を行います。
連携プラグインを導入する
WordPress側には、リポジトリにある専用プラグイン「Techblog Publisher Bridge」をあらかじめインストールし、有効化します。GitHub Actionsが自動でインストールするものではないため、初回導入時に必要な作業です。
プラグインは、投稿とメディアへexternal_article_idというメタ情報を登録し、REST APIから検索できるようにします。この値にFront Matterのidを保存することで、投稿処理は既存の記事やアイキャッチを特定できます。
検索用のREST APIは、記事を編集できる権限を持つ認証済みユーザーだけが利用できます。記事を更新するたびに投稿やメディアが重複することを防ぐための、WordPress側の橋渡し役です。
プラグインのソースコードを確認する
プラグインの中心となるのは、external_article_idをREST APIへ公開する次の処理です。投稿と添付ファイルの両方へ、同じ形式のメタ情報を登録します。
function techblog_publisher_can_edit_post( $allowed, $meta_key, $post_id, $user_id ) {
return user_can( $user_id, 'edit_post', $post_id );
}
function techblog_publisher_register_meta() {
$args = array(
'type' => 'string',
'single' => true,
'show_in_rest' => true,
'sanitize_callback' => 'sanitize_key',
'auth_callback' => 'techblog_publisher_can_edit_post',
);
register_post_meta( 'post', 'external_article_id', $args );
register_post_meta( 'attachment', 'external_article_id', $args );
}
add_action( 'init', 'techblog_publisher_register_meta' );
show_in_restを有効にすることで、GitHub Actionsの投稿処理はWordPress REST APIを通じてexternal_article_idを保存できます。sanitize_keyで値を正規化し、auth_callbackでは対象を編集できるユーザーか確認します。
外部IDから投稿を検索するREST APIは、次のように登録します。実際のコールバックではWP_Queryを使い、external_article_idが一致する投稿IDを返します。
function techblog_publisher_routes() {
register_rest_route( 'techblog/v1', '/posts/by-external-id/(?P<external_id>[a-z0-9-]+)', array(
'methods' => WP_REST_Server::READABLE,
'callback' => function ( $request ) {
$request['object_type'] = 'post';
return techblog_publisher_lookup( $request );
},
'permission_callback' => function () {
return current_user_can( 'edit_posts' );
},
) );
}
add_action( 'rest_api_init', 'techblog_publisher_routes' );
実際のプラグインでは、同じ検索関数を使うメディア用エンドポイントも登録します。該当データがなければnull、見つかればWordPress上のIDを返すため、投稿側は新規作成と更新を判断できます。
アプリケーションパスワードを発行する
GitHub ActionsのREST API認証には、WordPressへのログインパスワードではなく、専用のアプリケーションパスワードを使います。WordPressの管理画面で、連携用ユーザーのプロフィールを開きます。
1. 「アプリケーションパスワード」まで移動する
2. 用途が分かる名前として「GitHub Actions」などを入力する
3. 「新しいアプリケーションパスワードを追加」を押す
4. 表示されたパスワードを、その場で安全な場所へ控える
発行したパスワードは、通常の管理画面ログインには使わず、GitHub ActionsからWordPress REST APIへ接続するためだけに使用します。値を確認できるのは発行時だけなので、画面を閉じる前にGitHub Secretsへ登録できるよう準備します。
連携用ユーザーには、投稿、カテゴリ、タグ、メディアを扱うために必要な権限だけを与えます。パスワードが不要になった場合や漏えいが疑われる場合は、ユーザープロフィールから該当するアプリケーションパスワードだけを取り消せます。
GitHub ActionsへSecretsを設定する
WordPress側の準備ができたら、次の3項目をGitHub Actionsから参照するSecretsとして設定します。
WP_BASE_URLWP_USERNAMEWP_APPLICATION_PASSWORD
WP_APPLICATION_PASSWORDには、WordPressで発行したアプリケーションパスワードを設定します。認証情報は記事ファイルやワークフローへ直接書かず、Pull Requestの差分やActionsのログにも出さないようにします。
準備編のまとめ
Codex CloudとWordPressを安全につなぐには、本文を生成する機能だけでなく、記事形式、識別子、連携プラグイン、認証情報の管理方法を先に決める必要があります。
準備ができたら、次は実際に記事を作成します。実践編では、アイキャッチ設定、ローカルでの検証、Pull Requestのマージ、GitHub Actionsによる下書き投稿までを順に確認します。
今回は以上です。