在本文中,我们将向您展示WooCommerce如何在数据库中存储客户数据。我们将浏览WordPress中用于存储任何客户相关信息的主要WooCommerce数据库表。这包括客户名称、订单历史和账单地址等数据。
数据库是一个信息集合,其组织方式允许通过整体管理系统在必要时添加、检索或修改数据(通过数据库查询)。
WooCommerce Database Structure
在我们开始之前,重要的是要强调 WooCommerce 存储其 WooCommerce 数据的方式不是集中的。相反,这些信息可以存储在不同的数据库表之间。由于 WooCommerce 是一个在 WordPress 生态系统中运行的插件,因此它可以与现有的 WordPress 数据库一起使用,并且它正在引入自己的数据库表。(因此,如果您需要备份 WooCommerce 数据库,则需要从两个地方复制数据)。
这里也是 WooCommerce 插件引入的一些自定义表格的概述:
表名 | 描述 |
---|---|
actionscheduler_actions | 有关将由 Action Scheduler 执行的操作的信息。 |
actionscheduler_claims | 用于在后台执行任务 |
actionscheduler_groups | 操作调度程序组 |
actionscheduler_logs | 记录有关 Action Scheduler 执行的数据。 |
woocommerce_sessions | 存储客户会话数据,例如购物车内容数据。 |
woocommerce_api_keys | 用于 REST API 的 API 密钥。 |
woocommerce_attribute_taxonomies | 存储产品的全局属性分类名称。 |
woocommerce_downloadable_product_permissions | 可下载产品的产品访问权限。 |
woocommerce_order_items | 存储与订单关联的订单项。 |
woocommerce_order_itemmeta | 存储有关订单行项目的元数据。 |
woocommerce_tax_rates | 包含您在管理区域中定义的税率。 |
woocommerce_tax_rate_locations | 存储与税率相关的位置数据。 |
woocommerce_shipping_zones | 存储您在设置区域中创建的运输区域。 |
woocommerce_shipping_zone_locations | 存储与发货区域关联的位置。 |
woocommerce_shipping_zone_methods | 与您的运输区域相关联的运输方式。 |
woocommerce_payment_tokens | 客户支付令牌(由网关使用)。 |
woocommerce_payment_tokenmeta | 存储有关支付令牌的元数据。 |
woocommerce_log | 通用日志记录表(替代基于文件的日志记录)。 |
wc_webhooks | 存储已在商店中设置的任何 webhook。 |
wc_download_log | 记录用户对可下载产品的下载。 |
wc_product_meta_lookup | 索引订单元数据以加快请求的查找表。 |
wc_tax_rate_classes | 税类数据。 |
wc_reserved_stock | 存储预留库存数据。 |
例如,WooCommerce 产品数据存储在woocommerce_order_items
和woocommerce_order_itemmeta
表中。但这不是唯一可以找到 WooCommerce 产品数据的地方,您还可以在其他一些WordPress 数据库表中找到一些 WooCommerce 数据,例如:Comment(order_note)、postmeta (shop_order) 和Post (shop_order ID)。
这些数据库表不仅被您的 WooCommerce 商店使用,而且还被 WooCommerce 扩展和 WordPress 插件(如 WooCommerce Subscription、WooCommerce Memberships等)使用。
WooCommerce客户数据
WooCommerce 使用 WordPress 数据库表和自己的自定义表的组合来存储其数据。但是,WooCommerce 没有专门的表来存储客户数据。客户数据存储在不同的数据库表中,这有时可能使检索这些数据具有挑战性。
此外,根据客户是访客用户还是注册用户,有两种不同的方法可以检索客户数据:
- 基于订单的客户数据 – 这是为每个订单存储的客户数据,访客客户和注册用户均可使用
- WordPress 用户数据 – 此数据仅为注册的 WordPress 用户存储。您可能知道,一些标准的 WordPress 用户字段包括一般信息,例如电子邮件和注册日期。WooCommerce 还存储首选的计费/运输信息,可用于为将来的订单预先填写结帐字段。
基于订单的 WooCommerce 客户数据
WooCommerce 默认将客户数据存储为每个订单的一部分。无论客户是注册用户还是来宾客户,订单中都会附有客户数据的记录。
这意味着,如果一个客户在不更改其个人详细信息的情况下下达多个订单,则每个订单都会有一份客户详细信息的副本。虽然这会产生大量重复数据,但它还允许为每个订单分别提供不同的个人详细信息(例如帐单地址或联系电话)。
因此,为了找到特定订单的客户详细信息,我们首先需要查看订单并在订单和客户数据之间建立联系。WooCommerce 使用 自定义帖子类型 “shop_order”来存储订单。这意味着订单将存储在 wp_posts 数据库表中,其中 post_type列设置为 shop_order。因此,我们需要使用以下查询从数据库中加载 WooCommerce 订单:
SELECT ID, post_author, post_date, post_status, post_type FROM wp_posts WHERE post_type = ‘shop_order’ |
为简单起见,我们只加载了存储在帖子表中的最重要的订单字段,例如订单 ID 及其状态。结果如下所示:
订单 ID 是查找与订单相关联的客户数据的关键。WooCommerce 将大部分订单相关数据存储为发布元数据。因此,一旦我们有了订单 ID,就可以通过按订单 ID 搜索 wp_postmeta 表找到客户数据。
例如,如果我们想查找 ID 为 3313 的订单的客户数据,我们可以使用以下 mysql 数据库查询:
SELECT * FROM wp_postmeta WHERE post_id = 3313 |
这将为我们提供类似这样的信息(并非所有字段都显示在此屏幕截图中):
正如您从这个示例中看到的,每个客户字段都存储为订单的 post meta,其中 meta_key 是字段名称, meta_value 是客户字段的实际值。存储的一些主要客户相关数据是计费和运输信息,例如:
- _billing_first_name / _shipping_first_name
- _billing_last_name / _shipping_last_name
- _billing_company / _shipping_company
- _billing_address_1 / _shipping_address_1
- _billing_address_2 / _shipping_address_2
- _billing_city / _shipping_city
- _billing_state / _shipping_state
- _billing_postcode / _shipping_postcode
- _billing_country / _shipping_country
- _billing_email
- _计费电话
- _customer_user
例如,如果您想查找所选订单的客户的一般联系方式,您可以编写如下查询:
SELECT * FROM wp_postmeta WHERE post_id = 3313 AND meta_key IN (‘_billing_first_name’, ‘_billing_last_name’, ‘_billing_email’, ‘_billing_phone’, ‘_billing_city’) |
这将给我们以下结果:
总而言之,下图说明了客户数据是如何存储在订单中的:
WordPress 用户数据
如果您在 WooCommerce 中禁用了“访客结帐”选项,则会为每个客户创建一个 WordPress 用户。在这种情况下,WooCommerce 将使用 WordPress 用户表来存储客户信息:
- wp_users – 此表将包含一般用户信息,例如电子邮件地址和注册日期
- wp_usermeta – 首选的计费/运输信息。基本上,WooCommerce 将订单账单/运输信息保存为用户元数据。通过这种方式,这些信息将可用于未来的订单和更快的结账过程。
在前面的示例中,您可能已经注意到订单元包含一个带有键 _customer_user的字段:
这就是 WooCommerce 将订单链接到用户的方式。当客户下订单时,此字段的值将设置为 0。否则,它将包含 WordPress 用户的 ID,在本例中为 11。
现在,让我们看看我们为用户存储了什么样的数据。正如我们前面提到的, wp_users表存储了一般的 WordPress 用户数据。可以使用以下查询加载它:
SELECT ID, user_email, user_registered FROM wp_users WHERE ID = 11 |
这给出了以下结果:
然而,大多数客户信息都存储在 wp_usermeta 表中。如果我们查询用户元表以向我们显示所选用户的所有结果:
SELECT * FROM wp_usermeta WHERE user_id = 11 |
我们会发现 wp_postmeta表中存在的许多订单字段也为用户保存。这包括所有账单和运输信息:
您可能会注意到,用户字段键与订单字段键相同,唯一的区别是它们前面没有下划线。例如,订单中客户名字的元键是 _billing_first_name 而用户元键是 billing_first_name。
下图说明了所有这些客户数据如何在数据库中连接:
搜索 WooCommerce 数据库
搜索 WooCommerce 数据库时没有单一的方法。您的数据库查询将取决于您的要求以及您需要加载和搜索的数据。因此,需要考虑的一些方面是:
- 您的 WooCommerce 设置是否允许访客用户或仅注册用户
- 您是否需要将订单链接到客户搜索结果
- 结果中需要哪些字段
由于数据库中数据的结构方式,您需要在搜索结果中加载的客户数据越多,您需要加入查询的表就越多。
让我们看一些例子。
1. 搜索基于订单的数据
正如我们已经讨论过的,基于订单的客户数据可供注册客户和来宾客户使用。因此,当您的商店允许客人结账时,我们建议使用这种搜索方法。
假设我们要按计费城市搜索客户。我们的查询将需要以下元素:
- 查询 wp_posts 表并从类型 shop_order 加载帖子。这将确保我们将仅搜索车间订单的元记录(而不是可能使用相同元键的其他帖子类型)。我们还将过滤订单以仅显示已完成的订单,因为我们不想搜索失败或取消的订单。
- 加入 wp_postmeta以将 _billing_city作为单独的列加载到结果中
- 再次 加入 wp_postmeta以将_billing_email作为单独的列加载到结果中。这样我们就可以看到每条记录的客户邮箱
- 在 WHERE 子句和条件中按计费城市过滤订单
- 按电子邮件地址对记录进行分组,这样我们每个客户就有一个记录。如果您的所有客户都是注册用户,我们建议改为按 _customer_id元字段对记录进行分组,因为这是识别客户的更准确方法。
这就是查询的样子:
SELECT MAX(orders.post_date) AS ‘last order date’, orders.post_status AS ‘status’, cities.meta_value AS ‘city’, emails.meta_value AS ’email’ FROM wp_posts AS orders INNER JOIN wp_postmeta AS cities ON orders.ID = cities.post_id AND cities.meta_key = ‘_billing_city’ LEFT JOIN wp_postmeta AS emails ON orders.ID = emails.post_id AND emails.meta_key = ‘_billing_email’ WHERE orders.post_type=’shop_order’ AND orders.post_status = ‘wc-completed’ AND cities.meta_value = ‘Chicago’ GROUP BY emails.meta_value |
这将产生以下结果:
2. 搜索 WooCommerce 用户数据
现在让我们重做前面的示例,但这次我们将搜索用户元数据,而不是订单元数据。尽管过程听起来很相似,但在这种情况下,WooCommerce 数据库查询将完全不同。这是我们需要做的:
- 我们的基表将是 wp_users 表。我们将从该表中加载用户 ID 和电子邮件地址
- 在_customer_user字段上加入 wp_postmeta表,该字段包含用户的 ID
- 加入 wp_posts表,这样我们就可以确保我们只加载已完成车间订单的记录
- 加入 wp_usermeta表以将 billing_city作为单独的列加载到结果中
- 按城市列过滤结果
- 按用户 ID 对结果进行分组,为每个客户显示一条记录
这是构建此数据库查询的一种方法的示例:
SELECT users.ID, users.user_email, MAX(orders.post_date) AS ‘last order date’, orders.post_status AS ‘status’, cities.meta_value AS ‘city’ FROM wp_users AS users INNER JOIN wp_postmeta AS customer_ids ON users.ID = customer_ids.meta_value AND customer_ids.meta_key = ‘_customer_user’ INNER JOIN wp_posts AS orders ON customer_ids.post_id = orders.ID AND orders.post_type=’shop_order’ AND orders.post_status = ‘wc-completed’ INNER JOIN wp_usermeta AS cities ON users.ID = cities.user_id AND cities.meta_key = ‘billing_city’ WHERE cities.meta_value = ‘Chicago’ GROUP BY users.ID |
结果将类似于上一个示例中的结果:
希望本文能帮助您了解WooCommerce如何存储客户数据,您也许还向看看5个最佳拖放式WordPress网页生成器比较或者27个最好的酒店WordPress主题与漂亮的设计。