hyperdb.work

WordPressの投稿をVS Codeで編集する

WordPressをReactで構築するサイトのHeadless CMSとして利用しようとしているのですが、投稿する度にいちいちWordPressの管理画面を開くのではあまり意味がないと思ったので、VS CodeでMarkdownファイルを編集して、WordPressのREST APIを通じて投稿できるようにしました。

ここでは投稿・固定ページ・カテゴリー・タグをREST APIを通じて取得してローカルに保存しているため、記事が多いサイトではかえって面倒な場合もあるかもしれませんが、さほど記事の多くないサイトでは有用なのではないかと考えています。

準備作業

まず、WordPressのREST APIを有効にする必要があります。WordPressの管理画面から「設定」→「パーマリンク設定」でデフォルト値以外のパーマリンクを選択して保存してください。パーマリンクの設定を行うことで、WordPressのREST APIが有効になります。

次にユーザーの設定画面でAPIを利用するためのパスワードを設定します。設定した値は一度閉じると確認できなくなるので、必ずメモしておいてください。

設定が終わったらプロジェクトのルートに.envファイルを作成してパラメーターを設定してください。

API_URL="API URL here"
API_USER="WordPress Username here"
API_PASS="BASIC Auth Password here"

ここで設定した値はapp_config.pyで読み込まれます。

import os

from dotenv import load_dotenv


def getSettings():
    load_dotenv()

    return {
        "API_URL": os.environ["API_URL"],
        "API_USER": os.environ["API_USER"],
        "API_PASS": os.environ["API_PASS"],
    }

投稿を取得する

前述の設定がうまくいっていれば、以下のコマンドでWordPressの投稿を取得してローカルに保存できます。

python bin/load_posts.py

このコマンドはWordPressの投稿を取得してpostsディレクトリにJSONファイルとそこからコンテンツ部分を取り出したMarkdownファイルを保存します。JSONファイルは投稿のメタデータを含んでいるためデータの詳細を確認する際に役立ちます。

import json
import os

import requests
from markdownify import markdownify as md
from requests.auth import HTTPBasicAuth

from app_config import getSettings


def load_posts():
    settings = getSettings()
    post_api = settings["API_URL"] + "/posts"
    posts = requests.get(
        post_api,
        auth=HTTPBasicAuth(settings["API_USER"], settings["API_PASS"]),
    )

    for post in posts.json():
        fname = os.path.join("posts", f"post_{post['id']}.json")
        json.dump(
            post, open(fname, "w", encoding="utf-8"), indent=4, ensure_ascii=False
        )

        content = post["content"]["rendered"]

        with open(
            os.path.join("posts", f"post_{post['id']}.md"), "w", encoding="utf-8"
        ) as f:
            content = md(content)
            f.write(content)


def main():
    load_posts()


if __name__ == "__main__":
    main()
公開日時:2025/08/18 17:05:36 更新日時:2025/08/25 18:03:07