WordPressの記事を1つ1つ手で全て書くと、とても手間暇がかかりますね。そんな問題はWordPress Rest APIを使えるように設定して、プログラミングをすれば解消します!
この手順通りに進めれば問題なくサクッとAPI使用開始!とできるように手順をまとめました。
1: WordPress Admin管理画面からAPIのプラグインを入れる
プラグイン>新規追加 これを見つけてインストールします。
「WordPress REST API (Version 2)」で検索。
検索結果ではトップには出てきません。スクロールして出てきます。
最終更新は5年前(ブログ記載当時)。古い。
ですがWP REST API Teamが作成している公式のやつです。
2: WordPress Admin管理画面からパスワードのプラグインを入れる
プラグイン>新規追加 これを見つけてインストールします。
「Application Passwords」で検索。
トップに出てきます。
3: 1,2でインストールしたプラグインを有効化
プラグイン>インストール済みプラグイン 忘れず有効化してくださいね
上の画像はApplication Passwordsの場合。同様にAPIの方も。
4: Application Passwordsでパスワードを生成する
ユーザー>プロフィール でページ下部へ行くと、このような部分があります。
Application Passwordプラグインを追加して有効化できていないと出てきません。
画像の下に英語版で同じようなフォームがありますが、私が試した時は下のフォームでパスワード生成するとうまくいかなかったので上がおすすめ。
「新しいアプリケーションパスワード名」に任意のアプリ名を入れて「新しいアプリケーションパスワード名を追加」ボタンを押すとモーダルウィンドウでパスワードが表示されるのでそれをコピペしてモーダルを閉じます。
ユーザー名:xxx xxx xxx xxx
こんな形のパスワード。
5: パーマリンク設定を確認
設定>パーマリンク を開き、ページ下部を確認。
カスタム構造にチェックが入っていて自分の任意カスタムを指定していない(=デフォルト設定のまま)の場合はAPIが効かない原因になってしまうので、別の選択肢にするかカスタム構造のままで任意のパラメータや文字列を追加してあげて、「デフォルト設定のまま」状態を回避します。
変更したら、「変更を保存」
準備完了
ここまででWordpress Admin側の設定は完了です。
これからAPIを投げます。
6: お手元のローカルサーバー(リモートでもいいけど)から記事一覧を取得してみる
curlの場合
curl --user "ユーザー名:xxx xxx xxx xxx" "https://your.wordpress.domain/wp-json/wp/v2/posts"
GETだけであればこれだけで投稿一覧が取得できるはずです。
トップ画面のhtmlが帰ってきてしまう場合、私は5のパーマリンクの設定を抜かしていたことが原因でした。
また、パスワードは直接貼り付けるだけでOKでした。POSTもいけます。
postmanの場合
1:パスワードをエンコード
% echo -n "sixtones:r9Ux DkUr 4cqp or4q FX3c U1sM" | base64
こんな感じで「パスワードをBase64でエンコードしたもの」を用意します
2:リクエストの設定をして送る
Url: https://your.wordpress.domain/wp-json/wp/v2/posts Authorization: No Auth Headers: {"Accept":"application/json", "Authorization":"Basic encodedpasswordxxxxxxxxxxxx"}
こんな感じの設定でGETはOK。
Authorizationに何か設定されているとそちらを見に行ってしまって認証に失敗しました。
Headersに設定するAuthorizationは1で、Base64でエンコードしたパスワードを設定。curlと違うところですね。
postの場合はBodyフォームにJson形式でデータを入れてあげてpostすればOK。
なんかうまくいかないとき(incorrect_password)
私はこの方法で5つのWordpressブログのAPI使用設定を行い、同じコードからドメインだけ変えて同じ内容を投稿するというテストを行いましたが、1つのブログだけincorrect_passwordが帰ってきてしまい投稿ができないという事態に巡り合いました。
curlでPOSTしてみる
curlはAuthorizationヘッダーに”ユーザー名:パスワード”を入れると自動でBase64で処理してくれるみたいです。なので、curlでユーザー名とパスワード下手うちでAPIにアクセスしてみて、成功するか否かをみてみます。
% curl --user "ユーザー:パスワードxxx xxx xxx xxx" -X POST -d "title=New Title" https://my.comain/wp-json/wp/v2/posts {"code":"incorrect_password","message":"\u63d0\u4f9b\u3055\u308c\u305f\u30d1\u30b9\u30ef\u30fc\u30c9\u306f\u7121\u52b9\u306a\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30d1\u30b9\u30ef\u30fc\u30c9\u3067\u3059\u3002","data":{"status":401}}%
はい、相変わらずエラーが帰ってきました。メッセージは文字化けしていますが、UTF-8にすると「提供されたパスワードは無効なアプリケーションパスワードです。」とのこと。
そんなはずないじゃない。正しいパスワードですよ。。。
✔️解決策
WordPress Admin画面から管理者権限の別Userを作成し、User名=Applicationパスワード名で新しくパスワードを作成したらpostに成功しました。
①管理者権限で別ユーザー(REST API用となる)を作成
権限グループは「管理者」であることを確認。(ちなみに私は初めに使っていたユーザーもちゃんと管理者でした)
②作成したユーザーのプロフィール画面に入り、ページ下部のパスワード生成を行う。
4: Application Passwordsでパスワードを生成するで行ったことと同じことを新しいユーザーでも行います(作成しなおし)
「新しいアプリケーションパスワード名」はユーザー名と同じにすること
(別でもいいのかもしれませんが私は一緒にした時に成功したのでご参考まで)
③curlからPOSTしてみる
成功した。
推測:原因はなんだったのか
ユーザー名がなんかよくなかったのかな?と思いました(超推測)
私は今回、初めに作ったユーザーと新しく後から作ったユーザーの条件は同じです。
・ユーザー名=アプリケーションパスワード名
・権限グループ=管理者
しかし、初めのユーザーは何度パスワードを生成し直してもパスワードが間違ってると言われてしまいました。
5つのwordpressで同時にAPI使用の準備をしており、全てテストのために手作業でユーザー名とパスワードをBase64で処理してみました。
すると、今回失敗したwordpressのユーザーのパスワードだけBase64で処理すると文字列の長さと末尾の文字が違いました。
これはパスワードを生成し直しても何度やってもこのユーザーだけ、他の4つのWordpressのパスワードと違いました。
他の4つ(POST成功ブログ)xxxxxxxxxxxxxxxxxxxxxx= 失敗したブログ xxxxxxxxxxxx
こんな感じ。
そして、新しくユーザーを作成し、そのユーザーでパスワードを作成したところ他の4つと同じような形・見た目になり、成功しました。
他の4つ(POST成功ブログ)xxxxxxxxxxxxxxxxxxxxxx= 失敗したブログ新ユーザー xxxxxxxxxxxxxxxxxxxxxx=
成功の時はBase64で処理した時、末尾が「=」になっていましたが失敗した時はなっていませんでした。
これも推測ですが、「新しいアプリケーションパスワード名」からパスワードが生成されてます。新しく、同じ文字列を「新しいアプリケーションパスワード名」としてパスワードを作成すると、別のパスワードが生成されますが、パスワードの元になっていてパスワードと合致を確認する「新しいアプリケーションパスワード名」は文字列的に同じです。
。。。なんだかわかりづらくなってきましたが、パスワードを生成する元であり対となるユーザー名を変えてみるとうまく行くかもしれないよ、という情報でした。
お助け
APIの構造がわからない!といったときには公式ドキュメントを確認しましょう。見慣れるまでどこをどう見たらいいのかわからずちょっと苦労しましたが、慣れるとシンプルにわかりやすく書いてあります。
コメント