Woocommerce SQL查询显示本周销售的产品?

时间:2014-03-06 17:14:37

标签: mysql sql wordpress woocommerce

Woocommerce有一个报告工具,可以显示过去7天内销售的顶级产品。但它只显示了前12个产品。

我想创建一个SQL查询,向我展示过去7天内销售总数的所有产品,而不仅仅是前12名。

以前有人这样做过吗?

3 个答案:

答案 0 :(得分:1)

WooCommerce大量借鉴了WordPress本身存储数据的方式:帖子用作基本数据对象,其中包含所有自定义帖子共有的几列。特定于自定义类型的任何唯一数据都将作为键值对存储在post_meta中。这意味着没有干净的列或表格可查询订单行项目,SKU,行项目价格等。

值得一提的是,对于订单,WC不会存储产品,而会存储订单项。这是因为您可以向订单中添加非产品的费用,常规订单项以及可能的其他内容。另外,由于顾客可能有折扣或产品价格可能发生变化,因此WC需要在订购时存储价格。

WooCommerce使用WordPress postmeta表和其自己的order_itemmeta表。这是如何分解的:

  • 订单本身存储为wp_posts表中的自定义帖子类型“ shop_order”
  • 订单行项目存储在名为wp_woocommerce_order_items的关系表中
  • 订单项详细信息作为键值对存储在wp_woocommerce_order_itemmeta
  • 最终订单详细信息存储在wp_postmeta表中

因此,假设您要查看一段时间内的所有订单项,并且想知道诸如项目标题,价格及其所属顺序之类的信息。为此,您必须联接多个表,然后对所需的特定字段对元表进行联接或子查询。在下面的示例中,我使用了子查询,因为我认为它们更具可读性,请注意,JOIN很有可能会更快。

SELECT
-- Choose a few specific columns related to the order
o.ID as order_id,
o.post_date as order_created,

-- These come from table that relates line items to orders
oi.order_item_name as product_name,
oi.order_item_type as item_type,

-- We have to subquery for specific values and alias them. This could also be done as a join
(SELECT meta_value FROM wp_woocommerce_order_itemmeta WHERE order_item_id = oi.order_item_id AND meta_key = "_product_id") as product_id,
(SELECT meta_value FROM wp_woocommerce_order_itemmeta WHERE order_item_id = oi.order_item_id AND meta_key = "_product_variation_id") as variant_id,
(SELECT meta_value FROM wp_woocommerce_order_itemmeta WHERE order_item_id = oi.order_item_id AND meta_key = "_qty") as qty,
(SELECT meta_value FROM wp_woocommerce_order_itemmeta WHERE order_item_id = oi.order_item_id AND meta_key = "_fee_amount") as fee,
(SELECT meta_value FROM wp_woocommerce_order_itemmeta WHERE order_item_id = oi.order_item_id AND meta_key = "_line_subtotal") as subtotal,
(SELECT meta_value FROM wp_woocommerce_order_itemmeta WHERE order_item_id = oi.order_item_id AND meta_key = "_line_subtotal_tax") as tax,
(SELECT meta_value FROM wp_woocommerce_order_itemmeta WHERE order_item_id = oi.order_item_id AND meta_key = "_line_total") as total,
(SELECT meta_value FROM wp_woocommerce_order_itemmeta WHERE order_item_id = oi.order_item_id AND meta_key = "_tax_class") as tax_class,
(SELECT meta_value FROM wp_woocommerce_order_itemmeta WHERE order_item_id = oi.order_item_id AND meta_key = "_tax_status") as tax_status,

-- This wasn't specifically mentioned in the question but it might be nice to have some order meta data too
(SELECT meta_value FROM wp_postmeta WHERE post_id = o.ID AND meta_key = "_order_total") as order_total,
(SELECT meta_value FROM wp_postmeta WHERE post_id = o.ID AND meta_key = "_customer_user") as user_id

FROM wp_posts o
LEFT JOIN wp_woocommerce_order_items oi ON oi.order_id = o.id
LEFT JOIN wp_posts p ON p.ID = oi.order_item_id
WHERE o.post_type = "shop_order"

如您所见,您想对每个 订单项字段进行子查询/联接,以使这些查询非常昂贵。我怀疑WC由于这个原因限制了查询的数量。

此答案已针对WC版本3.3.4进行了测试。

答案 1 :(得分:0)

只需使用过滤器修改现有查询,而不是写入新查询:

woocommerce_reports_get_order_report_query

似乎报告页面的所有部分的限制都是相同的,因此更改此设置将影响具有limit子句的所有查询。我不会对产品数量走得太远,因为对列出的每个产品都会执行新的SQL查询。

add_filter( 'woocommerce_reports_get_order_report_query', function( $query ) 
{
    if ( isset( $query['limit'] ) ) $query['limit'] = 'LIMIT 20';  <-- set limit to 20 products
    return $query;  
});

答案 2 :(得分:-1)

只是一个猜测

....WHERE dateColumn BETWEEN DATE_SUB(NOW(),INTERVAL 1 WEEK) AND NOW()

添加更多信息,以获得更准确的答案。

相关问题