はじめに
noteに記事が90本貯まってきました。さすがに増えてくると、見通しが悪くなります。そこで、WordPressに移行をします。
記事数が増えてくると、だんだん別の問題が出てきます。
それが、カテゴリーとタグの整理です。
WordPressの管理画面から1記事ずつ開いて、
- カテゴリーを選ぶ
- タグを付ける
- slugを直す
- 次の記事へ行く
という作業を100回やるのは、なかなか厳しいです。
私は普段エンジニアではなく、マーケティングやデータ分析寄りの業務をしています。SQLを書くことはありますが、WordPressのAPIを日常的に触っているわけではありません。
ただ、最近Codex CLIを使うことで、こういう作業もかなり現実的にできるのではないかと思うようになりました。
今回は、Codex CLIを使って、WordPressの記事整理をするためのローカル環境を作った話です。
この記事では、まだWordPressの記事は更新しません。
まずは、
- Codex CLIを使えるようにする
- WordPress REST APIを叩く準備をする
-
.envで認証情報を管理する -
AGENTS.mdで安全ルールを書く
ところまでを扱います。
やりたいこと
最終的にやりたいことは、WordPressの記事100本を以下のように整理することです。
- WordPress REST APIで既存記事を取得する
- 記事一覧をCSVに出力する
- Codexでカテゴリー分類案を作る
- CSVを人間が見直す
- WordPressにカテゴリー・タグを一括反映する
- 長すぎるslugも短く整える
ただし、いきなり本番のWordPressを更新するのは怖いです。
そこで、最初から以下の方針にしました。
- WordPress管理画面を直接操作しない
- WordPress REST APIを使う
- Pythonスクリプト経由で操作する
- 更新系処理は必ずdry-runをデフォルトにする
-
--applyを付けたときだけ更新する - 最初は5件だけテストする
- 本文やタイトルは変更しない
AIエージェントに本番環境を触らせる場合、便利さより先に安全設計が必要だと思っています。
全体構成
今回作る作業ディレクトリは、だいたい以下のような構成です。
wp-codex-tools/
.env
.gitignore
requirements.txt
AGENTS.md
scripts/
wp_client.py
export_posts.py
classify_posts.py
sync_taxonomies.py
suggest_slugs.py
apply_slugs.py
data/
posts_export.csv
posts_export.json
categorized_posts.csv
taxonomy_map.json
slug_suggestions.csv
今回の記事では、このうち以下を準備します。
wp-codex-tools/
.env
.gitignore
requirements.txt
AGENTS.md
scripts/
data/
実際にWordPress記事をCSVに出力するスクリプトは、次回の記事で扱います。
Codex CLIをインストールする
まずCodex CLIをインストールします。
私の環境はMacです。
curl -fsSL https://chatgpt.com/codex/install.sh | sh
インストールできると、以下のような表示が出ました。
Codex CLI 0.141.0 installed successfully.
もし codex コマンドが見つからない場合は、PATHが通っていない可能性があります。
私の場合は以下のように案内されました。
export PATH="/Users/noriyuki/.local/bin:$PATH"
確認します。
codex --version
これでバージョンが表示されればOKです。
作業ディレクトリを作る
次に、WordPress整理用の作業ディレクトリを作ります。
mkdir ~/wp-codex-tools
cd ~/wp-codex-tools
Git管理もしておきます。
git init
必要なディレクトリを作ります。
mkdir -p scripts data
Python仮想環境を作る
WordPress REST APIを叩くために、Pythonの仮想環境を作ります。
python3 -m venv .venv
source .venv/bin/activate
必要なライブラリをインストールします。
pip install requests python-dotenv beautifulsoup4 pandas
pip freeze > requirements.txt
使うライブラリは以下です。
-
requests- WordPress REST APIを叩く
-
python-dotenv-
.envから認証情報を読み込む
-
-
beautifulsoup4- WordPress本文のHTMLからテキストを取り出す
-
pandas- CSVの読み書きや確認に使う
WordPressのアプリケーションパスワードを発行する
WordPress REST APIを認証付きで使うために、WordPress側でアプリケーションパスワードを発行します。
WordPress管理画面で以下を開きます。
ユーザー
→ プロフィール
→ アプリケーションパスワード
名前は、たとえば以下のようにしました。
codex-local-wp-tools
発行されたパスワードは一度しか表示されないため、控えておきます。
ここで使うのは、WordPressの通常ログインパスワードではありません。
外部ツール用に発行する専用パスワードです。
.envを作る
認証情報は .env に書きます。
nano .env
中身は以下のようにします。
WP_BASE_URL=https://www.example.com
WP_USERNAME=your_wordpress_username
WP_APP_PASSWORD=xxxx xxxx xxxx xxxx xxxx xxxx
実際には、自分のWordPressのURL、ユーザー名、アプリケーションパスワードに置き換えます。
たとえば、WordPressのREST API Base URLは以下のようになります。
https://www.example.com/wp-json/wp/v2
注意点として、WP_USERNAME はメールアドレスで通る場合もありますが、WordPressのユーザー名が別に設定されている場合は、そのユーザー名を使う必要があります。
.gitignoreを作る
.env をGitに入れると危険です。
必ず .gitignore に入れます。
nano .gitignore
中身は以下です。
.env
.venv/
__pycache__/
data/*.csv
data/*.json
data/*.log
今回は記事データをCSVやJSONで出力するため、data/ 配下の生成ファイルもGit管理しない方針にしました。
AGENTS.mdを書く
ここが今回かなり重要です。
Codex CLIには、リポジトリ内に AGENTS.md を置くことで、そのプロジェクトで守ってほしいルールを書いておけます。
今回は、WordPress本番環境を扱う可能性があるため、最初に安全ルールを書いておきました。
# AGENTS.md
## このリポジトリの目的
WordPress REST APIを使って、既存投稿を取得し、カテゴリー・タグの分類案を作り、確認後にカテゴリー・タグだけを反映する。
## 絶対ルール
- `.env` の中身を表示しない。
- `WP_APP_PASSWORD` をログに出さない。
- WordPressへの更新処理は、必ず dry-run をデフォルトにする。
- `--apply` が指定されたときだけWordPressを更新する。
- 最初から全件更新しない。必ず `--limit 5` でテストできるようにする。
- 本文、タイトル、slug、公開状態、excerpt は変更しない。
- 変更してよいのは `categories` と `tags` のみ。
- 削除系APIは実装しない。
- 既存カテゴリー・タグがある場合は再利用する。
- 新規作成する場合は、作成前に一覧表示する。
- すべての更新前に対象 post_id, title, category, tags を表示する。
- APIエラー時も認証情報は表示しない。
## カテゴリー方針
メインカテゴリーは原則1つ。タグは複数可。
初期カテゴリー候補:
- 旅の設計
- ポイント・マイルをためる
- 旅行記
- クレカ・保険
- 通信・スマホ
- 家族・暮らしのデザイン
- 思考のデザイン
この AGENTS.md は、あとで本当に役立ちました。
実際にslugを変更しようとしたとき、Codexがこのルールを読んで、
現在の AGENTS.md と衝突するため実装できません。
と止めてくれました。
これはかなり良い挙動でした。
AIエージェントに「やって」と言うだけではなく、「やってはいけないこと」を先に書いておくのは大事だと感じました。
Codexを起動する
準備ができたら、作業ディレクトリでCodexを起動します。
cd ~/wp-codex-tools
source .venv/bin/activate
codex
最初は、Codexに以下のように指示しました。
このリポジトリで、WordPress REST APIを使って既存投稿を取得するPythonツールを作ってください。
前提:
- 認証情報は .env にあります。
- .env には WP_BASE_URL, WP_USERNAME, WP_APP_PASSWORD があります。
- WordPress REST API Base URL は WP_BASE_URL + /wp-json/wp/v2 です。
まず作るファイル:
- scripts/wp_client.py
- scripts/export_posts.py
- README.md
実装内容:
1. scripts/wp_client.py
- .env を読み込む
- WP_BASE_URL, WP_USERNAME, WP_APP_PASSWORD を取得する
- Basic認証でWordPress REST APIを叩く
- 共通の get/post 関数を用意する
- 認証情報をログに出さない
2. scripts/export_posts.py
- /wp/v2/posts から投稿を取得する
- ページネーションに対応する
- --limit N で取得件数を制限できる
- --all で全件取得できる
- data/posts_export.csv と data/posts_export.json に保存する
取得項目:
- post_id
- title
- slug
- date
- status
- link
- excerpt_text
- content_text の先頭2000文字
- categories のID配列
- tags のID配列
注意:
- WordPressへの更新はまだ実装しない
- 削除系APIは実装しない
- .env の中身は絶対に表示しない
- WP_APP_PASSWORDをログに出さない
- APIエラー時はHTTPステータスとエラー概要だけ表示する
このように、最初は「更新」ではなく「取得」だけを指示しました。
いきなりWordPressを更新する処理を作らせるよりも、まずは読み取りだけに限定した方が安心です。
今回のポイント
今回やったことは、コードそのものよりも、作業の土台作りです。
特に重要だったのは以下です。
- WordPress管理画面を手作業で触らない
- WordPress REST APIを使う前提にする
- 認証情報は
.envに逃がす -
.envはGit管理しない - Codexに作業ルールを伝えるため
AGENTS.mdを作る - 更新処理はdry-run前提にする
- 最初は取得だけにする
Codex CLIを使うと、非エンジニアでもかなり高度な作業ができるようになります。
ただし、その分、本番環境を壊す可能性もあります。
だからこそ、最初に「安全柵」を作っておくことが大事だと思いました。
次回
次回は、WordPress REST APIを使って、既存記事をCSVにエクスポートします。
やることは以下です。
-
/wp/v2/postsから記事を取得する - ページネーションに対応する
- タイトル、slug、本文、カテゴリー、タグを取り出す
-
posts_export.csvを作る - WordPressの記事100本を一覧データとして扱えるようにする
WordPress管理画面で1記事ずつ見るのではなく、記事群をCSVとして俯瞰できるようになると、かなり整理しやすくなります。