今年の1月から WooCommerce のパフォーマンス向上のために注文のDB(データベース)の設計を変更することが発表されており、5月に有志によるテストが実施され、様々な課題が見つかり、リリース時期の決定などが諸々発表されました。
今回の変更は大きな部分が関わるため、一般のユーザーにも分かりやすく、かつ開発者向けにも説明した記事を書くことにしました。一回では無理なので複数回の記事になりますので、ご了承ください。
そもそもの注文データ
まずは、そもそもの注文データがどういう形だったかというと、カスタム投稿タイプでした。
開発者でなければ、「カスタム投稿タイプ」の意味がわからないと思いますので、その説明をしたいと思います。
WordPress には基本的に2つの投稿タイプがあって、「記事(post)」と「固定ページ(page)」というものがあります。WordPress の柔軟性で素晴らしいDB構造の例として語られることもあるのですが、記事や固定ページと同じように様々な投稿を作る機能が実装されています。これは wp_posts と wp_postmeta というDBのテーブルに保存して、表示するような形になっています。
例えば、WooCommerce で言えば「商品ページ(product)」は基本的に固定ページと似たような要素があるので、カスタム投稿で作られています。
そして、商品と同じように「注文(shop_order)」もカスタム投稿タイプで作られています。
ただ、拡張性の上では重宝しているカスタム投稿タイプも、WooCommerce で注文データを使う点で以下のようなデメリットがありました。
- 注文が多くなると wp_posts と wp_postmeta にデータば増えすぎて DB のパフォーマンスが落ちる
- 注文の内容が増えると wp_postmeta が多くなり DB のパフォーマンスが落ちる
- ステージングサイトで商品登録をしたとしても、注文が入ると post_id が変わるので、コピーなどが大変。
- ステージングサイトを作成する際にコンテンツだけで良いのに、注文データも必ず移動しないといけない。
少なくとも田中は、上記をデメリットだと感じておりました。
注文用のDBテーブルを新たに追加して移行する
そして、今回新たに以下の4つのテーブルを足すことによって、postmetaの分散等も含めて変更することになっています。これによる DB パフォーマンスの向上は明らかです。
- wp_wc_orders: このテーブルには、最新のコア フィールドと重要なメタ キーが含まれています。
- wp_wc_order_addresses: このテーブルを使用して、注文に関連付けられた住所 (配送や請求など) を保存します。
- wp_wc_order_operational_data: このテーブルを使用して、内部の注文状態を維持するために使用するフィールドとフラグを格納します。 これらのフィールドへの変更は比較的頻繁に行われるため、これらのフィールドはコア注文テーブルとは別に保持しています。
- wp_wc_orders_meta: このテーブルは wp_postmeta テーブルと機能的に似ており、拡張機能が注文に関連付けられた 1 回限りのデータを保存できるようにします。
詳細なテーブル構成は The plan for the WooCommerce custom order table(January 17, 2022) の記事に掲載されているので、興味のある開発者の方はそれをご覧ください。
注文メモもコメントの DB から変更
また、合わせて管理者ページの注文詳細の右側に出ている注文メモも、投稿などのコメント機能 wp_comments と wp_commentmetaテーブルを使っていたので、これも新たなテーブルを作って対応することになりました。
- wp_wc_order_notes
- wp_wc_order_notes_meta
DB の大幅変更も CRUD Class に対応していれば問題はない(はず)
DBの変更というものはとても開発者泣かせな部分があります。場合によっては本当に大変なんです。
ただ、WooCommerce の今回の変更に関しては実は Version 3.0(2017年)の時から準備を進めていたものがあります。それが CRUD(Create, Read, Update, Delete) という仕組みです。
なので、プラグイン開発者が注文データの取得に関して CRUD の仕組みを使えば、勝手に CRUD 仕組みが新しいテーブルか古いテーブル形式かを確認して正しいデータを抜き出してくるのです。
ということで、技術的な話になりますが、WooCommerce の注文データに関して get_postmeta 関数などを使っているプラグインは新しいテーブルへの移行では大変な作業が発生するので、CRUD に完全移行しなければなりません。
完全移行は WooCommerce 8.0
そして、完全移行は WooCommerce 8.0 に完了させると発表されています。2022年10月現在発表されているスケジュールは以下です。
- 2022-11-08: HPOS の機能が完成し、ユーザーテスト用に WooCommerce 7.1 と共にリリース
- バグを修正し、開発者にプラグインを HPOS と互換性を持たせることを奨励し、ユーザーがステージングサイトでテストして問題を報告するよう奨励します。
- 2023-08-08: WooCommerce 8.0 では、HPOS がストアの基本設計になります: 投稿/postmeta テーブルとのデータ同期は無効になります。
なので、なんとなくわかるかと思いますが、WooCommerce 8.0 はメジャーアップデートになるはずです。
ということで、私も含めて WooCommerce 関連のプラグインの開発者やカスタマイズをしている人は少なくとも2023年8月8日までには対応を完了させる必要があります。私のプラグインも CRUD を多用しているのですが、一部完了していないので、出来るだけ10月中に完了させる予定です。そして、ユーザーテストを様々な状況下で行うことを考えています。
WooCommerce 8.0 (2023年8月)までは何もしなければ変化はない
ということで、一般ユーザーの皆さんにとっては2023年8月までは管理画面で設定を変更しない限り今まで通りに問題なくサイトが動きます。今回は表示ではなく顧客注文に関わる部分なので、見つけにくくなるので、 WooCommerce に関わるすべてのプラグインが CRUD 対応を完了していることを確認しない限り移行はできないと考えた方がいいかもしれません。特に開発が止まっているプラグインに関しては注意が必要です。
とりあえず、1回目の今回は HPOS の概要を説明しました。今後、WooCommerce の公式サイトからも順次詳細に関して告知があるということなので、それに合わせて私の方でも記事を書いて共有するようにいたしますので、確認していただければと思います。