ついでなので WordPress blog も REST API を使ってシングルページ化した。
もはや WordPress とは… という感じであるが、なかなか快適である。
使用しているライブラリは onsen ui、レイアウトに masonry。
あとは TypeScript で jQuery のベタ打ちである。
私はとにかく JavaScript が嫌いで極力触れるのは避けてきたのだが、TypeScript のおかげでクライアント開発はかなり楽になった。ありがとう Miscrosoft。
onsen ui も初めて使ったが非常によくできているので、そのうち褒めたたえる記事を書きたい。
WordPress REST API を使っての実装上で困った点。
- リクエストパラメータの before after 日時がタイムゾーンを考慮していない。
- 月毎のアーカイブが取得できない。
before after 日時がタイムゾーンを考慮していない
/wp-json/wp/v2/posts
の before, after
パラメータにUTCタイムゾーンで渡しても、WordPressの設定タイムゾーン(Asia/Tokyo)として解釈されてしまう。
サーバのタイムゾーン(WordPressの設定という意)とクライアントのタイムゾーンは一致しないので、内部ではUTCで情報を持っておき、表示するときにクライアントのタイムゾーンに合わせて表示してやる。というのが現代的な考え方であるが、WordPressはそうなっていない。
/wp-json/wp/v2/posts
が返すjsonにはUTCとローカルタイムの両方が入ってるので、ページ処理を行うには問題無いが、指定期間のアーカイブを取得したいという場合に問題となる。
例えば2017年11月10日のアーカイブを取得するとき、その10日とは誰にとっての10日か。投稿者なのか見ている人なのか。投稿者が日本在住で閲覧者がヨーロッパ在住であれば、10日の意味する期間は異なるのだ。
これは次の項目とも関連してくる。
月毎のアーカイブが取得できない
wp_get_archives()
に相当する機能が REST API には無い。
しょうがないので取得するRESTエンドポイントを作るわけだが、wp_get_archives()
はカスタマイズのしづらさで悪名高く、サーバ側で月と件数を取得するのもめんどくさい状況である。
解決策はいろいろあるだろうが、wp_get_archives()
が返す HTML を REST で丸投げして、クライアントサイドでいい感じに加工するという手法で実装した。やったね jQuery が使えるよ!
ここで問題となるのがタイムゾーンである。
wp_get_archives()
の結果を利用しているということは、WordPressのタイムゾーン設定に従った月毎アーカイブであり、クライアントが異なるタイムゾーンの場合、月別アーカイブに表示される内容はクライアント時間で見れば正しくない。
とりあえず月毎アーカイブとは投稿者時間のアーカイブだということで放置してあるが、タイムゾーンが異なるところで見ていると、月初・月終の記事は違う月に出てくる場合がある。