サイト構築
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()