Docker Compose で WordPress を立てて、WordPress REST API で記事を作るまで
Docker の公式ドキュメントに載っているクイックスタートをやっていきます
mkdir wordpress-sample
cd wordpress-sample/
vim docker-compose.yml
docker-compose.yml
version: "3.9"
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- wordpress_data:/var/www/html
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
wordpress_data: {}
docker-compose up -d
エラー
Creating network "wordpress-sample_default" with the default driver
Creating volume "wordpress-sample_db_data" with default driver
Creating volume "wordpress-sample_wordpress_data" with default driver
Pulling db (mysql:5.7)...
5.7: Pulling from library/mysql
ERROR: no matching manifest for linux/arm64/v8 in the manifest list entries
m1 mac に対応してるほうの mysql に変更
@@ -2,7 +2,7 @@
services:
db:
- image: mysql:5.7
+ image: mysql/mysql-server:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
再度
docker-compose up -d
起動した
docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------------------------------
wordpress-sample_db_1 /entrypoint.sh mysqld Up (health: starting) 3306/tcp, 33060/tcp
wordpress-sample_wordpress_1 docker-entrypoint.sh apach ... Up 0.0.0.0:8000->80/tcp
http://localhost:8000
をブラウザで開いてインストールを進める
WordPress REST API の準備
初期状態で叩いても、Not Found になるようです
curl http://localhost:8000/wp-json/
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL was not found on this server.</p>
<hr>
<address>Apache/2.4.52 (Debian) Server at localhost Port 80</address>
</body></html>
REST API を利用するのに、設定 > パーマリンク から「投稿名」を選択して「変更を保存」しておく必要があるようです
これで、JSON が返ってくるようになりました
curl http://localhost:8000/wp-json/
{"name":"\u30ef\u30fc\u30c9\u30d7\u30ec\u30b9\u30b5\u30f3\u30d7\u30eb","description":"Just another WordPress site","url":"http:\/\/localhost:8000",...
記事を取得してみます
curl localhost:8000/wp-json/wp/v2/posts/1 | jq
{
"id": 1,
"date": "2022-01-29T17:52:05",
"date_gmt": "2022-01-29T08:52:05",
"guid": {
"rendered": "http://localhost:8000/?p=1"
},
"modified": "2022-01-29T18:10:54",
"modified_gmt": "2022-01-29T09:10:54",
"slug": "hello-world",
"status": "publish",
"type": "post",
"link": "http://localhost:8000/hello-world/",
"title": {
"rendered": "Hello world!"
},
"content": {
"rendered": "\n<p>WordPress へようこそ。こちらは最初の投稿です。編集または削除し、コンテンツ作成を始めてください。</p>...
記事の作成
記事の取得は誰でもできますが、作成は認証を通す必要があります
curl -s localhost:8000/wp-json/wp/v2/posts -XPOST | jq
{
"code": "rest_cannot_create",
"message": "このユーザーとして投稿を編集する権限がありません。",
"data": {
"status": 401
}
}
Application Passwords を利用してみます。
WordPress 5.6 will finally see the introduction of a new system for making authenticated requests to various WordPress APIs — Application Passwords.
WordPress 5.6 以降では、プラグインをインストールする必要なく使えるようです。
設定 > ユーザー > プロフィール にアプリケーションパスワードの項目がありました。ただ、HTTPS でないと有効化されないようでした。
「開発用サイトであれば、適宜、環境タイプを設定して、アプリケーションパスワードを有効化できます。」ということでしたが、
前提としてSSL化されている状態であることとなっているので、localhostでやる場合は、
WP_ENVIRONMENT_TYPE にlocalを指定する
つまりこちらの設定が必要だったようです。Docker イメージの環境変数としてドキュメントに記載はありませんでしたが、grep してみたところ環境変数から読み取っているような雰囲気を察知しました
/var/www/html/wp-includes/load.php: $has_env = getenv( 'WP_ENVIRONMENT_TYPE' );
wordpress に環境変数を追加します
vim docker-compose.yml
@@ -27,6 +27,7 @@
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DEBUG: 1
+ WP_ENVIRONMENT_TYPE: local
volumes:
db_data: {}
wordpress_data: {}
docker-compose up -d
これで有効化できました。
アプリケーションパスワードを追加できました。
これを使って記事を作成します
curl --user "hoge:44Dx toq3 twBH azta BFUq R8xJ" \
'http://localhost:8000/wp-json/wp/v2/posts?title=tititle' -XPOST | jq
{
"id": 14,
"date": "2022-01-30T23:39:56",
"date_gmt": "2022-01-30T14:39:56",
"guid": {
"rendered": "http://localhost:8000/?p=14",
"raw": "http://localhost:8000/?p=14"
},
"modified": "2022-01-30T23:39:56",
"modified_gmt": "2022-01-30T14:39:56",
"password": "",
"slug": "",
"status": "draft",
"type": "post",
"link": "http://localhost:8000/?p=14",
"title": {
"raw": "tititle",
"rendered": "tititle"
},
...
とりあえず適当すぎますが、作成できました。