WordPressで遊ぶ
静的HTMLしか書けないおじさんからしたらなんで動的にページが生成できるのかサッパリわからんのですわ。ぼくいんふらえんじにあだしゆるして。
自動投稿したい!
ググるとREST APIというものがあるらしい。なんでもHTTPでうまい具合にPOSTすると記事が自動で投稿できるらしい。すげぇ。HTTPのPOSTでもう頭痛がしそうなんですけど curl -X POST https://~ でPOSTできる。POSTしてどうなるのかわからんけどWebサーバはすげぇ。
POSTするには認証が必要らしい。
そ、そうなのか~。
ググるとApplication Passwordとか出てくるけど今回は検証環境だしローカル環境なのでHTTPかつBasic認証でいいんですよ。
なんかみんなエラそうにApplication Passwordとか書いてるけどそれって第二のパスワードなだけだから~!!!どっちも平文でやりとりするのでインフラエンジニア的には何が違うのかわからない。
ということでBasic認証を使います。ヘッダのAuthenticateセクションにIDとパスワード入れるだけでOK。curlなら -u id:password ね。
REST APIは標準で有効になっている。
昔はプラグインが必要だったけど、今は標準で入ってるらしい。いつからかは知らないけど2022年4月のlatestでダウンロードしたのには入っていました。
API自体は標準で入っているがBasic認証を使うためのプラグインは入っていない。なんだこの欠陥システム???
というわけで入れます。ここのが一応公式イチオシのよう。
Webの管理画面から検索しても出てこないので、直接gitからcloneするか、zipを落としてきてください。
プラグインの置き場所は [wordpress__root]/wp-content/plugin/です。
[wordpress_root]は複雑な処理してなければwp-config.phpがあるとこね。unzipで/wp-content/plugin/に展開してください。プラグイン名のディレクトリはunzipが勝手に作るはずですがplugin直下にはおかないでね。
そしてアクティベート。この辺はもうこなれたもんよ。この人の名前は「wp-basic-auth」です。
wp-cli plugin activate wp-basic-auth
zipのままならwp plugin install [zipファイルパス]でもいけます。
wp-cli plugin install --activate [zip_file_path]
その前にやっておくこと
フォルダのパーミッション
設定しないとメディアのアップロードができない。
自動投稿に画像もつけたいので、メディアはアップロードできるようにしておきたい。
Webサイトの仕組みはわからんけど権限ないフォルダに書き込みできないことはわかる。
フォルダの所有者をnginx、グループはuserにした。userでファイルを編集したかったからです。
所有者はrwx、所有グループはなんでも、everyoneはディレクトリがr-x、ファイルはr--。伝われ。
はぁ~~?パーミッション変えてもアップロードできんのやが??!!
ちょっと調べるとphp-fpmの実行ユーザが操作権限を持ってないといけないらしい。
php-fpmってなんや?!?!?!!!?!???
ごめんそんなもの入れた記憶ないんですが…
php関連なのはわかるけど、fpmって何?????????誰これインストールしたの?????
systemctlすると、たしかにphp-fpmというサービスがあった。とりあえずなんか動いてるらしい。
もうちょっと調べると、実はあのすごいWebサイトを作っているのはnginxではなくてphp-fpmらしい。nginxはプラットフォーム的な感じのよう。
まあよくわからんけど、実のところはアップロードされたメディアをnginxがサーバに書き込んでいるわけではなく、php-fpmというものが書き込んでいるらしい。
じゃあさっきファイルの所有者をnginxにしたの意味なかったジァャン…
そこで、php-fpmの実行ユーザをnginxにしてしまえば万事解決。
乱暴だなぁ
ここのサイトを参考に変えました。
乱暴にまとめると、
・/etc/php-fpm.d/[なまえ1].conf の中の listen の値
・/etc/nginx/conf.d/[なまえ2].conf の upstream セクション内 server unix: の値
が一致するものをペアとし、
・/etc/php-fpm.d/[なまえ1].conf の中の user
・/etc/php-fpm.d/[なまえ1].conf の中の group
が先ほど設定したパーミッションで権限を持つユーザ/グループであること。
私の場合は、/etc/php-fpm.d/www.confの中のuser、groupをともにnginxにしました。
変更前はapacheになっていました。ナルホドネ?
これにて完了。
ACF
自動投稿したいってことはな?キーになるメタ情報をわんさか入れて投稿したいわけですよ。
標準でカスタムフィールドたるものがあるらしいですが、私の画面には無かったので、有名なプラグインであるAdvanced Custom Fields、通称ACFを入れました。
インストールはWeb画面で出来そうでした。私の環境ではSSLのエラーが出るのでzipをwgetしてきてwp-cliしました。
カスタムフィールドを作る
普通にWeb画面から作った。左ペインの下のほうに「Custom Fields」ってのが追加されてたからそこをぽちぽちして作りました。
カスタムフィールドにAPI経由で値を入れる
ここで死ぬほど苦労した。死んだ。
たどり着いた結論;
記事の投稿と同時にACFのカスタムフィールドを更新することはできない。記事の自動投稿に成功すると記事idが含まれたjsonが返ってくるので、そのjsonから記事idを取り出してその記事のAPIのエンドポイントにPOSTしACFのフィールドを1個ずつ更新していく。なお、ACFのフィールドを更新するには追加のプラグインが必要。
なんかそれっぽいこと言ってる…
もうちょっとかみ砕くと、記事ID=OID、記事を更新するときは必ずOIDを指定する(そういう決まり)、OIDをURLに入れてPOSTするときにACFのフィールドの値も入れてあげる。
もっとわかりやすくcurlで話すか。
記事の投稿
curl -X POST -u id:password -d '{ "title": たいとる, "content": なかみ }' http://example.local/directory/wp-json/wp/v2/posts/
成功するとこんなjsonが返ってくる。(雑)
{ "id": 1 ~}
ACFのフィールドを更新する。今回の記事IDは「1」でした。
フィールド名「key」に、valueという値を入れたいときの例です。
curl -X POST -u id:password -d "fields[key]='value' " http://example.local/directory/wp-json/acf/v3/posts/1/
いま http://example.local/directory/ がwordpressのルートの想定でやっているのですけど、URLの後ろのほうが「/wp-json/wp/v2/posts/」から「/wp-json/acf/v3/posts/」に変わったの気づきました?!
タイトルとか中身なら「/wp-json/wp/v2/posts/」に記事IDつけてPOSTしてあげれば更新できるんだけど、ACFの値はそうはいかない。(クソ)
なので、「/wp-json/acf/v3/posts/」をプラグインで追加してあげて、更新してあげるのです。
ちなみに私は登録したいキーが2つあったのですが、2ついっぺんに登録(更新)する方法はわかりませんでした。なので2行かきました。
プラグインを追加する
お好きな方法でどうぞ。名前はWeb画面で見れば「ACF to REST API」、CLIから見れば「acf-to-rest-api」でした。
失敗談: 投稿する記事のjsonに入れちゃえばイイカンジに値を入れれちゃうんじゃな~い?
わかりやすく説明するとこうね。だってcurlでGETするとこうやって返ってくるんだもん。
{
'title': title,
'content': content,
'status': 'private',
'format': 'standard',
'acf': {
'key1': value1,
'key2': value2
}
}
だめでした。
ちなみにACFの設定でkey1やkey2を必須フィールドにしてると、空で新規投稿しようとしたときに失敗する。なんだこのクソシステム…