やるきなし

2021/07/22 17:24 / WordPress Application Passwords and PHP Basic Auth

WordPress が動作しているサーバでいろいろコマンドラインから操作するには WP-CLI を使えば良いのだが,そうではなくて WordPress が用意している API を叩くというアプローチは無いのだろうか? と思ったら,当然あって,REST APIが用意されている.

認証まわりも Application Passwords が使えて,Application Passwords Plugin 自体 WordPress 5.6 で本体に取り込まれている.

ということでApplication Passwords: Integration Guideに従って使ってみようとしたのだが,Basic Auth (ベーシック認証)がうまく行かず悩む.

% curl --user 'USERNAME:PASSWORD' 'https://myn.example.com/?rest_route=/wp/v2/users/me' | jq

上でユーザ情報が得られたら正しく動作していることになるのだが,以下が返ってくる.

{
  "code": "rest_not_logged_in",
  "message": "You are not currently logged in.",
  "data": {
    "status": 401
  }
}

そもそも PHP が Basic Auth の情報を受け取らなければ,認証情報が WordPress に渡らないわけで,HTTP authentication with PHP を参考にテストしつつ,最終的には https://www.php.net/manual/en/features.http-auth.php#114877 にある以下を .htaccess に書いて,正しく動作するようになった(お名前.com 共用サーバーSD).

SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0

これがあると HTTP_AUTHORIZATION という環境変数で HTTP ヘッダの Authorization の情報(Basic ...)が PHP に渡される.

あと,メモがてら Server process から CGI が起動される際に渡される環境変数をチェックするためのスクリプト(サーバの情報ダダ漏れになるので,使ったあとは削除).

[test.cgi]
#!/bin/sh

echo Content-Type: text/plain
echo
env

REST API が使えるようになったので,いちいち Web I/F で操作していた部分を一部自動化しようかと.

追記 (2021/7/23)

どうやら Pages の Update ができない.https://developer.wordpress.org/rest-api/reference/pages/ を見る限り API は用意されていそうなのだけど,POST 自体は成功する(content の raw で新しいデータを POST)けど更新されない...