
要点: WooCommerceはすべての商品をカスタム投稿タイプとして
wp_postsに保存し、属性やメタデータ(価格、SKU、在庫)はwp_postmetaに保存します。カテゴリー、タグ、商品属性はwp_terms系のテーブル群に格納されます。表示設定や商品タイプのフラグは投稿メタのキーとして保存されます。
ステージングサイトに新しいWooCommerce商品を追加し、注文や取引などの他のデータに影響を与えずに、その新商品だけを本番サイトに反映したいと思うことがあるでしょう。WooCommerceがどのデータベーステーブルを使うかを把握しておくと、その移行は安全で予測可能になります。商品データを含む行だけをコピーし、注文の行はそのまま残せるからです。
この記事ではWooCommerceの商品データを保持するすべてのテーブルを整理し、日常的に重要となるカラムを説明し、よくある検索向けにコピーして使えるSQLを掲載します。部分的なプッシュの後にステージングでの商品変更が反映されなかった理由を不思議に思ったことがあるなら、その答えはほぼ必ず見落とされたテーブルです。
商品の保存場所を知ることが重要な理由
WooCommerceの商品がどこに保存されているかを理解しておくと、いくつかの実践的な場面で役立ちます:
- カスタムクエリ: レポートやカスタム機能のためにSQLクエリで商品データを取得する。
- データベースの最適化: 不要なデータをクリーンアップしてパフォーマンスを向上させる。
- トラブルシューティング: 商品詳細の欠落や誤りに関する問題を解決する。
- データ移行: 注文データや顧客データに触れずに、異なるWordPressインストール間で商品を移動する。
- 欠落した属性のデバッグ: 商品の色やサイズがフロントエンドに表示されない場合、どのタクソノミーテーブルを調べればよいかを知っていると、デバッグ時間を大幅に節約できます。
WooCommerceの商品データを保存する主要なテーブル
WooCommerceは商品データを主に次の2つのテーブルに保存します:
wp_posts– post typeがproductまたはproduct_variationの商品エントリを含みます。

wp_postmeta– 各商品の追加メタデータを保存し、post_id(商品ID)で関連付けられます。

