Open2

Docker Compose で WordPress を立てて、WordPress REST API で記事を作るまで

もりむらもりむら

Docker の公式ドキュメントに載っているクイックスタートをやっていきます
https://docs.docker.com/samples/wordpress/

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 を利用してみます。
https://make.wordpress.org/core/2020/11/05/application-passwords-integration-guide/

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 でないと有効化されないようでした。

「開発用サイトであれば、適宜、環境タイプを設定して、アプリケーションパスワードを有効化できます。」ということでしたが、

https://wptech.kiichiro.work/post-13/

前提として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"
  },
...

とりあえず適当すぎますが、作成できました。