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": "<h2>中野について</h2><p>31歳のエンジニア。AI×自動化が好き。</p>",
        "status": "publish"
    },
    {
        "title": "お問い合わせ",
        "slug": "contact",
        "content": "<p>お仕事のご依頼はこちらから。</p>",
        "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つ:

  • 冪等性を意識する:既存チェックを入れて何度実行しても安全にする
  • 認証情報は.envに分離:コードに直書きしない
  • カスタムRESTプラグインで補完:標準APIでは操作できない設定は自作エンドポイントで対応する

実際にこのブログ(obaba-win.com)を構築した際のスクリプト群は、GitHubで順次公開予定。自分のブログをゼロから自動構築したい人の参考になれば。