テーブル概要
次の表は、各中心的な保存領域が何を保持しているか、そしてクエリや移行で最もよく必要となるカラムを対応づけたものです:
| テーブル | 保存する内容 | 主要なカラム |
|---|---|---|
wp_posts |
すべての商品とバリエーションを1行ずつ | ID、post_title、post_type = 'product'、post_status、post_modified |
wp_postmeta |
価格、SKU、在庫、重量、寸法 — 商品ごと・キーごとに1行 | post_id、meta_key、meta_value |
wp_terms |
カテゴリー名・タグ名、属性ラベル | term_id、name、slug |
wp_term_taxonomy |
タームがカテゴリー、タグ、属性のいずれかを宣言する | term_taxonomy_id、taxonomy、description |
wp_term_relationships |
各商品(object_id)をそのタームに結びつける |
object_id、term_taxonomy_id |
wp_termmeta |
タームに付随する追加のメタデータ | term_id、meta_key、meta_value |
wp_woocommerce_attribute_taxonomies |
グローバル属性の定義(例: 色、サイズ) | attribute_id、attribute_name、attribute_type |
実例: 商品とその価格・在庫レベルを取得する
次のクエリはwp_postsとwp_postmetaを結合して、単一商品の価格と在庫状況を取得します。12345をwp_postsの商品のID値に置き換えてください:
SELECT
p.ID,
p.post_title,
MAX(CASE WHEN pm.meta_key = '_price' THEN pm.meta_value END) AS price,
MAX(CASE WHEN pm.meta_key = '_stock_status' THEN pm.meta_value END) AS stock_status
FROM wp_posts p
JOIN wp_postmeta pm ON pm.post_id = p.ID
WHERE p.ID = 12345
AND p.post_type = 'product'
GROUP BY p.ID, p.post_title;
WooCommerce 9.x での当社のテストでは、_priceメタキーは、商品に明示的なセール価格がない場合でも常に値が入っており、通常価格を反映します。WP STAGINGサポートの経験では、最もよくある混乱の原因は、WooCommerceが商品のために独自の完全に別個のテーブルを使うという思い込みです。実際にはそうではありません。WooCommerceはカスタム投稿タイプの仕組みを通じてwp_postsを拡張しているため、すべての商品はpost_type値がproductの投稿行です。
クイックリファレンス: 必要なものを見つける
スキーマのドキュメント全体を読まなくても、正しいテーブルとカラムに直接たどり着けるよう、この表を使ってください:
| やりたいこと | テーブル | フィルター |
|---|---|---|
| すべての商品を一覧表示する | wp_posts |
post_type = 'product' |
| 商品の価格を調べる | wp_postmeta |
meta_key = '_price' |
| 商品のセール価格を調べる | wp_postmeta |
meta_key = '_sale_price' |
| 在庫状況を確認する | wp_postmeta |
meta_key = '_stock_status' |
| 商品のSKUを調べる | wp_postmeta |
meta_key = '_sku' |
| 商品のカテゴリーを一覧表示する | wp_term_relationships → wp_term_taxonomy → wp_terms |
taxonomy = 'product_cat' |
| 商品がおすすめかどうかを確認する | wp_term_relationships |
product_visibility内のタームスラッグfeatured |
| 商品のすべてのバリエーションを見つける | wp_posts |
post_type = 'product_variation'かつpost_parent = <商品ID> |
商品のカテゴリー、タグ、属性を保存するテーブル
中核となる商品テーブルに加えて、WooCommerceは商品タイプ、カテゴリー、サブカテゴリー、タグ、属性を管理するために、いくつかの分類体系(タクソノミー)関連のテーブルを使用します:
wp_terms– 商品のカテゴリーとタグを保存します。wp_termmeta– 商品タームのメタデータを保存します。wp_term_taxonomy– タクソノミーのタイプ(例: カテゴリー、タグ、属性)を定義します。wp_term_relationships– 商品とそのカテゴリーや属性を結びつけます。wp_woocommerce_termmeta– WooCommerce固有の追加タームデータを保存します。wp_woocommerce_attribute_taxonomies– 商品属性を特に管理します。
商品属性がフロントエンドで正しく表示されない場合は、wp_term_relationships(商品が正しいタームに結びついているか確認)とwp_term_taxonomy(taxonomyカラムが期待する属性スラッグと一致しているか確認)の両方をチェックしてください。
WooCommerceの商品タイプと表示設定
WooCommerceはproduct_typeタクソノミーを使ってさまざまな商品タイプを扱います。これには次のデフォルトオプションが含まれます:
simple– バリエーションのない標準商品。grouped– 関連商品の集まり。variable– 複数のバリエーションを持つ商品。external– 外部のウェブサイトで販売される商品。
WooCommerce 3以降では、product_visibilityという新しいタクソノミーが次を管理します:
- 検索とカタログでの表示 –
exclude-from-searchやexclude-from-catalogなどの用語を使用します。 - おすすめ商品 –
featuredという用語で識別されます。 - 在庫状況 – 在庫切れの商品を示すために
outofstockを使用します。 - 評価 –
rated-1からrated-5までの用語が商品レビューを分類します。
各商品属性はカスタムタクソノミーとして保存されるため、商品を動的に分類・フィルタリングしやすくなります。
よく行う操作
post typeごとに商品を安全に一括削除する
テスト用やシード投入済みのデータベースからすべての商品を削除するには、post typeでwp_postsを対象にし、同じ操作で関連するpostmetaの行もクリーンアップします:
-- Remove postmeta first (avoids orphaned rows)
DELETE pm
FROM wp_postmeta pm
JOIN wp_posts p ON p.ID = pm.post_id
WHERE p.post_type IN ('product', 'product_variation');
-- Then remove the product and variation rows
DELETE FROM wp_posts
WHERE post_type IN ('product', 'product_variation');
⚠️ 必ず最初にステージング用データベースに対して実行してください。これはすべての商品の行とそのメタデータを永久に削除します。注文テーブルには触れません。
WooCommerce商品をステージングから本番へ移行する
ステージング環境から注文ではなく商品だけをプッシュする場合、含めるべき最小限のテーブルの組み合わせは次のとおりです:
wp_posts—post_type IN ('product', 'product_variation')の行wp_postmeta—post_idが商品またはバリエーションに属する行wp_terms、wp_termmeta、wp_term_taxonomy、wp_term_relationships—product_cat、product_tag、およびカスタム属性タクソノミーに紐づく行wp_woocommerce_attribute_taxonomies— 移行元の環境にカスタムのグローバル属性定義がある場合
すべてのwp_woocommerce_order*およびwp_wc_order*テーブルはプッシュから除外してください。これらを含めると、本番の顧客注文がステージングのデータで上書きされてしまいます。
テスト商品データをリセットする
ステージングストアにテスト商品を投入した後は、上記のクエリでpost_type = 'product'の行を削除して、クリーンな状態にリセットします。WP STAGINGの選択的プッシュでは、含める/除外するpost typeを指定できるため、生のSQLを書かずに実際の商品をステージングから本番へプッシュできます。
本番サイトへ商品データをコピーする際のベストプラクティス
新しい商品をステージングサイトから本番サイトへ移動するときは、次の手順に従って注文と顧客データを保護してください:
- 本番データベースをバックアップする。 何か問題が起きてもすぐに復元できるよう、いかなるプッシュの前にも完全なスナップショットをエクスポートします。
- 関連するテーブルのみコピーする。
wp_posts、wp_postmeta、およびタクソノミー関連のテーブルに集中します。 - 注文関連のテーブルを除外する。 注文データを移行することを明確に意図していない限り、
wp_woocommerce_プレフィックスのテーブルは避けます。 - 移行ツールを使う。 WP STAGINGのようなプラグインは、環境間のURLの違いに対するシリアライズデータの検索・置換を含め、選択的なテーブルのプッシュを自動的に処理します。
- まずステージングで検証する。 プッシュを開始する前に、ステージングデータベースに対して読み取り専用クエリを実行し、期待される商品の行数を確認します。
まとめ
WooCommerceの商品は主にwp_postsとwp_postmetaに保存され、カテゴリー、属性、表示設定は関連するタクソノミーテーブルで管理されます。この構造を理解しておくと、本番ストアの運用に影響を与えずに商品データを安全に移行するのに役立ちます。
参考資料:
- 標準のテーブル: WordPressデータベースの説明
- 専用のテーブル: WooCommerceデータベースの説明