WooCommerce商品はWordPressデータベースのどこに保存されているか?

WooCommerceはデータベースのどこに商品データを保存しているか

要点: 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_postsテーブルを使ってWooCommerceの商品詳細を見つける
  • wp_postmeta – 各商品の追加メタデータを保存し、post_id(商品ID)で関連付けられます。
wp_postmetaテーブルを使って商品詳細を見つける

テーブル概要

次の表は、各中心的な保存領域が何を保持しているか、そしてクエリや移行で最もよく必要となるカラムを対応づけたものです:

テーブル 保存する内容 主要なカラム
wp_posts すべての商品とバリエーションを1行ずつ IDpost_titlepost_type = 'product'post_statuspost_modified
wp_postmeta 価格、SKU、在庫、重量、寸法 — 商品ごと・キーごとに1行 post_idmeta_keymeta_value
wp_terms カテゴリー名・タグ名、属性ラベル term_idnameslug
wp_term_taxonomy タームがカテゴリー、タグ、属性のいずれかを宣言する term_taxonomy_idtaxonomydescription
wp_term_relationships 各商品(object_id)をそのタームに結びつける object_idterm_taxonomy_id
wp_termmeta タームに付随する追加のメタデータ term_idmeta_keymeta_value
wp_woocommerce_attribute_taxonomies グローバル属性の定義(例: 色、サイズ) attribute_idattribute_nameattribute_type

実例: 商品とその価格・在庫レベルを取得する

次のクエリはwp_postswp_postmetaを結合して、単一商品の価格と在庫状況を取得します。12345wp_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_relationshipswp_term_taxonomywp_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_taxonomytaxonomyカラムが期待する属性スラッグと一致しているか確認)の両方をチェックしてください。

WooCommerceの商品タイプと表示設定

WooCommerceはproduct_typeタクソノミーを使ってさまざまな商品タイプを扱います。これには次のデフォルトオプションが含まれます:

  • simple – バリエーションのない標準商品。
  • grouped – 関連商品の集まり。
  • variable – 複数のバリエーションを持つ商品。
  • external – 外部のウェブサイトで販売される商品。

WooCommerce 3以降では、product_visibilityという新しいタクソノミーが次を管理します:

  • 検索とカタログでの表示exclude-from-searchexclude-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_postspost_type IN ('product', 'product_variation')の行
  • wp_postmetapost_idが商品またはバリエーションに属する行
  • wp_termswp_termmetawp_term_taxonomywp_term_relationshipsproduct_catproduct_tag、およびカスタム属性タクソノミーに紐づく行
  • wp_woocommerce_attribute_taxonomies — 移行元の環境にカスタムのグローバル属性定義がある場合

すべてのwp_woocommerce_order*およびwp_wc_order*テーブルはプッシュから除外してください。これらを含めると、本番の顧客注文がステージングのデータで上書きされてしまいます。

テスト商品データをリセットする

ステージングストアにテスト商品を投入した後は、上記のクエリでpost_type = 'product'の行を削除して、クリーンな状態にリセットします。WP STAGINGの選択的プッシュでは、含める/除外するpost typeを指定できるため、生のSQLを書かずに実際の商品をステージングから本番へプッシュできます。

本番サイトへ商品データをコピーする際のベストプラクティス

新しい商品をステージングサイトから本番サイトへ移動するときは、次の手順に従って注文と顧客データを保護してください:

  1. 本番データベースをバックアップする。 何か問題が起きてもすぐに復元できるよう、いかなるプッシュの前にも完全なスナップショットをエクスポートします。
  2. 関連するテーブルのみコピーする。 wp_postswp_postmeta、およびタクソノミー関連のテーブルに集中します。
  3. 注文関連のテーブルを除外する。 注文データを移行することを明確に意図していない限り、wp_woocommerce_プレフィックスのテーブルは避けます。
  4. 移行ツールを使う。 WP STAGINGのようなプラグインは、環境間のURLの違いに対するシリアライズデータの検索・置換を含め、選択的なテーブルのプッシュを自動的に処理します。
  5. まずステージングで検証する。 プッシュを開始する前に、ステージングデータベースに対して読み取り専用クエリを実行し、期待される商品の行数を確認します。

まとめ

WooCommerceの商品は主にwp_postswp_postmetaに保存され、カテゴリー、属性、表示設定は関連するタクソノミーテーブルで管理されます。この構造を理解しておくと、本番ストアの運用に影響を与えずに商品データを安全に移行するのに役立ちます。

参考資料:

関連記事

Rene Hermenau

著者: Rene Hermenau

著者について: René Hermenau は WP STAGING の創設者です。WordPress のバックアップ、ステージング、移行、データベース処理、安全なデプロイメントワークフローに取り組んでいます。