PythonでWordPressサイトを全自動構築する方法【REST API活用】
PythonでWordPressサイトを全自動構築する方法【REST API活用】
WordPressのセットアップは地味に時間がかかる。カテゴリを手作りして、メニューを組んで、固定ページを作って、CSSを貼り付けて……このブログ「中野のAI開発部屋」を立ち上げた時、そのすべてをPythonスクリプトで自動化した。本記事では実際に動かしたコードと手順を公開する。
なぜ自動化したのか
手作業でセットアップするのが嫌というだけでなく、「再現性」が欲しかった。もしサーバーを移行したり、テスト環境を作りたくなったときに、コマンド1発で同じ構成を再現できるようにしておきたかった。
実際にやってみたら、初回セットアップが約15分かかっていた作業が、スクリプト実行の2分に短縮できた。
WordPress REST APIの基本
WordPress 5.0以降、REST APIが標準搭載されている。認証はApplication Passwordsを使う。WordPressの管理画面 → ユーザー → プロフィール → アプリケーションパスワードで発行できる。
import requests
from requests.auth import HTTPBasicAuth
import os
from dotenv import load_dotenv
load_dotenv()
WP_URL = os.getenv("WP_URL") # https://example.com
WP_USER = os.getenv("WP_USER")
WP_APP_PASSWORD = os.getenv("WP_APP_PASSWORD")
auth = HTTPBasicAuth(WP_USER, WP_APP_PASSWORD)
def wp_get(endpoint, params=None):
url = f"{WP_URL}/wp-json/{endpoint}"
res = requests.get(url, auth=auth, params=params)
res.raise_for_status()
return res.json()
def wp_post(endpoint, data):
url = f"{WP_URL}/wp-json/{endpoint}"
res = requests.post(url, auth=auth, json=data)
res.raise_for_status()
return res.json()
認証情報は.envに置いて、絶対にコードにハードコードしない。
カテゴリの自動作成
CATEGORIES = [
{"name": "Python", "slug": "python"},
{"name": "JavaScript", "slug": "javascript"},
{"name": "AI・ML", "slug": "ai-ml"},
{"name": "インフラ", "slug": "infra"},
{"name": "開発ツール", "slug": "dev-tools"},
]
def create_categories():
existing = {c["slug"]: c["id"] for c in wp_get("wp/v2/categories", {"per_page": 100})}
for cat in CATEGORIES:
if cat["slug"] in existing:
print(f" スキップ(既存): {cat['name']}")
continue
result = wp_post("wp/v2/categories", cat)
print(f" 作成: {cat['name']} (ID: {result['id']})")
既存チェックを入れておくと冪等性が保たれる。何度実行しても同じ結果になる。
ナビゲーションメニューの自動作成
メニューはWP REST APIの/wp/v2/menusエンドポイントで操作できる。
def create_main_menu(category_ids: dict):
# メニュー作成
menu = wp_post("wp/v2/menus", {
"name": "メインメニュー",
"slug": "main-menu"
})
menu_id = menu["id"]
# カテゴリをメニュー項目として追加
for name, cat_id in category_ids.items():
wp_post("wp/v2/menu-items", {
"title": name,
"object": "category",
"object_id": cat_id,
"menus": menu_id,
"menu_order": list(category_ids.keys()).index(name) + 1
})
# メニューをヘッダーロケーションに設定
wp_post("wp/v2/menu-locations", {
"header": menu_id
})
固定ページの自動作成
プロフィールページやお問い合わせページも自動生成する。
PAGES = [
{
"title": "プロフィール",
"slug": "about",
"content": "中野について
31歳のエンジニア。AI×自動化が好き。
",
"status": "publish"
},
{
"title": "お問い合わせ",
"slug": "contact",
"content": "お仕事のご依頼はこちらから。
",
"status": "publish"
},
]
def create_pages():
existing_slugs = {p["slug"] for p in wp_get("wp/v2/pages", {"per_page": 100})}
for page in PAGES:
if page["slug"] in existing_slugs:
print(f" スキップ(既存): {page['title']}")
continue
result = wp_post("wp/v2/pages", page)
print(f" 作成: {page['title']} (ID: {result['id']})")
カスタムCSSの自動適用
テーマのカスタムCSSを自動で当てるには、WordPress標準APIでは少し難しい。このブログではカスタムRESTプラグイン(wp-theme-mods-api.php)を作って対応した。
def apply_custom_css(css_content: str):
wp_post("custom/v1/custom-css", {"css": css_content})
print(f" CSS適用完了 ({len(css_content)} bytes)")
# 使用例
with open("assets/style.css", "r") as f:
css = f.read()
apply_custom_css(css)
フッターJavaScriptの自動設定
外部リンクを新規タブで開くJSなど、フッターに仕込むスクリプトも自動化できる。
FOOTER_SCRIPT = """
document.querySelectorAll('a[href^="http"]').forEach(function(link) {
if (link.hostname !== location.hostname) {
link.setAttribute('target', '_blank');
link.setAttribute('rel', 'noopener noreferrer');
}
});
"""
def apply_footer_script(script: str):
wp_post("custom/v1/footer-script", {"script": script})
print(" フッタースクリプト設定完了")
まとめ
PythonとWordPress REST APIを組み合わせれば、サイトのセットアップ作業をほぼ全自動化できる。ポイントは以下の3つ:
実際にこのブログ(obaba-win.com)を構築した際のスクリプト群は、GitHubで順次公開予定。自分のブログをゼロから自動構築したい人の参考になれば。